← 返回文章

比特币学习之 HD 钱包——扩展密钥(bip32)

主私钥 主密钥是种子经过 HMAC-256 哈希函数得到的。 HMAC : HMAC可以看作是一

主私钥

主密钥是种子经过 HMAC-256 哈希函数得到的。

HMAC : HMAC可以看作是一个散列函数,它允许我们输入一个数据来生成一组新的随机的64字节的种子。

我们使用经过HMAC函数后得到的这新的64字节来创建我们的主扩展私钥。

  • 前32字节是私钥
  • 后32字节是链码
// 假设我们的种子是: b1680c7a6ea6ed5ac9bf3bc3b43869a4c77098e60195bae51a94159333820e125c3409b8c8d74b4489f28ce71b06799b1126c1d9620767c2dadf642cf787cf36
const bip32 = require('bip32');
let seed3 = Buffer.from('b1680c7a6ea6ed5ac9bf3bc3b43869a4c77098e60195bae51a94159333820e125c3409b8c8d74b4489f28ce71b06799b1126c1d9620767c2dadf642cf787cf36','hex')
let node = bip32.fromSeed(seed)
let privateKey = node.privateKey.toString('hex')
let chainCode = node.chainCode.toString('hex')

console.log('private key:',privateKey)
console.log('chain code:',chainCode)

// 输出结果:
// private key: 081549973bafbba825b31bcc402a3c4ed8e3185c2f3a31c75e55f423e9629aa3
// chain code:  1d7d2a4c940be028b945302ad79dd2ce2afe5ed55e1a2937a5af57f8401e73dd

扩展私钥

占个坑,有时间写

扩展公钥

占个坑,有时间写

子钥

通过HMAC函数放置私钥和链码,使得我们可以从扩展私钥生成新的子私钥。我们每次还包含一个索引号,这将允许我们从一个主密钥创建多个子密钥。

// 假设我们的私钥和链码如下:
// private key: 081549973bafbba825b31bcc402a3c4ed8e3185c2f3a31c75e55f423e9629aa3
// chain code:  1d7d2a4c940be028b945302ad79dd2ce2afe5ed55e1a2937a5af57f8401e73dd

const bip32 = require('bip32');
let privateKey=Buffer.from('081549973bafbba825b31bcc402a3c4ed8e3185c2f3a31c75e55f423e9629aa3','hex')
let chainCode =Buffer.from('1d7d2a4c940be028b945302ad79dd2ce2afe5ed55e1a2937a5af57f8401e73dd','hex')
let node = bip32.fromPrivateKey(privateKey,chainCode)
// 0 就是索引号,这里我们可以通过更改索引号,生成新的子密钥
let child_0 = node.deriveHardened(0)
let child_1 = node.deriveHardened(1)

console.log('child 0:')
console.log('private key',child_0.privateKey.toString('hex'))
console.log('public key',child_0.publicKey.toString('hex'))
console.log('child 1:')
console.log('private key',child_1.privateKey.toString('hex'))	
console.log('public key',child_1.publicKey.toString('hex'))

// 输出结果:
// child 0:
// private key: 0397654f8c58215da8575e495345912bd0d23545cf0017505ab6b6ae1a97eedb
// public key:  021fa96c781e4ba8a11eb6fb8a7bd3f996ad0d6461fb403b0f389605c6f35c2620

// child 1:
// private key: 38512d738064f282d7620205815fa1208258bf031dbf5b6e5887cc3dacf7ae1d
// public key:  03073e48507140bb0e57dd4008db386f554d13a8641f7e55426419af4ba71fa3eb

子扩展公钥

占个坑,有时间写

总结

我们只需要用以上代码就可以通过 nodejs 完成主密钥以及众多子钥的生成。

END