為什麼不同標準(目的)的 BIP32 根密鑰不同?
在<https://iancolemen.com/bip39/>上生成密鑰時,BIP32 根密鑰會隨著我更改派生路徑選項卡而更改,例如 BIP32、BIP44、BIP39 等。為什麼會這樣?BIP32 Root Key不是
m
在派生路徑的開頭,並且後續的不同標準purpose
不應該影響根密鑰嗎?與上述相反,當我在 go 中使用以下程式碼生成地址時,列印的主密鑰始終與 iancolemen.com 上的 BIP32 根密鑰匹配。並且更改目的不會影響最終生成的地址,它始終是 BIP32(舊版)地址,而不是我期望從 BIP84 獲得的隔離見證。
m, err := hdkeychain.NewMaster(seed, chainParams) if err != nil { panic(err) } fmt.Println("bip32 root", m.String()) purpose, _ := m.Child(hdkeychain.HardenedKeyStart + 84) coin, _ := purpose.Child(hdkeychain.HardenedKeyStart + 1) account, _ := coin.Child(hdkeychain.HardenedKeyStart + 0) receiving, _ := account.Child(0) index, _ := receiving.Child(0) fmt.Println("address", index.Address)
編輯: go 中列印的錯誤地址是由於未將地址正確編碼為 bech32 的結果,預設情況下它們被解釋為舊地址。鑰匙本身沒問題。
如果仔細觀察,您會注意到 BIP 32 和 BIP 44 實際上具有相同的根密鑰,並且以
xprv
. 然後 BIP 49 和 BIP 141 也有相同的根密鑰,它以 . 開頭yprv
。BIP 84 有一個不同於其他以zprv
. 現在,如果您要獲取所有這些根密鑰並使用 Base 58 對它們進行解碼,您會發現它們實際上是相同的,除了前 4 個字節和最後 4 個字節。最後 4 個字節是因為 Base 58 Check 編碼中使用的校驗和。
但是為什麼前 4 個字節不同呢?它們是不同的,因為 BIP 49 指定嵌套隔離見證地址的擴展密鑰應以前綴
yprv
和開頭ypub
。儘管這是特定於 BIP 49 的,但它更普遍地應用於嵌套隔離見證地址的所有擴展密鑰,因此您看到它用於 BIP 141。然後 BIP 84 指定本地隔離見證地址的擴展密鑰應該以前綴開頭,zprv
並且zpub
.這些前綴是導致不同根鍵的原因,因為更改前綴會導致整個序列化也發生變化。
通過這種邏輯,之前使用的
xprv
和xpub
前綴表示應該生成舊地址。因此 BIP 44 顯示xprv
。然而,BIP 32 指定了
xprv
andxpub
前綴,實際上這個前綴應該獨立於使用的派生路徑和要派生的地址。BIP 32 只關注密鑰,而不是地址。因此xprv
,andxpub
也用於一般 BIP 32 密鑰派生的東西,這可能會讓人感到困惑。但這也是 BIP 32 選項卡顯示xprv
.