区块链基础知识篇——《精通比特币》第四章“密钥、地址、钱包”解读

通过本章的学习,可以帮你很具象的熟悉钱包的原理,以及私钥、公钥、比特币地址和钱包的关系。本章可以为产品和技术人员设计研发数字钱包时提供参考。

阅读时长:15分钟左右

4.1  私钥、公钥、地址和钱包的关系

钱包:钱包是私钥的容器,钱包中只包含私钥,不包含比特币,钱包定义了一套生成私钥、管理私钥以及使用私钥签名的规则。

私钥:作用是对交易进行签名。由钱包通过随机熵源生成,也可由钱包导入已有的私钥。

公钥:由私钥通过特定的椭圆曲线函数生成。由私钥可以推出公钥,但由公钥很难计算出私钥。

比特币地址:由公钥经过单向的双哈希函数生成,通过Base58check编码的方式呈现,比特币地址以数字1开头。

在了解以上4个概念的关系后,下面详细讲解私钥、公钥、地址的生成原理以及钱包的分类。

4.2    私钥的生成原理

私钥就是一个随机选出的数字而已,该随机数是一个二进制的256位数字。随机性数据来源于符合密码学安全的随机数生成器,即从一堆随机源的数据中取出一串随机字节,通过SHA算法转化成256位的二进制数字,再验证选择的随机数是否处于1到n-1之间(其中n是一个常数,略小于2^256),如果运算结果小于n-1,则随机数合适,否则需要重新选取随机数,直至所选取的随机数满足验证条件为止。

当然,不同的钱包选取的随机数位数可能不一样。

私钥的表示方法

私钥的常见表示法有十六进制、WIF格式、WIF-compressed格式。

十六进制格式的私钥,是将原始256位的二进制数据转换成了64位的十六进制数据表示出来;

WIF(Wallet Import Format),即钱包导入格式,指将私钥导入新的钱包中时,钱包用来识别私钥的格式,所以在钱包导出私钥时,会生成该格式的私钥。WIF格式的私钥以5开头,代表该格式的私钥需要生成非压缩格式的公钥。

WIF-compressed,即钱包导入压缩格式,该私钥的格式以K或L开头,将私钥导入到钱包后,代表钱包会用该格式的私钥生成压缩格式的公钥,以便正确解析比特币地址。

4.3公钥的生成原理

私钥通过椭圆曲线函数,可以计算得到公钥,这是不可逆的过程:K=k * G。其中k是私钥,G是椭圆曲线上定义的初始常数点,K是公钥。

比特币的椭圆曲线方程:y^2=x^3+7, 这条曲线定义在素数阶p的有限域内,可以想象为在一个极大的网格上定义了一系列复杂的散点。公钥K的计算运用了椭圆曲线的加法和乘法规则:k*G=G+G+……+G(k次),且该椭圆曲线上的两个点想加,其相加的和等于与椭圆曲线相交于另一点、然后在X轴上的反射点。那么G+G的值相当于从G点做切线后与曲线相交点,其在X轴上的反射点2G,如下图所示:

图一 椭圆曲线同点相加,图片来源于网络

公钥K定义为该反射点的坐标K=(x,y)。

公钥的表示方法

公钥是根据椭圆曲线计算出来的坐标(x,y),知道了x的值,可以根据函数求出对应y的值。如果同时将x和y用256位二进制存储的话,所占空间将增大1倍,存储空间上有些浪费。所以,公钥的表示格式分为非压缩格式和压缩格式。

非压缩格式的公钥,是指生成的公钥拼接了x和y的值,非压缩格式的公钥,以前缀04开头

压缩格式的公钥,是指生成的公钥中只包含了x的值,压缩格式的公钥,以前缀02或03开头。如上述椭圆曲线同点相加图示,同一个横坐标x可能对应2个y值,由于y在有限域中只有正数,此处的2个y值分别对应奇数和偶数,前缀02开头表示y是偶数,前缀03开头表示y是奇数

由私钥生成压缩格式的公钥时,会在私钥的后面拼接01,用以表明该私钥来自于一个较新的钱包,只能用来生成压缩的公钥。对于私钥本身,是不会改变原值而压缩的。这样做的目的是为了给导入私钥的钱包一个信号:到底是使用压缩格式公钥和比特币地址去扫描区块链,还是使用非压缩格式公钥和比特币地址。

4.4比特币地址

比特币地址是将公钥经过双哈希,得到公钥哈希后,采用Base58check编码的形式展示。比特币地址以1开头。

