Address

為什麼不同標準(目的)的 BIP32 根密鑰不同?

  • September 1, 2020

在<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.

這些前綴是導致不同根鍵的原因,因為更改前綴會導致整個序列化也發生變化。

通過這種邏輯,之前使用的xprvxpub前綴表示應該生成舊地址。因此 BIP 44 顯示xprv

然而,BIP 32 指定了xprvandxpub前綴,實際上這個前綴應該獨立於使用的派生路徑和要派生的地址。BIP 32 只關注密鑰,而不是地址。因此xprv,andxpub也用於一般 BIP 32 密鑰派生的東西,這可能會讓人感到困惑。但這也是 BIP 32 選項卡顯示xprv.

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