I'm currently attempting to modify Vanitygen to suit a particular purpose. However, I'm running into an issue with "impossible" addresses. For example, from the stock Vanitygen available on Github I get this output:
./vanitygen -T mR Prefix 'mR' not possible Hint: valid testnet addresses begin with "m" or "n"
While the following works:
./vanitygen -T m Difficulty: 1 Pattern: m Address: mh8e8yUtsmhCm6PTkuHV85ozEV5iNibmbp Privkey: ***************(doesn't matter)
I get similar results for this set of options:
./vanitygen -F script 3Ro Prefix '3Ro' not possible Hint: valid bitcoin script addresses begin with a "3"
./vanitygen -F script 3R Difficulty: 836 Pattern: 3R P2SHAddress: 3R1jUHTrESWgCC812LrgwHErc9Y3UL7XeL Address: *********(doesn't matter) Privkey: *********(doesn't matter)
So, I'm trying to determine why Vanitygen is saying that these particular prefixes are not possible. For both of these failures, the failure occurs within get_prefix_ranges(). However, this isn't a programming question, necessarily. What I'm trying to uncover is some underlying principle that I may be missing that would render these particular prefixes impossible.
Perhaps a couple of questions may help me answer this myself:
When Base58Check encoding the version+publickey+checksum, how exactly is the encoding processed? Is the input broken into 6-byte words and then converted into Base58 format (seems implausible because you could theoretically have something like 111111 (binary) in the checksum that would be > 58). Or, is the whole version+pubkey+checksum converted to a BigNumber and then essentially Mod 58'd for each character.
If the latter is the case (which seems probable), in what order does this occur? Using the example of 80FAFBFC (2163932156 decimal):
x = 2163932156 result = x % 58 = 6 x = floor(x / 58) = 37309175 result = x % 58 = 37 x = floor(x / 58) = 643261 result = x % 58 = 41 x = floor(x / 58) = 11090 result = x % 58 = 12 x = floor(x / 58) = 191 result = x % 58 = 17 x = floor(x / 58) = 3 result = 3 result = [6, 37, 41, 12, 17, 3] Convert to Base58 values: result = [7, e, i, D, J, 4]
Would the result be displayed as: 7eiDJ4 or 4JDie7?