主页 > imtoken币不见了 > 跟着老廖(廖雪峰)学区块链(八)教程:钱包级别

跟着老廖(廖雪峰)学区块链(八)教程:钱包级别

imtoken币不见了 2023-10-01 05:08:07

HD钱包算法决定了只要给定根扩展私钥,就可以计算出整棵树中任意一个节点的扩展私钥。

我们来看看如何使用JavaScript库bitcoinjs-lib来计算硬盘地址:

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编码,解码后得到原始扩展私钥。

子公钥可以直接从没有 xprv 的 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).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

比特币钱包地址会变吗_比特币钱包地址会变吗_比特币转错到比特币现金地址了

m / purpose' / coin_type' / account' / change / address_index

其中purpose始终为44,coin_type在SLIP-44中定义比特币钱包地址会变吗,例如0=BTC,2=LTC,60=ETH等。account表示用户的某个“账户”,用户自定义index,change=0表示外部交易,change=1表示内部交易,address_index为真实派生地址,索引范围为0~231。

比如比特币钱包为用户创建的一组HD地址,其实就是:

如果是莱特币钱包,用户的HD地址为:

概括

实现 BIP-44 规范的钱包可以管理所有货币。 同根扩展私钥在不同钱包上派生出的地址集合是相同的。