Python
如何從python中的12個單詞生成菌絲體地址
我正在嘗試重新生成我的菌絲體錢包已生成的接收地址(並更改地址)。
到目前為止,我已經使用了 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 方案。
我得到了一個密鑰,但不是我第一次菌絲體交易中出現的那個。我試圖
i
用account_number
0 到 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
.通常要創建一個新錢包,您:
- 從加密安全的隨機源中獲取一些熵,至少 128 位,並且必須是 32 位的倍數。
- 將熵轉換為助記符(這種轉換不是單向函式,它是雙射的)。
- 將助記符轉換為 512 位種子(這種轉換是一種方式)。
- 將種子轉換為擴展私鑰(也是一種方式)。
- 做 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()