在这篇文章中,我们一起来看一看用纸和笔来人肉“挖”比特币的难度到底有多大。实际上,用于挖矿的SHA-256算法其实还算是比较简单的了,而且可以手工计算出来。毫无疑问,这个过程肯定要比GPU或CPU的速度慢上N倍,而且还会让人感觉有些不切实际。但是自己拿纸和笔手工完成一次挖矿算法的计算,确实可以让你更加深入地了解整个算法的工作机制。
下图显示的是我们用纸和笔手工计算的一轮SHA-256:
挖矿过程
挖矿是比特币系统整体安全的一个关键部分,挖矿的思路如下:比特币矿工将一系列比特币交易组织到一个区块中,然后重复执行N次加密散列计算(哈希计算),直到发现了某个特殊的哈希值为止。此时,区块已经成功被“挖”出,并且成为了比特币区块链的一个部分。实际上,计算任务本身是没有什么意义的,但由于发现一个成功的区块非常困难,这样就可以确保他人无法接管比特币系统了。更多关于挖矿的内容,请参考这篇文章【比特币挖矿】。
一个加密散列函数可以接收大量输入数据,并输出一个不可预测的输出值。对于比特币来说,它所使用的哈希散列函数名叫SHA-256,为了提供额外的安全保护功能,比特币使用了两次SHA-256函数,也就是所谓的双重SHA-256。
在比特币系统中,一次成功的哈希是以足够多的0开始的。就像你在日常生活中很少会见到以多个0结尾的手机号或者身份证号一样,我们也很难找到哪个哈希值是以多个0起始的。但是在比特币系统中,一切都是以指数倍形式增加的。目前,一次成功的哈希必须以大约17个0起始,所以哈希计算的成功率大约为1/1.4×1020。换句话说,寻找到一个正确的哈希值其难度比大海捞针还要难。
下面这张图片显示了比特币区块链中的一个区块以及相应的哈希。下图中,黄色标注的哈希字节用于生成区块哈希。大家可以看到,计算出来的哈希是以足够多的0开始的,而现在就已经挖矿成功了。
比特币所使用的SHA-256哈希算法
SHA-256哈希算法的输入数据块为512位(64字节),结合加密数据,并生成一个长度为256位(32字节)的输出值。SHA-256算法由64次相对简单的重复计算组成,下图显示的是其中一轮计算,其中以8个4字节数据作为输入,从A到H,执行一系列计算之后,并生成新的A-H的值。
具体的计算过程请参考中本聪的比特币白皮书【传送门】。
人肉挖矿
我们在下面这个视频中给大家演示了如何使用纸和笔人肉计算刚才所描述的SHA-256哈希计算。我自己实现了挖矿过程中的一轮哈希计算,整个过程大约花费了16分钟左右的时间。
视频地址:https://youtu.be/y3dqhixzGVo
下图显示的是比特币区块的最后一轮哈希计算,计算出来的结果用黄色部分标注出来了。末尾部分的多个0表示这是一次成功的哈希计算。
硬件挖矿
SHA-256散列计算中的每一个步骤都可以在数字逻辑(简单的布林运算和32位求和)中轻松实现,因此自定义的ASIC芯片可以在硬件上高效地实现SHA-256算法,并且能够在一块芯片上并行地进行数百轮哈希计算。下图显示的是一块挖矿芯片,它的计算速度为2-3 Ghash/秒:
#p#分页标题#e#
相比之下,莱特比、狗币以及类似的山寨币所使用的是scrypt哈希算法,而这种哈希算法是很难在硬件上实现的。它需要在内存中存储1024个不同的哈希值,然后以一种不可预知的方式来进行组合计算,并生成最终的值。因此,scrypt哈希算法跟SHA-256相比,它将需要更多的电路板以及存储器。你也可以从挖矿速度和硬件上了解到,毕竟挖这些山寨币的速度(scrypt)可比挖比特币(SHA-256)的速度要慢好几千倍。
总结
SHA-256算法其实是非常简单的,简单到足以手工计算出来。但是,用于对比特币交易进行签名的椭圆曲线算法却是很难手工进行计算的,因为它将会涉及到32字节整数的乘法运算。进行一轮SHA-256哈希计算用掉了我16分45秒的时间,根据这个速度来看,对一个完整的比特币区块(128轮)进行哈希计算将需要连续计算1.49天,即每天计算0.67哈希。相比之下,当前的比特币挖矿硬件每秒可以进行好几兆的哈希计算,这可比手动计算要快好多好多。毫无疑问,比特币人肉挖矿肯定是不切实际的。
后记
有一个Redit的读者问了我关于体能消耗的问题。其实整个过程并不需要消耗太多的体力,假设人体静息代谢率为1500大卡每天,手动计算哈希所消耗的能量大约为1000焦耳/hash。而硬件挖矿的平均消耗为1000兆哈希/焦耳。这也就意味着,人肉挖矿的能量成本是硬件挖矿成本的10^16倍左右。考虑到食物问题的话,一个普通的甜甜圈价格为0.23美金,能量为200卡路里。电费大概是0.15美金/千瓦时,因此每计算一个哈希的成本比硬件挖矿的成本要高出6.7×10^8倍。很明显,我并不打算依靠人肉挖矿来赚钱,而且我还没把计算所需的纸和笔的成本算进去呢。