主页 > imtoken钱包app > 《精通比特币》第四章“密钥、地址、钱包”核心原理解读

《精通比特币》第四章“密钥、地址、钱包”核心原理解读

imtoken钱包app 2023-01-30 06:16:30

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

阅读时间:约15分钟

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

钱包:钱包是存放私钥的容器。 钱包只包含私钥,不包含比特币。 钱包定义了一组用于生成、管理和使用私钥签名的规则。

私钥:作用是签署交易。 由钱包通过随机熵源生成,或者钱包可以导入现有的私钥。

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

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

了解了以上四个概念的关系后,下面详细介绍私钥、公钥、地址生成和钱包分类的原理。

4.2 私钥是如何产生的

私钥只是一个随机选择的数字比特币的核心原理,一个 256 位的二进制数。 随机数据来自密码安全的随机数生成器,它从一堆随机源数据中取出一串随机字节,通过 SHA 算法将其转换为 256 位二进制数,然后验证选择的随机数是否是Between 1 and Between n-1(其中n为常数,略小于2^256),如果运算结果小于n-1,则为随机数,否则为需要重新选择的随机数直到选择的随机数满足验证条件。

当然,不同钱包选择的随机数个数可能不同。

私钥的表示方法

私钥的常见表示形式有十六进制、WIF 格式和 WIF 压缩格式。

十六进制格式的私钥是将原来的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,如下图所示:

《精通比特币》第四章“密钥、地址、钱包”核心原理解读

图1 同一点添加椭圆曲线,图片来自网络

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

公钥表示

公钥是从椭圆曲线计算出的坐标(x,y)。 知道x的值,就可以根据函数计算出对应的y值。 如果x和y同时存储为256位二进制,占用的空间会成倍增加,浪费存储空间。 因此,公钥的表示格式分为非压缩格式和压缩格式。

未压缩格式的公钥是指生成的公钥将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编码,增加了校验功能。

最终的比特币地址由三部分组成:版本前缀、公钥哈希和校验和。 版本前缀用于标识编码后的比特币地址。 例如使用Base58check编码时,比特币地址前缀为0,私钥编码前缀为128; 公钥哈希,即原始公钥经过SHA256和RIPEMD处理。 计算后得到的20字节的值; 校验码是公钥哈希和前缀拼接后,经过两次SHA256运算后,计算值的前4个字节得到的。

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

《精通比特币》第四章“密钥、地址、钱包”核心原理解读

图2 比特币地址生成原理

当使用Base58check编码格式时,编码软件会计算原始数据的校验和,并与结果数据中的校验和进行比较。 如果它们不匹配,则说明出现问题并且地址无效。

4.5 比特币钱包的分类

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

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

确定性钱包:也称为种子钱包,顾名思义,所有密钥都可以从单个种子开始。 因此,在备份密钥或导入新钱包时,只需要备份种子密钥,其余密钥按照既定规则计算即可。 常见的确定性钱包,包括助记词和分层确定性钱包。

助记词

助记词用一系列英文单词作为种子来表示,对应确定性钱包的随机数。 单词顺序是钱包的备份,也就是对应的一组私钥。 助记词使用户更容易复制钱包,因为与随机数序列相比,它们更容易被正确读取和复制。

助记词和种子创建如下:

1.创建一个128到256位的随机序列;

2. 使用 SHA256 散列这个随机序列,使用前几位作为校验和。 根据所选随机数的位数不同,校验和中的字符数也不同。

3.随机排序后连接校验和

4.将拼接后的值依次分解成11个不同的集合,用这些集合对应一个预定义的2048个词的字典

5、取出对应的单词,依次生成12到24个单词的助记词。

分层确定性钱包(HD Wallet)

分层确定性钱包从单个种子生成主密钥,然后使用主密钥派生树结构中的子密钥。 子密钥可以通过规则等方式衍生出孙子密钥,一个种子可以衍生出无限个子密钥,只有备份种子才能备份钱包中的所有密钥。

从种子中获取主密钥的过程:

《精通比特币》第四章“密钥、地址、钱包”核心原理解读

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

父私钥推导出子私钥的过程:

《精通比特币》第四章“密钥、地址、钱包”核心原理解读

如上图所示,父私钥推导出子私钥时,用父私钥生成父公钥,然后用父公钥、父链码和索引号计算输出一个512-通过单向值的位散列函数。 对应子密钥的256位,右边的256位对应子链码。 索引号用于标识子私钥对应的位置。

4.6 总结

通过本章的学习,您可以非常熟悉私钥、公钥和比特币地址背后的原理,同时了解钱包的本质以及如何管理私钥。 本章可为产品和技术人员在设计和开发数字钱包时提供参考。

本文首发于公众号“蒂娜说”。

币圈新闻,版权所有丨如未注明,均为原创丨本站受BY-NC-SA协议授权

转载请注明原文链接:《精通比特币》第四章“密钥、地址和钱包”核心原理解读