写文,以及做任何事情的时候,都一定要保持节奏,如果实在不想写,就少写点,但一定要写。
有人说:比特币底层技术区块链,是最伟大的发明,堪比互联网。
也有人说:比特币白给我都不要。
到底比特币是什么?如何判断?难道我们能做的就是人云亦云?
如何能有自己的独立判断?
让我们一起《精通比特币》,走向数字货币新旅程。
每天早上10:24发文,欢迎关注支持,一起加油!
《精通比特币》一书,英文原名为Mastering Bitcoin ,国内译做《精通比特币》。本书中英文电子版链接如下,点击蓝色字可跳转阅读:
今天我们一起来读《精通比特币》一书的 第4章 密钥、地址、钱包的《4.3 用Python实现密钥和比特币地址》和《4.4 比特币钱包》。
4.3 用Python实现密钥和比特币地址
最全面的比特币Python库是 Vitalik Buterin写的 pybitcointools。
参考阅读:pybitcointools源码分析之比特币交易数据结构
以下内容涉及Python程序设计内容,只把标题放出来,区块链编程的学习者,请点击后面的蓝色字跳转链接,自行阅读原文获取相应代码。 知笔墨中文版,第4章 密钥、地址、钱包
以下均为Python代码(略)
例4-4 使用pybitcointools库的密钥和比特币地址的生成和格式化过
例4-5 运行 key-to-address-ecc-example.py
例4-6 使用在比特币密钥中的椭圆曲线算法的脚本
例4-7 安装Python ECDSA库,运行ec_math.py脚本
4.4 比特币钱包
4.4比特币钱包,通常通过有序文件或者简单的数据库实现,它是私钥的容器;另外一种制作私钥的途径是确定性密钥生成。
比特币钱包,只包含私钥,而不包含比特币。
每一个用户,可以拥有一个包含有多个私钥的钱包。
比特币钱包中,包含成对的私钥和公钥。
用户用私钥来签名交易,从而证明自己拥有比特币,可以进行相应的交易。
4.4.1 非确定性(随机)钱包
在最早的一批比特币客户端中,钱包只是随机生成的私钥集合。这种类型的钱包被称作零型非确定钱包。
如:比特币核心客户端,预先生成100个随机私钥,从最开始就生成足够多的私钥,并且每把钥匙只使用一次。这种类型的钱包有一个昵称“Just a Bunch Of Keys(一堆私钥)”简称JBOK。
随机私钥的情况,与避免地址重复使用的原则相冲突,每个比特币地址只能用一次交易。
这种钱包现在正在被确定性钱包替换,因为它们难以管理、备份以及导入。
4.4.2 确定性(种子)钱包
确定性钱包,又叫种子钱包。它包含通过使用单项离散方程,而可从公共的种子生成的私钥。
在确定性钱包中,种子足够收回所有的已经产生的私钥,所以只用在初始创建时的一个简单备份就足以搞定。
4.4.3 助记码词汇
助记码词汇,是一组英文单词序列,这个编码可用作种子对应的确定性钱包的随机数。
助记码代码,可以让使用者复制钱包更容易一些,因为它们相比较随机数字顺序来说,可以很容易地被读出来并且正确抄写。
虽然引入助记词之后,私钥变得友好多了,一个一个的英文单词虽然之间互相毫无关联,但是比一串随机的几十个字母和字符的组合要友好很多。
但是,每次抄写助记码词,我还是感觉很麻烦的。但是去中心化的东东,没有办法就这样,只有你能为自己负责,谁也不会为你负责,所以仔细抄写私钥助词词,如果丢失,那就是你拥有的比特币的世界末日无可挽回。
BIP0039定义助记码和种子的创建过程如下:
1.创造一个128到256位的随机顺序(熵)。
2.提出SHA256哈希前几位,就可以创造一个随机序列的校验和。
3.把校验和加在随机顺序的后面。
4.把顺序分解成11位的不同集合,并用这些集合去和一个预先已经定义的2048个单词字典做对应。
5.生成一个12至24个词的助记码。
4.4.4 分层确定性钱包(BIP0032/BIP0044)
确定性钱包,被开发成更容易从单个“种子”中生成许多关键的钥匙。
分层确定性钱包,包含从数结构所生成的钥匙。这种母钥匙可以生成子钥匙的序列。这些子钥匙又可以衍生出孙钥匙,以此无穷类推,如下图所示:
- 从种子中创造HD钱包
HD钱包,是一个128到256位的随机数,它从单个root seed(根种子)中创建。
根种子输入到HMAC-SHA512算法中,就可以得到一个可用来创造master private key(m) 和 a master chain code的哈希。
主私钥(m)之后,可以通过使用普通椭圆曲线m * G过程,生来成相对应的主公钥(M)。
链代码,可以给从母密钥中创造子密钥的那个方程中引入的熵,如下图所示:
- 私有子密钥的衍生
分层确定性钱包,使用CKD方程去从母密钥衍生出子密钥。CKD方程,即:child key derivation方程
- 使用衍生的子密钥
子私钥,可以用来做公共钥匙和比特币地址,之后它就可以被用那个地址来签署交易和支付任何东西。
子密钥、对应的公共钥匙以及比特币地址都不能从随机创造的密钥和地址中被区分出来。事实是它们所在的序列,在创造他们的HD钱包方程之外是不可见的。一旦被创造出来,它们就和“正常”钥匙一样运行了。
- 扩展密钥
一个扩展钥匙,包括一个私钥(或者公共钥匙)以及一个链码。
一个扩展密钥,可以创造出子密钥,并且能创造出在钥匙树结构中的整个分支,分享扩展钥匙就可以访问整个分支。
密钥衍生方程,可以被用来创造钥匙树上任何层级的子密钥。
这只需要三个输入量:一个密钥,一个链码以及想要的子密钥的索引。
密钥以及链码,这两个重要的部分被结合之后,就叫做extended key。
“extended key”,也被认为是“可扩展的密钥”,是因为这种密钥可以用来衍生子密钥。
-
公共子钥匙推导
略 -
硬化子密钥的衍生
因为扩展公共钥匙包含有链码,如果子私钥被知道或者被泄漏的话,链码就可以被用来衍生所有的其他子私钥。
一个简单地泄露的私钥以及一个母链码,可以暴露所有的子密钥。
更糟糕的是,子私钥与母链码可以用来推断母私钥。
为了应对这种风险,HD钱包使用一种叫做hardened derivation的替代衍生方程,打破母公共钥匙以及子链码之间的关系。
这个硬化衍生方程,使用了母私钥去推到子链码,而不是母公共钥匙。
这就在母/子顺序中创造了一道“防火墙”——有链码但并不能够用来推算子链码或者姊妹私钥。
- 正常衍生和强化衍生的索引号码
用在衍生方程中的索引号码是32位的整数。为了区分密钥是从正常衍生方程中衍生出来还是从强化衍生方程中产出,这个索引号被分为两个范围,索引号小于231就意味着子密钥是常规的,而大于或者等于231的子密钥就是强化型的。
- HD钱包密钥识别符(路径)
HD钱包中的密钥是用“路径”命名的,且每个级别之间用斜杠(/)字符来表示。
HD钱包路径的例子:
- HD钱包树状结构的导航
HD钱包树状结构提供了极大的灵活性。每一个母扩展密钥有40已个子密钥:20亿个常规子密钥和20亿个强化子密钥。而每个子密钥又会有40亿个子密钥并且以此类推。只要你愿意,这个树结构可以无限类推到无穷代,因此对无限的树状结构进行导航就变得异常困难。
所以BIP0043提出,使用第一个强化子索,引作为特殊的标识符表示树状结构的“purpose”。
基于BIP0043,HD钱包应该使用,且只用第一层级的树的分支,而且有索引号码去识别结构,并且有命名空间来定义剩余的树的目的地。
表4-9 BIP0044 HD 钱包结构的例子
- 使用比特币浏览器实验比特币钱包
依据第3章介绍的使用比特币浏览管理器命令工具,我们可以试着生产和延伸BIP0032确定性密钥以及将它们用不同的格式进行展示。
第四章《4.3 用Python实现密钥和比特币地址》和《4.4 比特币钱包》所有内容到此结束,明天我们开始《4.5 高级密钥和地址》的学习。
今天就到这里吧,明天我们继续,祝大家夏天快乐!
278/365
20180809首发简书
第四章整体结构:
第四章参考文献:
3、比特币白皮书原版:Bitcoin: A Peer-to-Peer Electronic Cash System
5、Scalers:《比特币白皮书解析 | 从零开始区块链》a
照搬的信念,无法抵御波动的冲击,只有行动铸就的思想体系,并在行进中不断修正,才能让我们不断变得更好。——Scalers《投资赚钱就是信念变现》
网友评论