Python

如何從python中的12個單詞生成菌絲體地址

  • November 18, 2017

我正在嘗試重新生成我的菌絲體錢包已生成的接收地址(並更改地址)。

到目前為止,我已經使用了 Trezor 的 BIP39 實現從 12 個單詞中生成熵,以及我之前使用過的 BIP32 實現(成功地生成了與比特幣核心相同的地址,它使用不同的子密鑰方案但來自 tpub,不是來自熵),從熵中產生密鑰。

這是程式碼:

from bip32utils import BIP32Key
from bip32utils import BIP32_HARDEN
import bip39

wallet_generator = bip39.Mnemonic('english')
entropy = wallet_generator.to_entropy('12 words here')
key = BIP32Key.fromEntropy(entropy)
account_number = 0
i = 0
print key.ChildKey(44 + BIP32_HARDEN) \
        .ChildKey(0 + BIP32_HARDEN) \
        .ChildKey(account_number + BIP32_HARDEN) \
        .ChildKey(0) \
        .ChildKey(i) \
        .Address()

我正在嘗試遵循此處描述的 BIP44 方案。

我得到了一個密鑰,但不是我第一次菌絲體交易中出現的那個。我試圖iaccount_number0 到 9 搜尋前 100 個,但無濟於事。bip32gen從命令行使用也不會產生正確的密鑰:

echo YOUR_ENTROPY_IN_HEX_HERE | \
   bip32gen -v \
   -i entropy -f - -x \
   -o addr -F - -X \
   m/44h/0h/0h/0/0

entropy轉換為十六進制print ''.join('{:02X}'.format(x) for x in entropy)

我錯過了什麼?BIP39 部分的熵是錯誤的嗎?那個 BIP32 庫會產生錯誤的地址嗎?有哪些選擇?

更新:

感謝這個網站,我發現從 12 個單詞生成的 xprv 是不正確的。所以要麼是bip39有問題,要麼是我使用它的方式。

困難在於名稱不佳的BIP32Key.fromEntropy.

通常要創建一個新錢包,您:

  1. 從加密安全的隨機源中獲取一些熵,至少 128 位,並且必須是 32 位的倍數。
  2. 將熵轉換為助記符(這種轉換不是單向函式,它是雙射的)。
  3. 將助記符轉換為 512 位種子(這種轉換是一種方式)。
  4. 將種子轉換為擴展私鑰(也是一種方式)。
  5. 做 BIP-32 推導和所有其他的……

BIP32Key.fromEntropy真的應該被命名BIP32Key.fromSeed

這是一個例子:

from bip32utils import BIP32Key
from bip32utils import BIP32_HARDEN
import os, bip39

strength_bits = 128
entropy = os.urandom(strength_bits // 8)
wallet_generator = bip39.Mnemonic('english')
mnemonic = wallet_generator.to_mnemonic(entropy)
assert wallet_generator.to_entropy(mnemonic) == entropy  # see, bijective!

# Or specify the mnemonic directly if you prefer:
mnemonic = 'aware report movie exile buyer drum poverty supreme gym oppose float elegant'

print mnemonic
seed = bip39.Mnemonic.to_seed(mnemonic)
key = BIP32Key.fromEntropy(seed)
account_number = 0
i = 0
print key.ChildKey(44 + BIP32_HARDEN) \
        .ChildKey(0 + BIP32_HARDEN) \
        .ChildKey(account_number + BIP32_HARDEN) \
        .ChildKey(0) \
        .ChildKey(i) \
        .Address()

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