Bitcoinjs

如何使用 bitcoinjs-lib 從 keyPair 獲取 xpriv 和 xpub

  • July 16, 2019

我有這個程式碼:

const bitcoin = require('bitcoinjs-lib');
const keyPair = bitcoin.ECPair.makeRandom({ });

問題:如何從 keyPair 獲取 xpriv 和 xpub

簡短的回答是:你可能不應該。

這不是生成xpriv/的典型方式xpub。您正在嘗試將密鑰對轉換為擴展密鑰對。不同之處在於擴展密鑰包括以下內容(參見 BIP32 - 序列化格式)

  • 4 byte:版本字節(主網:0x0488B21E公共,0x0488ADE4私有;測試網:0x043587CF公共,0x04358394私有)
  • 1 byte:深度:0x00對於主節點,0x01對於一級派生密鑰,….
  • 4 bytes:父密鑰的指紋(0x00000000如果是主密鑰)
  • 4 bytes: 孩子號碼。這是 xi = xpar/i 中 i 的 ser32(i),其中 xi 是被序列化的密鑰。(0x00000000如果是萬能鑰匙)
  • 32 bytes: 鏈碼
  • 33 bytes:公鑰或私鑰數據(公鑰為 serP(K),私鑰為 0x00 || ser256(k))

BIP32 標準主密鑰生成是這樣的:

  • 從 (P)RNG 生成選定長度的種子字節序列 S(在 128 和 512 位之間;建議使用 256 位)。
  • 計算 I = HMAC-SHA512(Key = “比特幣種子”, Data = S)
  • 將 I 拆分為兩個 32 字節的序列,IL 和 IR。
  • 使用 parse256(IL) 作為主密鑰,使用 IR 作為主鏈碼。

使用 bitcoinjs-lib,更標準的方法是:

const mnemonic = 'praise you muffin lion enable neck grocery crumble super myself license ghost'
const seed = bip39.mnemonicToSeed(mnemonic)
const node = bip32.fromSeed(seed)
console.log(node.toBase58())

'xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkTcaMEcjq1vG7XmEEW22S2UiSPbrzTkUeXfcwo7PzRZ4aDiRQu'

node如果您絕對必須這樣做,從技術上講,您可以(不推薦)用您自己的私鑰緩衝區替換對象的私鑰屬性,即__d

> const bip32 = require('bip32')
undefined
> let node = bip32.fromBase58('xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi')
undefined
> node
BIP32 {
 __d: <Buffer e8 f3 2e 72 3d ec f4 05 1a ef ac 8e 2c 93 c9 c5 b2 14 31 38 17 cd b0 1a 14 94 b9 17 c8 43 6b 35>,
 __Q: null,
 chainCode: <Buffer 87 3d ff 81 c0 2f 52 56 23 fd 1f e5 16 7e ac 3a 55 a0 49 de 3d 31 4b b4 2e e2 27 ff ed 37 d5 08>,
 depth: 0,
 index: 0,
 network: { wif: 128, bip32: { public: 76067358, private: 76066276 } },
 parentFingerprint: 0 }
> node.__d = Buffer.from('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 'hex')
<Buffer e3 b0 c4 42 98 fc 1c 14 9a fb f4 c8 99 6f b9 24 27 ae 41 e4 64 9b 93 4c a4 95 99 1b 78 52 b8 55>
> node
BIP32 {
 __d: <Buffer e3 b0 c4 42 98 fc 1c 14 9a fb f4 c8 99 6f b9 24 27 ae 41 e4 64 9b 93 4c a4 95 99 1b 78 52 b8 55>,
 __Q: null,
 chainCode: <Buffer 87 3d ff 81 c0 2f 52 56 23 fd 1f e5 16 7e ac 3a 55 a0 49 de 3d 31 4b b4 2e e2 27 ff ed 37 d5 08>,
 depth: 0,
 index: 0,
 network: { wif: 128, bip32: { public: 76067358, private: 76066276 } },
 parentFingerprint: 0 }

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