SHA256在比特币中的应用(二)
阿牛哥 Lv4

经过上一篇文章讲解,我们了解到SHA256的性质,在比特币中,中本聪巧妙地利用了SHA256的这些性质。

在比特币中,SHA256被用在两个地方:

  • 钱包地址生成

  • 区块链构建(挖矿)

比特币如何生成钱包地址

比特币公钥到钱包地址的转换过程

钱包地址的生成路径是:随机数->助记词->私钥->公钥->钱包地址。从随机数到私钥的生成过程已在《比特币的助记词生成规则详解》讲清楚;私钥到公钥会在将来非对称加密讲解;从公钥到地址的过程如下:

  1. 公钥取sha256哈希。举个例子,如下公钥

031452025d276c4a66447813fee8c9dd6cccfc2083819b24fb1bf7109d56792765

sha256的结果:

73a6435bc4af8d5eb0d0e69bde36a2f4de8326a453d95d5a7c4c6c952a2f4a5a

  1. 传入另一个哈希函数RIPEMD160,得到160位(20字节)结果:

594e814145db703e5fb3733ee7628eb6a6b06bbe

  1. 生成校验:对上一步结果加上网络号前缀00:

00594e814145db703e5fb3733ee7628eb6a6b06bbe

  1. 计算两次sha256:

eb0c484d52e989601d6ec14ba3ea394c042d7fa36211a0e48259f739d8207976

取开头四字节eb0c484d作为校验位

  1. 网络号 + 经过RIPEMD160的20字节 + 上一步4字节校验:

00594e814145db703e5fb3733ee7628eb6a6b06bbeeb0c484d

进行Base58编码得到最终地址:

199DBgyGaamWsyUgknzdhQW4qmxTv7nEc4

从计算过程可以看出,我们无法从地址反推出公钥,推出私钥就更不可能了。

区块链构建(挖矿)

所谓区块链就是由区块构成的链状结构,有点像链表,但不同的是,链表的每个区块头部包含下一个区块的内存地址;而比特币区块链中的区块头部包含的是上一个区块的哈希值。这些区块以哈希值指针挨个连接起来便是区块链。

比特币区块链结构

在比特币中,规定了区块的哈希值必须小于某个数值,为了获得这样的哈希值,负责记账(构建区块链)的矿工们不得不进行大量的sha256计算,用随机数(图中的nonce)一个一个地尝试。直到找到一个随机数,能使区块头整体的SHA256哈希值小于某个数字,像这样0002b6b2455f…。第一个尝试出符合条件的随机数的矿工便能获得记账权,将自己打包的交易数据作为一个区块加入到区块链中。

同一时刻矿工越多,意味着全网的算力越大,竞争就越激烈。按照比特币的设计,挖矿的难度就会增长,反映到区块链上,就是要求区块头的哈希值更小,hash前几个字节0更多,像这样000000b478cf…。对矿工而言,挖矿的难度就增加了。

这便是挖矿的基本原理。它建立在SHA256的不可逆性之上,无法预先设计一个数字使得输出哈希值为N个0开头,只能用大量随机数挨个尝试。

写在最后

比特币的设计确实很巧妙,用到了多种密码学工具。了解比特币的设计,也让我学到了不少加密方面的知识。