02:从熵源到地址|比特币源码研读

本文简要说明从熵源到比特币地址的形成过程,知识点主要来源于《精通比特币(第二版)》的第四章(密钥和地址)和第五章(钱包)。

由一个随机的熵源(如,128 bits)到 34 字节的比特币地址,简单来说有 6步,如图上半部分所示;而具体到细节,则有几十步之多,如图下半部分。(图片很大,主要是书上的图,下文有局部大图,“比特币源码研读班”知识星球中也上传了)

比特币地址生成过程

1、熵源(entropy)

生成私钥的第一步也是最重要的一步,是要找到足够安全的熵源,即随机性来源。这里提到的“随机”一定得是真正的随机,不能是自己根据生日、名言、姓名等特定文本来编造;也不能自己写代码或使用编程语言提供的简易随机数生成器也获得一个随机数。

比特币私钥其实是一个数字。我们可以用硬币、铅笔和纸来随机生成一个私钥。方法是,掷硬币 256 次,用纸和铅笔记录正反面并转换为 0 和 1 ,随机得到的 256 位二进制数字可作为比特币私钥。

这个 256 位二进制数字是一个熵的实例,也是一个私钥,但是不容易记住,对用户不友好。毕竟 256 位是一个很长的数字,即使用十六进制表示也有 64 位之多(256 ÷ 4 = 64)。为了方便记忆,可以把熵源转化为助记词(见第 2 节)。

2、创建助记词(mnemonic)

创建助记词

助记词从由钱包使用 BIP-39 中定义的标准化过程自动生成的。钱包从熵源开始,增加校验和,然后将熵映射到单词列表。

六个步骤是:

  1. 创建一个 128 到 256 位的随机序列(熵)。
  2. 提出 SHA256 哈希前几位(熵长 / 32),就可以创造一个随机序列的检验和。
  3. 将检验和添加到随机序列的末尾。
  4. 将序列划分为包含 11 位的不同部分。
  5. 将每个包含 11 位的值与一个已经预先定义 2048 个单词的字典做对应。
  6. 生成的有序单词组就是助记词。

图中以 128 位熵源举例,检验和取 4 位,创建的助记词为 12 个单词。

取 2048 个单词是因为,每个部分都包含 11 位,2 的 11 次方是 2048 。这样就每一部分的值都对应于一个单词。

3、从助记词生成种子(seed)

从助记词生成种子

助记词又怎么和私钥联系起来呢?通过种子。

助记词表示长度为 128 至 256 位的熵。通过使用密钥延伸函数 PBKDF2 ,熵被用于导出较长的(512位)种子。所得到的种子用于构建确定性钱包,并得到其私钥。

密钥延伸函数有两个参数:助记词和盐。其中盐的目的是增加能够进行暴力攻击的难度。在 BIP-39 中,盐有另一目的,它允许引入密码短语(passphrase)。

从助记词生成种子分为三步:

  1. PBKDF2 密钥延伸函数的第一个参数是从步骤 6 生成的助记词。
  2. PBKDF2 密钥延伸函数的第二个参数是盐,由字符串常数“助记词”与可选的用户提供的密码字符串连接而成。
  3. PBKDF2 使用HMAC-SHA512 算法,使用 2048 次哈希来延伸助记词和盐参数,产生一个 512 位的值作为其最终输出。这个 512 位的值就是种子。

4、种子到主私钥(Master Private Key “m”)

种子到主私钥

HD钱包从根种子中创建,就是前一节中生成的种子。HD钱包的所有的确定性都衍生自这个根种子。任何兼容HD钱包的根种子也可重新创建整个HD钱包。上图展示了创建主私钥和主链编码的过程。

主私钥(m)之后,可以通过椭圆曲线 m*G 过程来生成相对应的主公钥(M)。链码用于从母私钥中创建子私钥的那个函数中引入熵。

5、HD钱包

HD钱包包含以树状结构衍生的密钥,使得父密钥可以衍生一系列子密钥,每个子密钥又可以衍生出一系列孙密钥,以此类推,无限衍生。

(这部分内容还有很多地方没搞懂,后期再补上笔记。。。)

6、私钥的 Base58Check 编码

非压缩私钥的 Base58Check 编码
压缩私钥的 Base58Check 编码

一个 256 位二进制的私钥,以十六进制表示是 64 位(256 ÷ 4 = 64),占用 32 字节。(如图)举例为:1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD 。

私钥的 Base58Check 编码过程如图,其中前缀是 0x80,对于压缩类型的私钥,要加后缀 0x01。接下来,计算两次 SHA256 ,取前四个字节做为校验和,添加到数据后面,再对结果用 Base58 字母表编码。

得到的 Base58Check 私钥,非压缩类型以 5 开头,压缩类型以 K 或 L 开头。

6、公钥到公钥哈希

公钥到公钥哈希

K = k * G 的结果中,K由一对坐标(x, y)组成,而 x 和 y 有数学关系,于是 y 可以略去,这就是压缩公钥。非压缩格式公钥用 04 作为前缀,压缩格式公钥以 02 或者 03 作为前缀。 非压缩格式公钥占 65 字节(1 + 32 + 32),压缩格式公钥占 33 字节(1 + 32)。

再将数据做一次 SHA256,做一次 RIPEMD160 运算得到公钥哈希,160 位,20字节。

7、公钥哈希到比特币地址

公钥哈希到比特币地址

以 160 公钥哈希加上前缀 0x00做为输入,计算两次 SHA256 取前四个字节加到后面,对这个 25 字节的数据用 Base58 编码,就得到了 34 字节的比特币地址,以 1 开头。举例:1PRTTaJesdNovgne6Ehcdu1fpEdX7913CK 。


参考资料:
《精通比特币(第二版)》 - 区块链研习社×云天明© 联合出品
掘金小册:《数字货币与区块链原理》 - 廖雪峰
《区块链开发指南》- 申屠青春 主编

不足之处,请批评指正,谢谢。

区块链研习社

区块链研习社比特币源码研读班 刘纪祥

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容