Vanitygen

Vanitygen:不可能的地址?

  • January 20, 2019

我目前正在嘗試修改 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 生成比特幣地址的方式。

該過程非常簡單:

  1. 版本字節
  2. 公鑰的sec格式的SHA256(稱為HASH160)的RIPEMD160(這部分不用太擔心,只要知道它有20個字節長)
  3. 校驗和(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
[...]

出於這個原因,在生成虛地址時記住版本號很重要。

引用自:https://bitcoin.stackexchange.com/questions/35929