比特币区块链背后的数学(第2部分)
在“比特币区块链背后的数学”的下一部分中,我们将探讨如何创建比特币地址并解决一个常见的误解,即比特币地址=比特币钱包。在本系列的下一篇文章中,我们将探讨更多关于钱包结构和用途以及比特币交易背后的数学知识。
概括
让我们首先回想一下,在比特币曲线secp256k1上使用ECC允许我们从已知的生成点g和终点k(公钥)生成私钥,其中私钥是所需的点乘的数量。将g转换为k(有关此内容的完整说明,请参阅上一篇文章)。
这里需要注意的重要一点是输出是两个密钥,每个密钥长度为64个字符(256位),格式为十六进制。因此,允许的字符是字母AF和数字0-9。因此,私钥是一个示例:
5Kb8kLf9zgWQnogidDA76MzPL6TsZZY36hWXMssSzNydYXYB9KF
因此,一个示例公钥是:
02a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc
然而,这通常是混乱开始的地方。许多人经常将公钥与比特币地址混为一谈,甚至将术语“地址”和“钱包”混为一谈。让我们首先深入了解这个公钥如何成为比特币地址……
比特币地址生成
步骤1.在公钥上执行SHA-256
步骤2.对此结果执行RIPEMD-160
步骤3.使用版本字节进行扩展
步骤4.对结果重新执行SHA-256
步骤5.再次执行SHA-256(注意结果的前4个字节称为’校验和’
步骤6.取校验和并将其添加到步骤3结果的末尾。这是25位二进制比特币地址
步骤7.从强字节转换为base58
让我们打破这个……
SHA-256
SHA-256是一种算法,它接收任意长度的输入并对其进行散列以产生固定长度的结果 – 256位。重要的是,这是一个单向函数,因此无法“解密”结果并获得原始输入。
如果我通过SHA-256使用’taralovesbitcoin’输入,结果是:
55F4DF78531BF106C7732E652B35BBA8954F5FE3E062423825F13A969E472658
但是,如果我使用“taralovesbitcoin的输入小号 ”,结果是:
77BBEC1BC0A3CD2F16D6B3E718F62C8073A5EE89F634D443043D2E35E14F43B5
请注意,只需添加“s”即可获得完全不同的结果。这被称为“Avalanche效应”,其中输入的微小变化会对输出产生剧烈变化。
RIPEMD-160
正如您可能怀疑的那样,RIPEMD-160是另一种哈希输入的算法,并且可能毫不奇怪地给出其名称,产生长度为160位的哈希值。
鉴于输入’taralovesbitcoin’,使用RIPEMD-160的输出是:
98F1CEC950AF5E04D2A575C6587BE7AEBB9037AD
我们再次可以看到Avalanche效应,当输入稍有改变为“taralovesbitcoin 小号 ”
EE64B8841F3AA14B070B5CE4D0A1C0999F1854D7
您可能会问,为什么比特币协议使用两个加密货币哈希算法而不是一个。原因在于,如果RIPEMD-160和比特币的签名算法(ECDSA – 我将在本系列的下一部分中探讨)一起出现错误,它是一种确保方法,SHA-256增加了更高级别的安全性。因此,这是一种安全的支撑和安全带方法。
版本字节
版本字节是正在使用的比特币代码库的信号。它们以十六进制或前导符号(字母数字)提供,并说明地址的使用位置。例如:
- 主网上的地址将以00为前缀(如果是多重钱包,则为05) – 以下说明
- 测试网的地址将以6F为前缀
完整列表在这里
因此,步骤3要求版本字节表示将地址的类型和地址类型添加到结果的前面。
Base58
我们已经探索了公钥和私钥的十六进制表示法,但另一种显示地址(和键)的方法是转换为base58。因此,不允许使用字符0(零),O(大写字母o),I(大写字母i)和l(小写字母L)。这是因为它们看起来有多相似,从而消除了用户误读它们的任何可能性。英国的车牌采用了类似的方法来避免歧义。
工作示例
现在我们已经在地址生成过程中提取了关键术语,让我们重新运行示例公钥(取自此处):
0250863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352
步骤1.在公钥上执行SHA-256
0b7c28c9b7290c98d7438e70b3d3f7c848fbd7d1dc194ff83f4f7cc9b1378e98
步骤2.对此结果执行RIPEMD-160
f54a5851e9372b87810a8e60cdd2e7cfd80b6e31
步骤3.使用版本字节进行扩展
(00)f54a5851e9372b87810a8e60cdd2e7cfd80b6e31
步骤4.对结果重新执行SHA-256
ad3c854da227c7e99c4abfad4ea41d71311160df2e415e713318c70d67c6b41c
步骤5.再次执行SHA-256(注意结果的前4个字节称为’校验和’
(c7f18fe8)fcbed6396741e58ad259b5cb16b7fd7f041904147ba1dcffabf747fd
步骤6.取校验和并将其添加到步骤3结果的末尾。这是25位二进制比特币地址
(00)f54a5851e9372b87810a8e60cdd2e7cfd80b6e31(c7f18fe8)
步骤7.从强字节转换为base58
1PMycacnJaSqwwJqjawXBErnLsZ7RkXUAs
地址格式
每个加密货币都有一个生成地址的格式。比特币地址必须介于26-35个字符之间,并预先固定为1,3或bc1。值得注意的是,比特币地址预先固定为“3”,表示多重地址(在本系列后面会有解释)。
相比之下,以太坊地址长度为40个字符,并预先固定为0x,因此它们不在base58中。
从比特币协议获取其核心代码的Litecoin具有以相同方式派生的地址,但是对于主网络使用的版本字节将是30或者对于testnet而言是6F,并且pre-fiex是1或M.
瑞波地址有25-25个字符,在base58之内并且用r预先填充。
比特币现金,2017年8月1日主要比特币核心代码的分叉,也在base58并预先固定1,bitcoincash或q。
可能的地址数量
回到比特币(也适用于Litecoin和比特币现金),因为我们在SHA-256上使用RIPEMD-160,因此我们创建了256位公钥的160哈希。因此有
可以创建的可能地址。虽然这个数字可能感觉很小,但相比之下
整个Cosmos中的Atom(NB 2 15是c.5×2 12)。因此可以安全地假设有足够的地址满足所有要求。
地址和钱包之间的区别
作为回顾,使用ECC生成公钥和私钥对,我们可以结合使用SHA-256,RIPEMD-160和base58编码从公钥创建地址。因此,地址是公钥的表示。
该地址由交易中的加密货币用户提供以便接收资金,并且是区块链内的公共信息。在我们探索交易信息的下一篇文章中,我们将深入研究交易中显示的信息。
地址集合称为钱包。这些地址可以连接,例如它们可以从种子值生成,或者与不同的例如许多不相关的公钥/私钥对生成,但是如果它们一起存储,则我们将它们称为钱包。
我们将在下一篇文章中进一步探讨这一点,其中概述了钱包的不同结构和类型。