跟着老廖(廖雪峰)学区块链(8)教程:钱包层级
摘要:区块链 廖雪峰HD钱包算法决定了只要给定根扩展私钥,整棵树的任意节点的扩展私钥都可以计算出来。我们来看看如何利用bitcoinjs-lib这个JavaScript库来计算HD地址:const bitcoin = require('bitcoinjs-lib');let xprv = 'xprv
HD钱包优化算法决策了只需给出根扩展私钥,整棵树的任一连接点的扩展私钥都能够推算出来。
大家一起来看看怎样运用bitcoinjs-lib这一JavaScript库来测算HD地址:
const bitcoin = require('bitcoinjs-lib');let xprv = 'xprv9s21ZrQH143K4EKMS3q1vbJo564QAbs98BfXQME6nk8UCrnXnv8vWg9qmtup3kTug96p5E3AvarBhPMScQDqMhEEm41rpYEdXBL8qzVZtwz', root = bitcoin.HDNode.fromBase58(xprv);// m/0:var m_0 = root.derive(0);console.log("xprv m/0: " m_0.toBase58());console.log("xpub m/0: " m_0.neutered().toBase58());console.log(" prv m/0: " m_0.keyPair.toWIF());console.log(" pub m/0: " m_0.keyPair.getAddress());// m/1:var m_1 = root.derive(0);console.log("xprv m/1: " m_1.toBase58());console.log("xpub m/1: " m_1.neutered().toBase58());console.log(" prv m/1: " m_1.keyPair.toWIF());console.log(" pub m/1: " m_1.keyPair.getAddress());
注意到以xprv开始的xprv9s21ZrQH...是512位扩展私钥的Base58编号,编解码后取得的便是初始扩展私钥。
可以从某一xpub在并没有xprv的条件下立即推算子公钥:
const bitcoin = require('bitcoinjs-lib');let xprv = 'xprv9s21ZrQH143K4EKMS3q1vbJo564QAbs98BfXQME6nk8UCrnXnv8vWg9qmtup3kTug96p5E3AvarBhPMScQDqMhEEm41rpYEdXBL8qzVZtwz', root = bitcoin.HDNode.fromBase58(xprv);// m/0:let m_0 = root.derive(0), xprv_m_0 = m_0.toBase58(), xpub_m_0 = m_0.neutered().toBase58();// 方式一:从m/0的扩展私钥推算m/0/99的公钥地址:let pub_99a = bitcoin.HDNode.fromBase58(xprv_m_0).derive(99).getAddress();// 方法二:从m/0的扩展公钥推算m/0/99的公钥地址:let pub_99b = bitcoin.HDNode.fromBase58(xpub_m_0).derive(99).getAddress();// 较为公钥地址是不是同样:console.log(pub_99a);console.log(pub_99b);
但无法从xpub推算硬底化的子公钥:
const bitcoin = require('bitcoinjs-lib');let xprv = 'xprv9s21ZrQH143K4EKMS3q1vbJo564QAbs98BfXQME6nk8UCrnXnv8vWg9qmtup3kTug96p5E3AvarBhPMScQDqMhEEm41rpYEdXBL8qzVZtwz', root = bitcoin.HDNode.fromBase58(xprv);// m/0:let m_0 = root.derive(0), xprv_m_0 = m_0.toBase58(), xpub_m_0 = m_0.neutered().toBase58();// 从m/0的扩展私钥推算m/0/99'的公钥地址:let pub_99a = bitcoin.HDNode.fromBase58(xprv_m_0).deriveHardened(99).getAddress();console.log(pub_99a);// 不可以从m/0的扩展公钥推算m/0/99'的公钥地址:bitcoin.HDNode.fromBase58(xpub_m_0).deriveHardened(99).getAddress();
BIP-44HD钱包基础理论上面有无尽的等级,对应用secp256k1优化算法的一切币都适用。可是,假如一种钱包应用m/1/2/x,另一种钱包使用m/3/4/x,并没有一种统一的标准,便会乱了套。
BTC的BIP-44标准界定了一种怎样衍生私钥的规范,它自身比较简单:
m / purpose' / coin_type' / account' / change / address_index
m / purpose' / coin_type' / account' / change / address_index
在其中,purpose一直44,coin_type在SLIP-44中界定,例如,0=BTC,2=LTC,60=ETH等。account表明客户的某一“帐户”,由客户自定数据库索引,change=0表明外界买卖,change=1表明内部结构买卖,address_index则是真真正正衍生的数据库索引为0~231的地址。
例如,某一BTC钱包给客户建立的一组HD地址事实上是:
m/44'/0'/0'/0/0m/44'/0'/0'/0/1m/44'/0'/0'/0/2m/44'/0'/0'/0/3...如果是以太币钱包,则客户的HD地址是:
m/44'/2'/0'/0/0m/44'/2'/0'/0/1m/44'/2'/0'/0/2m/44'/2'/0'/0/3...总结完成了BIP-44标准的钱包可以管理方法全部货币。同样的根扩展私钥在不一样钱包上衍生的一组地址全是同样的。
- 免责声明
- 世链财经作为开放的信息发布平台,所有资讯仅代表作者个人观点,与世链财经无关。如文章、图片、音频或视频出现侵权、违规及其他不当言论,请提供相关材料,发送到:2785592653@qq.com。
- 风险提示:本站所提供的资讯不代表任何投资暗示。投资有风险,入市须谨慎。
- 世链粉丝群:提供最新热点新闻,空投糖果、红包等福利,微信:juu3644。