Base64编码是将任意的一长串输入转化成特定长度的数字和字母组成的表示法,其编码字符使用了26个小写字母、26个大写字母、10个数字和两个符号+以及/,Base58编码舍弃了一些容易错读和混淆的字符,其不含数字0,小写o、大写O、小写i、大写I以及+和/两个字符。Base58check编码采用的是Base58编码,同时加入了校验的功能。

最终的比特币地址由版本前缀、公钥哈希和校验码3部分组成。其中版本前缀用来标识编码后得到的是比特币地址,如采用Base58check编码时,比特币地址的前缀是0,私钥编码的前缀为128;公钥哈希,即将原始公钥经过SHA256和RIPEMD计算后得到的20字节的值;校验码,是由前缀拼接公钥哈希后,经过2次SHA256,取计算后的值的前4个字节得到。

比特币地址的生成原理,如下图所示:

图二 比特币地址的生成原理

使用Base58check编码格式时,编码软件会计算原始数据的校验码和结果数据中自带的校验码进行对比,二者不匹配则表明有错误产生,那么这个地址也是无效的。

4.5比特币钱包的分类

钱包是用来管理私钥的容器。比特币钱包分为非确定性钱包(随机)钱包和确定性(种子)钱包。

非确定性钱包:由钱包预先随机生成N个私钥,每个私钥一旦使用,需要单独备份,当密钥足够多时,很难管理、备份和导入到新钱包,所以这种钱包使用起来很不方便,正被确定性钱包替代。

确定性钱包:又称种子钱包,顾名思义,即通过一个种子即可推出所有密钥。所以,在备份密钥或导入到新钱包时,只需要备份种子密钥即可,剩余的密钥可以根据既定规则推算出来。常见的确定性钱包,包含助记码词汇以及分层确定性钱包。

助记码词汇

助记码词汇是用英文单词序列代表作种子,来对应确定性钱包的随机数。单词的顺序就是钱包的备份,也就是对应的私钥集合。助记码词汇可以让使用者复制钱包更容易一些,它们相对于随机数字顺序来说,可以很容易的被读并且正确抄写。

助记码和种子的创建过程如下:

1.创造一个128到256位的随机顺序;

2.使用SHA256哈希该随机顺序,取前几位作为校验和。所选取的随机数的位数不同,校验和的字符数也不相同。

3.把校验和拼接在随机顺序的后面

4.按顺序把拼接后的值分解成11位不同的集合,并用这些集合去和一个预先已经定义的2048个单词字典做对应

5.取出对应的单词,按顺序即可生成一个12至24个词的助记码。

分层确定性钱包(HD钱包)

分层确定性钱包,是通过单个种子生成主密钥,再由主密钥以树状结构衍生子密钥,子密钥又可以通过规则衍生出孙密钥,以此类推,一个种子可以衍生出无穷个子密钥,而且备份时只需备份种子即可将钱包中的所有密钥备份。

由种子衍生主密钥的过程:

如上图所示,由随机数生成种子后,通过单向哈希函数,输出512位的值,其中左边的256位做为主密钥,右边的256位作为主链编码。

由父私钥衍生子私钥的过程:

如上图所示,父私钥衍生子私钥时,先由父私钥生成父公钥,再由父公钥、父链编码和索引号通过单向哈希函数计算输出512位的值,左边的256位对应子密钥,右边的256位对应子链编码。其中索引号用来标识子私钥对应的位置。

4.6总结

通过本章的学习,可以很具象的熟悉私钥、公钥和比特币地址的背后原理,同时了解钱包的本质及其管理私钥的方式。本章可以为产品和技术人员设计研发数字钱包时提供参考。

本文首发于微信公众号“Tina说”:转型区块链,来这里就对了。

推荐阅读

区块链基础知识篇——《精通比特币》第三章“比特币客户端”解读

区块链基础知识篇——《精通比特币》第二章“比特币的原理”解读

区块链基础知识篇——比特币经典书籍《精通比特币》第一章解读

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

推荐阅读更多精彩内容

  • 一、快速术语检索 比特币地址:(例如:1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV)由一串...
    不如假如阅读 15,882评论 4 88
  • 原文地址 https://mbinary.coding.me/introduction-to-bitcoin.ht...
    mbinary阅读 5,077评论 0 4
  • 钱包 - 比特币开发指南 原文链接: https://bitcoin.org/en/developer-guide...
    terryc007阅读 2,881评论 0 7
  • 谁是lucky呢 Lucky是我养的第一条狗,从八周大的时候抱回来,一直养到三岁半,几乎串连了我整个留学生涯,是我...
    94e283042770阅读 732评论 2 2
  • 有一天约我去跑步,但是当时和姐姐看电影,就放了他鸽子。他好像有点生气,电影快结束的时候,他问我还在看?我说是,他说...
    小鹿砰砰阅读 290评论 0 0