理解开发HD 钱包涉及的 BIP32、BIP44、BIP39

如果你还在被HD钱包、BIP32、BIP44、BIP39搞的一头雾水,来看看这边文章吧。

数字钱包概念

钱包用来存钱的,在区块链中,我们的数字资产都会对应到一个账户地址上, 只有拥有账户的钥匙(私钥)才可以对资产进行消费(用私钥对消费交易签名)。

私钥和地址的关系如下:

(图来自精通比特币)

一句话概括下就是:私钥通过椭圆曲线生成公钥, 公钥通过哈希函数生成地址,这两个过程都是单向的。

因此实际上,数字钱包实际是一个管理私钥(生成、存储、签名)的工具,注意钱包并不保存资产,资产是在链上的。

如何创建账号

创建账号关键是生成一个私钥, 私钥是一个32个字节的数, 生成一个私钥在本质上在1到2^256之间选一个数字

因此生成密钥的第一步也是最重要的一步,是要找到足够安全的熵源,即随机性来源,只要选取的结果是不可预测或不可重复的,那么选取数字的具体方法并不重要。

比如可以掷硬币256次,用纸和笔记录正反面并转换为0和1,随机得到的256位二进制数字可作为钱包的私钥。

从编程的角度来看,一般是通过在一个密码学安全的随机源(不建议大家自己去写一个随机数)中取出一长串随机字节,对其使用SHA256哈希算法进行运算,这样就可以方便地产生一个256位的数字。

实际过程需要比较下是否小于n-1(n = 1.158 * 10^77, 略小于2^256),我们就有了一个合适的私钥。否则,我们就用另一个随机数再重复一次。这样得到的私钥就可以根据上面的方法进一步生成公钥及地址。

BIP32

钱包也是一个私钥的容器,按照上面的方法,我们可以生成一堆私钥(一个人也有很多账号的需求,可以更好保护隐私),而每个私钥都需要备份就特别麻烦的。

最早期的比特币钱包就是就是这样,还有一个昵称:“Just a Bunch Of Keys(一堆私钥)“

为了解决这种麻烦,就有了BIP32 提议: 根据一个随机数种子通过分层确定性推导的方式得到n个私钥,这样保存的时候,只需要保存一个种子就可以,私钥可以推导出来,如图:

(图来自精通比特币)上图中的孙秘钥就可以用来签发交易。

补充说明下 BIP: Bitcoin Improvement Proposals 比特币改进建议, bip32是第32个改进建议。

BIP32提案的名字是:Hierarchical Deterministic Wallets, 就是我们所说的HD钱包。

来分析下这个分层推导的过程,第一步推导主秘钥的过程:

根种子输入到HMAC-SHA512算法中就可以得到一个可用来创造主私钥(m) 和 一个主链编码( a master chain code)这一步生成的秘钥(由私钥或公钥)及主链编码再加上一个索引号,将作为HMAC-SHA512算法的输入继续衍生出下一层的私钥及链编码,如下图:

衍生推导的方案其实有两个:一个用父私钥推导(称为强化衍生方程),一个用父公钥推导。同时为了区分这两种不同的衍生,在索引号也进行了区分,索引号小于2^31用于常规衍生,而2^31到2^32-1之间用于强化衍生,为了方便表示索引号i‘,表示2^31+i。

因此增加索引(水平扩展)及 通过子秘钥向下一层(深度扩展)可以无限生成私钥。

注意, 这个推导过程是确定(相同的输入,总是有相同的输出)也是单向的,子密钥不能推导出同层级的兄弟密钥,也不能推出父密钥。如果没有子链码也不能推导出孙密钥。现在我们已经对分层推导有了认识。

一句话概括下BIP32就是:为了避免管理一堆私钥的麻烦提出的分层推导方案。

秘钥路径及BIP44

通过这种分层(树状结构)推导出来的秘钥,通常用路径来表示,每个级别之间用斜杠 / 来表示,由主私钥衍生出的私钥起始以“m”打头。因此,第一个母密钥生成的子私钥是m/0。第一个公共钥匙是M/0。第一个子密钥的子密钥就是m/0/1,以此类推。

BIP44则是为这个路径约定了一个规范的含义(也扩展了对多币种的支持),BIP0044指定了包含5个预定义树状层级的结构:

m / purpose‘ / coin‘ / account‘ / change / address_index

m是固定的, Purpose也是固定的,值为44(或者 0x8000002C)

Coin type

这个代表的是币种,0代表比特币,1代表比特币测试链,60代表以太坊

完整的币种列表地址:https://github.com/satoshilabs/slips/blob/master/slip-0044.md

Account

代表这个币的账户索引,从0开始

Change

常量0用于外部链,常量1用于内部链(也称为更改地址)。外部链用于在钱包外可见的地址(例如,用于接收付款)。内部链用于在钱包外部不可见的地址,用于返回交易变更。 (所以一般使用0)

address_index

