Addresses

為什麼 HD 錢包實例在 Root 和 HDKey 中返回兩個 xpub-xpriv 密鑰對?

  • January 28, 2020

我已經使用 HDWallet 實現了地址生成,如下面的片段所示:

let Seed = generateMnemonic();
const wallet = EthHdWallet.fromMnemonic(Seed);
console.log("Wallet" + JSON.stringify(wallet));
console.log(typeof wallet);
let address = wallet.generateAddresses(3);
console.log("Wallet after address generation: " + JSON.stringify(wallet));
console.log("Address generated: " + address);

錢包提供了一個對象,其中包含:

  • _hdKey(有參數_hdKey,還有兩個參數xpriv& xpub
  • _root(也有參數_hdKey,該參數還有兩個參數xpriv,與xpubhd 鍵的參數值不同)
  • _children(使用自己的私鑰和公鑰對生成的地址)

難點:

  1. 那兩個密鑰對錶示什麼?_hdKey我們在and下得到它_root
  2. 如何僅使用 privateKey 恢復我的地址?

我建議檢查BIP 32 文件,您正在查看的對象可以追溯到規範中的概念。

下劃線可能表示它們是 EthHdWallet 的實現細節,因此要獲得詳細答案,必須查看原始碼。

EthHdWallet 的建構子中我們可以判斷出含義:

 constructor (xPrivKey) {
   this._hdKey = fromExtendedKey(xPrivKey)
   this._root = this._hdKey.derivePath(BIP44_PATH)
   this._children = []
 }
  • _hdKey是HD錢包的主節點
  • _root是乙太坊派生路徑上的節點m/44'/60'/0'/0
  • _children從 _root 派生的子鍵

可以從私鑰計算地址(參見例如 https://ethereum.stackexchange.com/a/27187>),但它涉及一些低級計算。更簡單的解決方案是使用<https://github.com/ethereumjs/ethereumjs-wallet之類的庫,並將私鑰導入錢包並獲取地址。

const wallet = HDWallet.fromPrivateKey(privateKeyBuffer)
const address = wallet.getChecksumAddressString()

引用自:https://ethereum.stackexchange.com/questions/79390