主页 > imtoken下载手机版 > 《精通比特币》第四章“密钥、地址和钱包”解读

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

imtoken下载手机版 2023-02-18 05:36:02

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

阅读时间:约15分钟

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

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

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

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

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

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

4.2 私钥生成原理

私钥只是一个随机选择的数字,是一个256位的二进制数。 随机数数据来自密码安全的随机数生成器,即从一堆随机源数据中取出一串随机字节,通过SHA算法转换成256位的二进制数,然后验证是否选择随机数number在1和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 可能对应两个 y 值。 由于y在有限域中只有正数,所以这里的两个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字节值; 校验码是将公钥哈希和前缀拼接得到,然后经过两次SHA256比特币地址公钥私钥有什么用,取计算值的前4个字节。

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

比特币 私钥 密码_比特币地址公钥私钥有什么用_比特币 私钥

图2 比特币地址生成原理

当使用Base58check编码格式时,编码软件会计算原始数据的校验码,并与结果数据中包含的校验码进行比较。 如果两者不匹配,则表示有错误,地址也无效。

4.5 比特币钱包的分类

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

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

确定性钱包:又称种子钱包,顾名思义,所有密钥都可以通过一个种子来释放。 因此,在备份密钥或将其导入新钱包时,只需要备份种子密钥,其余密钥可按既定规则计算。 常见的确定性钱包,包括助记词表和分层确定性钱包。

助记词汇

助记词词汇表以英文单词序列为种子,对应确定性钱包的随机数。 单词的顺序就是钱包的备份,也就是对应的一组私钥。 助记词使用户更容易复制钱包,与随机数字序列相反,它们易于阅读和正确转录。

助记词代码和种子创建如下:

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

2、使用SHA256对随机序列进行哈希处理,取前几位作为校验和。 所选随机数的位数不同,校验和的字符数也不同。

3.在随机序列后面缝上checksum

4.将串联的值按顺序分解成11个不同的集合,用这些集合对应一个预定义的2048字词典

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

分层确定性钱包(HD Wallet)

分层确定性钱包通过单个种子生成主密钥,然后从主密钥以树形结构派生子密钥,子密钥再通过规则派生孙密钥。 以此类推,一个种子可以衍生出无限的子密钥,只需要备份种子就可以备份钱包中的所有密钥。

从种子推导出主密钥的过程:

比特币 私钥 密码_比特币 私钥_比特币地址公钥私钥有什么用

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

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

比特币 私钥 密码_比特币 私钥_比特币地址公钥私钥有什么用

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

4.6 总结

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