这就是地址索引,从0开始,代表生成第几个地址,官方建议,每个account下的address_index不要超过20

根据 EIP85提议的讨论以太坊钱包也遵循BIP44标准,确定路径是m/44‘/60‘/a‘/0/n

a 表示帐号,n 是第 n 生成的地址,60 是在 SLIP44 提案中确定的以太坊的编码。所以我们要开发以太坊钱包同样需要对比特币的钱包提案BIP32、BIP39有所了解。

一句话概括下BIP44就是:给BIP32的分层路径定义规范

BIP39

BIP32 提案可以让我们保存一个随机数种子(通常16进制数表示),而不是一堆秘钥,确实方便一些,不过用户使用起来(比如冷备份)也比较繁琐,这就出现了BIP39,它是使用助记词的方式,生成种子的,这样用户只需要记住12(或24)个单词,单词序列通过 PBKDF2 与 HMAC-SHA512 函数创建出随机种子作为 BIP32 的种子。

可以简单的做一个对比,下面那一种备份起来更友好:

// 随机数种子
090ABCB3A6e1400e9345bC60c78a8BE7
// 助记词种子
candy maple cake sugar pudding cream honey rich smooth crumble sweet treat

使用助记词作为种子其实包含2个部分:助记词生成及助记词推导出随机种子,下面分析下这个过程。

生成助记词

助记词生成的过程是这样的:先生成一个128位随机数,再加上对随机数做的校验4位,得到132位的一个数,然后按每11位做切分,这样就有了12个二进制数,然后用每个数去查BIP39定义的单词表,这样就得到12个助记词,这个过程图示如下:

(图来源于网络)

助记词推导出种子

这个过程使用密钥拉伸(Key stretching)函数,被用来增强弱密钥的安全性,PBKDF2是常用的密钥拉伸算法中的一种。

PBKDF2基本原理是通过一个为随机函数(例如 HMAC 函数),把助记词明文和盐值作为输入参数,然后重复进行运算最终产生生成一个更长的(512 位)密钥种子。这个种子再构建一个确定性钱包并派生出它的密钥。

密钥拉伸函数需要两个参数:助记词和盐。盐可以提高暴力破解的难度。 盐由常量字符串 "mnemonic" 及一个可选的密码组成,注意使用不同密码,则拉伸函数在使用同一个助记词的情况下会产生一个不同的种子,这个过程图示图下:

(图来源于网络)

密码可以作为一个额外的安全因子来保护种子,即使助记词的备份被窃取,也可以保证钱包的安全(也要求密码拥有足够的复杂度和长度),不过另外一方面,如果我们忘记密码,那么将无法恢复我们的数字资产。

一句话概括下BIP39就是:通过定义助记词让种子的备份更友好

小结

HD钱包(Hierarchical Deterministic Wallets)是在BIP32中提出的为了避免管理一堆私钥的麻烦提出的分层推导方案。

而BIP44是给BIP32的分层增强了路径定义规范,同时增加了对多币种的支持。

BIP39则通过定义助记词让种子的备份更友好。

目前我们的市面上单到的以太币、比特币钱包基本都遵循这些标准。

最后推荐一个助记词秘钥生成器网站

欢迎来知识星球提问,星球内已经聚集了300多位区块链技术爱好者。

原文地址:https://www.cnblogs.com/tinyxiong/p/9723039.html

时间: 2024-10-03 20:08:42

理解开发HD 钱包涉及的 BIP32、BIP44、BIP39的相关文章

分成确定性钱包开发的代码实现(HD钱包服务)

HD Wallets的全称是Hierachical Deterministic Wallets, 对应中文是 分层确定性钱包. 这种钱包能够使用一组助记词来管理所有的账户的所有币种,在比特币的BIP32提案中提出,通过种子来生成主私钥,然后派生海量的子私钥和地址.种子很长,为了方便记录,转换为一组单词记录,这是BIP39提出的. 生成钱包地址的基本流程:1 生成一组助记词 2 助记词转化成种子(通过PBKDF2) 3 种子生成根私钥(通过HMAC-SHA512) 4 通过根私钥生成子私钥 本文的

BTC比特币HD钱包开发教程1|简单知识

我们今天 来看看开发BTC 的HD钱包. 我们先来看看什么是HD钱包. HD 钱包,即分层确定性钱包,我们知道数字钱包是用来保存我们的密钥和地址的,而数字货币是被记录在区块链网络中的每个区块上的.因此,如何安全方便的生成.保存和备份恢复密钥才是钱包的关键.为此,钱包已经进化了三次,从最初的非确定(随机)钱包到第二代的确定性(种子)钱包,直到现在的分层确定性钱包,钱包的更新迭代经过了三个阶段. 比特币最早的客户端(Satoshi client)就是非确定性钱包,钱包是一堆随机生成的私钥的集合. 客

提速1000倍,预测延迟少于1ms,百度飞桨发布基于ERNIE的语义理解开发套件

