Vanitygen:不可能的地址?
我目前正在嘗試修改 Vanitygen 以適應特定目的。但是,我遇到了“不可能”地址的問題。例如,從 Github 上可用的 Vanitygen 庫存中,我得到以下輸出:
./vanitygen -T mR Prefix 'mR' not possible Hint: valid testnet addresses begin with "m" or "n"
雖然以下工作:
./vanitygen -T m Difficulty: 1 Pattern: m Address: mh8e8yUtsmhCm6PTkuHV85ozEV5iNibmbp Privkey: ***************(doesn't matter)
對於這組選項,我得到了類似的結果:
./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)
所以,我試圖確定為什麼 Vanitygen 說這些特定的前綴是不可能的。對於這兩種失敗,失敗都發生在 get_prefix_ranges() 中。但是,這不一定是程式問題。我試圖揭示的是一些我可能遺漏的基本原則,這些原則會使這些特定前綴變得不可能。
也許有幾個問題可以幫助我自己回答這個問題:
Base58Check對version+publickey+checksum進行編碼時,編碼到底是怎麼處理的?輸入是否被分解為 6 字節的單詞,然後轉換為 Base58 格式(似乎不合理,因為理論上您可以在校驗和中具有類似 111111(二進制)的內容,該值將大於 58)。或者,是否將整個版本+pubkey+校驗和轉換為 BigNumber,然後對每個字元進行本質上的 Mod 58’d。
如果是後者(這似乎是可能的),這種情況發生的順序是什麼?以 80FAFBFC(十進制 2163932156)為例:
x = 2163932156 result[0] = x % 58 = 6 x = floor(x / 58) = 37309175 result[1] = x % 58 = 37 x = floor(x / 58) = 643261 result[2] = x % 58 = 41 x = floor(x / 58) = 11090 result[3] = x % 58 = 12 x = floor(x / 58) = 191 result[4] = x % 58 = 17 x = floor(x / 58) = 3 result[5] = 3 result = [6, 37, 41, 12, 17, 3] Convert to Base58 values: result = [7, e, i, D, J, 4]
結果會顯示為:7eiDJ4 還是 4JDie7?
這是由於“版本”字節和使用 base58 生成比特幣地址的方式。
該過程非常簡單:
- 版本字節
- 公鑰的sec格式的SHA256(稱為HASH160)的RIPEMD160(這部分不用太擔心,只要知道它有20個字節長)
- 校驗和(4 個字節長)
將這些連接起來,您將得到一個 1 + 20 + 4 = 25 字節的字元串,然後將其編碼為 base58 字元串以形成比特幣地址。請注意,第 2 部分或第 3 部分幾乎可以是任何內容,但版本字節特定於網路。
對於您的情況,testnet 的版本字節是 0x6f。
計算 base58 的文件化程序在此處。
這是一個簡單的 python 程序來展示這是如何完成的:
alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" def b58(x): a = "" while x > 0: x, r = divmod(x,58) a += alphabet[r] return a[::-1] print b58(0x6f0000000000000000000000000000000000000000) print b58(0x6fffffffffffffffffffffffffffffffffffffffff)
這個程序的結果是這樣的:
mfWxJ45yp2SFn7UciZyNpvDKrzbhuzkU7H n4rZHAPGXCu8bYchjzJhK3V7VVredELJRc
這實際上是測試網中可能的地址範圍。這是因為之前的任何內容
mfWxJ45yp2SFn7UciZyNpvDKrzbhuzkU7H
都會導致第一個字節為 0x6e,之後的任何內容n4rZHAPGXCu8bYchjzJhK3V7VVredELJRc
都會導致第一個字節為 0x70。執行 vanitygen 應確認:$ vanitygen -T mfWxJ3 Prefix 'mfWxJ3' not possible $ vanitygen -T mfWxJ4 [...]
出於這個原因,在生成虛地址時記住版本號很重要。