為什麼 LedgerJS 和 Electrum,使用相同的 Nano S 和派生路徑,不是指同一個 Wallet?
我像這樣在我的命令行中啟動 Electrum:
./Electrum --testnet
我將 Ledger Nano S 連接到我的筆記型電腦。在 Electrum 中,我使用 Nano S 的私鑰作為種子創建了一個帶有派生路徑的新 HD 錢包:
"m/49'/1'/0'"
在 NodeJS(LedgerJS 庫)中,我編寫了這段程式碼,使用完全相同的派生路徑,也使用 Nano S 私鑰作為種子:
const transport = await TransportNodeHid.create(); const btc = new AppBtc(transport); const result = await btc.getWalletPublicKey("m/49'/1'/0'"); console.log(result.getWalletPublicKey())
現在,由於 TransportNodeHid 連接到我的 Ledger Nano S,我希望 AppBtc 對像生成具有完全相同種子的 HD 錢包,因此派生路徑
"m/49'/1'/0'"
應該給我完全相同的錢包主公鑰和接收比特幣地址嗎?
但是,在 Electrum 中:
Master Public Key: upub5EorGi4nr15AW..... Receiving Address: 2NEYbAH7x6sXU2bS....
在我的 NodeJS 應用程序中,使用 getWalletPublicKey():
{ publicKey:'049bd7786109d5bed56.....', bitcoinAddress: 'mtCKwjnNzNZr.....', chainCode:'c511f1afedb628fdb93299747604b...' }
現在,我發現 NodeJS 程式碼返回的 publicKey 和 chainCode 可以以某種方式組合以創建主公鑰。但是,bitcoinAddress 屬性應該是與我的 HD 錢包關聯的地址,對吧?它與 Electrum 應用程序中的接收地址不同,但它仍然應該是接收地址。
但是,我已經嘗試使用 Testnet 向它發送 0.0001 BTC,但它從未到達我的 Electrum 錢包中。那麼這是否意味著該地址與我的 Electrum 錢包無關?即使我給出了完全相同的派生路徑並使用了完全相同的種子(硬體設備 Ledger Nano S)?
如何使用 LedgerJS 庫從我的 HD 錢包“獲取”更多接收地址?
我檢查了 LedgerJS 文件和範例,但我不會稱其為“文件”,因為大多數功能幾乎沒有解釋,範例幾乎不存在。關於一切究竟是如何運作的,有很多猜測。
<https://github.com/LedgerHQ/ledgerjs/tree/master/packages/hw-app-btc#getwalletpublickey>
<http://ledgerhq.github.io/ledgerjs/docs>
一個公鑰可以有多個地址。看起來這裡發生的事情是 Electrum 正在創建 P2SH-P2WPKH 類型的地址,而您的 NodeJS 程式碼正在創建 P2PKH 地址。這是兩種不同的地址類型,具有不同的支出要求和交易數據。但是,發送到任一地址類型的比特幣仍然可以使用相同的私鑰使用,並且使用相同的公鑰創建兩個地址。
當您將比特幣發送到 P2PKH 地址時,Electrum 不會顯示它,因為它不是在尋找發送到該地址的比特幣。僅僅因為你擁有花費一些比特幣所需的私鑰並不一定意味著你的錢包會尋找這種類型的輸出。錢包無法跟踪它可以花費的所有可能的輸出腳本(它是無限的),它只能跟踪它期望看到的那些。所以對於 Electrum,它只跟踪 P2SH-P2WPKH 地址,而不是你發送比特幣的 P2PKH 地址。