11月5日,在『WAVE Summit+』2019 深度学习开发者秋季峰会上,百度对外发布基于 ERNIE 的语义理解开发套件,旨在为企业级开发者提供更领先.高效.易用的 ERNIE 应用服务,全面释放 ERNIE 的工业化价值,其中包含 ERNIE 轻量级解决方案,提速 1000倍! 今年 7 月,百度发布持续学习语义理解框架 ERNIE 2.0,在共计 16 个中英文任务上超越BERT.XLNET,取得了 SOTA 的效果. ERNIE2.0 发布以来,ERNIE 产业化应用进程不断加速,易

我所理解开发和测试人员的关系

概述 开发和测试,起源本没有分家.社会精细化,分工出现,两者渐行渐远.开发人员,创造世界的人,在建造高楼大厦的时候,必会埋下隐患.测试人员,世界的验证者,以挑剔的眼光,审视眼前需要验证的对象. 代码是开发人员的产出:bug是测试人员的产出 人,被人盯住挑自己辛苦创造的东西的毛病时,如芒在背,总是不喜欢这样的感觉.      于是,开发和测试,逐渐对立起来.      人在分工后,思维方式也变得不同(测试应当是“证坏”非“证好”),所以,开发人员看待问题的角度和测试人员诸多时候不能合轨.     

区块链多币种钱包app系统开发,Vpay钱包系统开发

什么是区块链钱包 区块链代币在转账时,每笔转账交易需要被验证签名有效,然后写入区块中,完成转账交易.然而只有拥有私钥的人才能产生有效的签名,私钥是由用户本地生成的,并不存在于区块链网络中,以文件的形式保存在本地,而生成和存储私钥的工具就是区块链钱包.钱包系统开发 Tel: 前面138中间2315后面3201 简单说,区块链钱包是管理私钥的客户端. 区块链钱包的基础知识 假设区块链经济是一个世界,这个世界的中心就是比特币钱包,bitcoin.对,这个钱包的名字和比特币的叫法一模一样,即bitcoi

多币种钱包系统开发,钱包系统源码开发

多币种钱包系统目前对于数字资产行业的人来说就像是一个储存东西的容器,那个被储存的东西就是数字资产.我们都知道,数字资产是一串虚拟的代码,看不见摸不着,因此就算我们有心想要保护它,也需要这个容器足够牢固安全,这样我们也才放心将这个极重要的东西放进去.多币种钱包系统在充当这个容器之前,首先应该保证安全稳定,因此在开发多币种钱包系统时,就应该选择正规的开发公司,他们的技术是值得信任的,而那些一套一套源码复制的却是在拿每个用户的数字资产做赌注,运营者作为背锅侠而已.所以,我们开发多币种钱包系统应该选择自

多币种钱包系统开发,Plus钱包app系统开发,交易系统开发

数字资产钱包,顾名思义就是存储和使用数字资产的工具,如同支付宝用于移动支付,数字资产钱包一直是数字资产流通不可或缺的基础应用.多币种钱包系统开发 Tel: 前面138中间2315后面3201 钱包一般包含以下内容:公钥.私钥.助记词.keystore.密码:这里的内容就稍微有点烧脑了,本质上,钱包和钥匙是一一对应的,固定的钥匙直接就可以在网络上打开属于自己的钱包,但为了避免在网络传输过程中的泄密,密码学家运用非对称加密技术,发明了公钥和私钥,公钥用于传输,私钥用于解密,简单的看,我们可以认为公钥

开发交易所钱包区块链im通信社交系统app技术公司

火币,是众所周知的一流交易所,前天一篇关于"火币李林的张颖时刻"报道火币创始人李林的分享.其中有谈到火币集团未来的布局以及战略规划.值得关注的一个点是:火币在未来的重点是交易所.钱包以及im的服务,由此看来未来的一波交易所已经不能满足人对区块链资产的行为轨迹,储存,社交,支付也慢慢区域常规化.有人说,开发交易所是前提,为会员资源群体增加黏性,形成闭环生态圈,构建全局的交易网络系统.钱包为储存,其实像现在的市场,钱包是为最火热的时候,熊市,交易流动性弱一些,钱包就是多人最好的选择.Im是

区块链交易所开发,合约交易系统开发,钱包开发

最近,比特币在历经暴跌之后迎来了首个逐步上升的趋势,在多重关注下,数字资产市场正在慢慢回升,很多行业也正处于复苏阶段.对于币价回升,区块链交易所应该是直接受益对象,币价的回暖造就的就是用户开始交易,交易所就有了利润可赚,因此这个时候也是区块链交易所开发新一轮的爆发点.除了区块链交易所以外,合约交易系统和钱包也不例外,合约理应是熊市的利刃,但在这利好的市场中,合约交易系统依旧能够争得一席之地.无论是熊市的做空还是牛市的做多,都能够给用户带来巨额的收益,因此合约交易系统开发无论是在何时都是区块链行业