让我们一起看看如何使用JavaScript库bitcoinjs-lib来计算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(1); 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”开头的字符是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(); // Method 1: Get public address of m/0/99 from xprv of m/0: let pub_99a = bitcoin.HDNode.fromBase58(xprv_m_0).derive(99).getAddress();
// Method 2: Get public address of m/0/99 from xpub of m/0: let pub_99b = bitcoin.HDNode.fromBase58(xpub_m_0).derive(99).getAddress();
// Check if the two public addresses are the same: 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();
// Get public address of m/0/99 from xprv of m/0: let pub_99a = bitcoin.HDNode.fromBase58(xprv_m_0).deriveHardened(99).getAddress(); console.log(pub_99a);
// Get public address of m/0/99 from xpub of m/0: bitcoin.HDNode.fromBase58(xpub_m_0).deriveHardened(99).getAddress(); ```
BIP-44是比特币HD钱包的标准,它定义了一个简单的规范来派生私钥:
``` 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/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 ... ```
经过BIP-44标准化的HD钱包可以管理其它货币的全部方法。同一根扩展私钥在不同钱包上派生的一组地址完全相同。
区块链是一种安全、分布式和恒定的数据库区块链应用 分布式交易,由分布式网络中的所有各方共享。简而言之,区块链是一种允许彼此不认识的人信任事件的共享记录的技术。数据存储在称为块的刚性结构中,它们通过哈希值链接(每个块包含时...
1、低性能:早期区块链技术交易吞吐量小,低性能导致今天的区块链应用无法与传统的非区块链应用竞争,性能问题一直困扰着许多用户。2、同步数据缓慢:用户需要同步区块链中的所有数据。由于数据量大,同步效率低。3、非消费者友好:几...
近日,ICT中国·2021高峰论坛之区块链运用学术研讨会在京举办。大会上所表示的数据统计表明,在我国区块链产业发展规划已获得充分进度,变成全世界区块链产业链发展前景最大的国家之一,2020年在我国区块链产业链规模化...
区块链应用落地N种方式区块链作为一种分布式应用,必须与其他系统结构结合,包括其他分布式结构,甚至集中结构,从产业逻辑的角度,而不仅仅是从技术逻辑的角度,面对真实的业务场景需要构建信息系统结构,相互学习,匹配行业和业务逻辑...