HP钱包概念及底层原理(BIP32,BIP39,BIP44)

前序:相信各位区块链大佬,对公钥和私钥概念已经烂熟于心,对私钥重要性也讳莫如深。私钥能够给交易签名,有了私钥就有了所有权限,但原始私钥没什么规律可循,特别不放记忆转移,还容易出错。因此要用一些密码学知识管理。git

管理方法

非肯定性钱包

随机生成一个数字串做为私钥,可使用密码学安全的伪随机数生成器,公钥毫无关系,缺点当有多个私钥帐户时候(对于个专业的币圈人事,谁没有n个帐户呢,用于存储不通用途的币),必须逐个备份,导出,导入,极其麻烦。github

肯定性钱包

为了解决非肯定性钱包须要逐个导入问题,提出了一套生成密钥对的方法,密钥因为原始的seed推导出。这样一个seed就能够建立多个公要私钥对,在备份导入钱包时候就只须要种子方便抄写。这个特性适合收款服务,好比商店收款,为每一个用户建立一个收款公钥匙,也能够用户给用户空投等。算法

HD钱包(Hierachical Deterministic Wallets)

概述:中文能够翻译为分层钱包,HD钱包能够在不须要私钥状况下运用椭圆曲线算法生成大量公钥。概念是由BIP32(Bitcoin Improvement Proposals)提出,BIP39解决seed难以抄写记忆问题,BIP44规范各个币种路径规范达成业界共识。至此修成正果成为分层钱包的集大成者。如图:
图片描述
生成过程简图:
熵(128位/256位)→助记词(12个/24个/16个)→种子(512位62byte)→根帐户私钥,公钥,地址→其它层级帐户密钥
根据上述的顺序咱们会先用到BIP39生成助记词,再用到BIP32产生root,再经过BIP44规范生成各个链的钱包。因此按此顺序介绍三个BIP提案。数组

BIP39

主要描述助记词代码,助记词句子的实现,包括两部分1.生成助记词,将其转化为2进制种子,种子能够稍后用于使用BIP-0032或相似方法生成肯定性钱包。
BIP39提出动机:直接生成随机种子不久好了么,为何还要助记词。与处理钱包种子原始二进制或十六进制数字相比助记符对于人类交互是更优越的。能够写在纸上,记性好的还能够背下来。(在富有的老父亲快死时候也能够,把小儿子教到旁边口述给儿子,连物理解释都不用),BIP39就是经过人类可读转录传输计算机生成的随机性。这不是将用户建立的句子(也称为脑钱包)处理成钱包种子的方法。
助记词本质,将一些列难以记住的无规则的数字串经过转码拆分后生成数字,在于单词表进行映射生成助记词。
bip39具体实现:
0.准备包含2000个单词的助记词数组安全

  1. 生成一个32倍数的初始熵,长度为128-256bit之间,叫length
  2. length/32,计算为校验码长度
  3. 初始熵+校验码,每11位进行分割(而且整除因此可选的初始128,160,192,224,256)因此对应表为
  4. 11bit变为int类型做为下标,在2000个助记词数组中找到对应单词,返回给用户。
  5. 从助记词生成二进制seed,使用PBKDF2函数生成512bit seed,分为加密钥和不加密钥两种,不加密钥传空
  6. 种子就是给BIP32使用的种子了

可选初始熵对照表函数

初始熵 校验位 相加 助记词数量
128 4 132 12
160 5 165 15
192 6 198 18
224 7 231 21
256 8 264 24

BIP32:

钱包能够部分或所有与其它系统共享,每一个系统都有独立花钱能力。这个规范的目的是设定一个分层钱包标准,能在不通客户之间交换。经过一个共同的种子能够导出任意对私钥,私钥推导采用不可逆算法,只能够由高层级推导低层级,HD钱包能够在不须要私钥状况下运用椭圆曲线算法生成大量公钥。
子密钥派生(CKD)功能:经过父亲密钥和一个“路径”能够计算出子密钥,可分为如下几种状况区块链

  1. 父私钥 → 子私钥 可行
  2. 父亲公钥 → 子公钥 可行
  3. 父私钥 → 子公钥 可行
  4. 父公钥→ 子私钥 这是不可能的

具体算法游行缺能够参考bitcoin上,bip32测试

BIP44

经过这种分层(树状结构)推导出来的秘钥,一般用路径来表示,每一个级别之间用斜杠 / 来表示,由主私钥衍生出的私钥起始以“m”打头。所以,第一个母密钥生成的子私钥是m/0。第一个公共钥匙是M/0。第一个子密钥的子密钥就是m/0/1,以此类推。
定义了五个级别(通常都只有3级4级)
m / purpose'/ coin_type'/ account'/ change / address_index
m为固定,purpose目前在bip44预约使用44
coin_type:指不通币的种类0表明比特币,1表明比特币测试链,60表明以太坊,恒星币148,EOS194
完整币种类型号列表:https://github.com/satoshilabs
Account: 表明帐户索引
changge:常量0用于外部链,常量1用于内部链,就好比网页商0为想被爬虫爬到,1为不想被爬虫爬到。
因此0为想被钱包商展现,1不想被钱包商展现。
address_index:这就是地址索引,从0开始,表明生成第几个地址加密

总结:定义好路径再经过bit32算法生成相关的层级的公私钥,钱包商拿到助记词转换成seed也可经过必定的轮寻算法找到助记词下全部币种个数。spa

相关文章
相关标签/搜索