钱包层级
编辑教程钱包层级
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-44
HD钱包理论上有无限的层级,对使用secp256k1算法的任何币都适用。但是,如果一种钱包使用m/1/2/x,另一种钱包使用m/3/4/x,没有一种统一的规范,就会乱套。
比特币的BIP-44规范定义了一种如何派生私钥的标准,它本身非常简单:
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的地址。
例如,某个比特币钱包给用户创建的一组HD地址实际上是:
- m/44'/0'/0'/0/0
- m/44'/0'/0'/0/1
- m/44'/0'/0'/0/2
- m/44'/0'/0'/0/3
- ...
如果是莱特币钱包,则用户的HD地址是:
- m/44'/2'/0'/0/0
- m/44'/2'/0'/0/1
- m/44'/2'/0'/0/2
- m/44'/2'/0'/0/3
- ...
Mos固件,小电视必刷固件
ES6 教程
Vue.js 教程
JSON 教程
jQuery 教程
HTML 教程
HTML 5 教程
CSS 教程
CSS3 教程
JavaScript 教程
DHTML 教程
JSON在线格式化工具
JS在线运行
JSON解析格式化
jsfiddle中国国内版本
JS代码在线运行
PHP代码在线运行
Java代码在线运行
C语言代码在线运行
C++代码在线运行
Python代码在线运行
Go语言代码在线运行
C#代码在线运行
JSRUN闪电教程系统是国内最先开创的教程维护系统, 所有工程师都可以参与共同维护的闪电教程,让知识的积累变得统一完整、自成体系。
大家可以一起参与进共编,让零散的知识点帮助更多的人。
X
选择支付方式:
立即支付
¥
9.99
无法付款,请点击这里
金额: 0 元
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
如有疑问请联系QQ:565830900
正在生成二维码, 此过程可能需要15秒钟