4

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

管理方法

非确定性钱包

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

确定性钱包

为了解决非确定性钱包需要逐个导入问题,提出了一套生成密钥对的方法,密钥由于原始的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也可通过一定的轮寻算法找到助记词下所有币种个数。


sawyerLi
187 声望12 粉丝

前端工程师,会用点node,用vue,react写过点东西,最近看看区块链。