上一回在《比特币(一)》中我们讲到:中本聪在设计比特币时,为了激励大家进行记账,安排了“转账手续费”和“打包奖励”,谁能够将自己的账本打包链接到区块链上,谁就能获得这些奖励。为了争夺打包权,每个用户必须进行“工作量证明”——计算一个复杂的数学题,谁第一个做出来,谁就能获得这份奖励。那么这回我们就来讲讲,这个复杂的数学题到底是什么。
注:本课内容为之前所作视频的文字稿,相应视频请见:
声明:本人从未持有任何比特币或其他数字货币,也未接受过任何比特币投资机构的资助,本文只从技术角度探讨比特币原理,不构成任何投资建议,不鼓励购买任何虚拟货币。
01
哈希函数
以前,我们曾经讲过生日碰撞——一个班级里有23名学生,就会有超过50%的概率有两个同学的生日在同一天。无论一个人的名字有多长,或者这个人是什么国籍什么民族,他的生日总是以年、月、日的形式构成,生日的长度是固定的。在计算机科学中,有一种运算与求某人的生日很像,那就是哈希函数——它能够将任意字符串转化成一个固定位数的数字摘要。
哈希函数有两个特点:
第一,无论输入的字符串有多长,输出的字符串长度都是固定的。例如美国国家安全局发明了一种哈希算法SHA256,它能将任意字符串输出成一个256位的二进制代码。而且,如果输入的字符串有一点点变化,哈希值都会变得面目全非。
第二,哈希函数的正向计算很容易,反向计算非常困难。举例来说,我们可以设计这样一种运算:将一个10进制数每个位上的数字三次方取和,再除以256取余数,再转化成二进制,这就是一种8位哈希函数。给定任意一个十进制数字,求出这个哈希值并不难;反过来,给出哈希值,问原来的数字是什么,却是非常困难的。
因为哈希值的这个特点,它被广泛用于计算机科学中,例如在校验、数字签名等领域都有应用。而中本聪在设计比特币时使用的工作量证明,也正是基于哈希函数。
数字签名的原理
02
工作量证明
明白了哈希运算,我们就可以来解释挖矿的具体过程了。
首先,区块链上每一个“块”都有头部信息两个部分。参与挖矿的矿工们会读取前一个区块的头部,再加上自己收集的账单、打包的时间戳、个人信息和随机数等其他内容,生成一个字符串。
随后,用户会对这个字符串进行两次SHA256的哈希运算,求出它的哈希值。
中本聪在《白皮书》中设计:只有那些计算出的哈希值小于某个值(从二进制数字上看,就是前几位数字都是0的哈希值)才是满足条件的,如果你找到了这个哈希值,那么就有资格把自己打的包链接到区块链上。
计算成功,顺利打包一个新块
此时,你给出了一个字符串和相应的哈希值,并向所有人广播,其他人经过检验确认了你的结果,于是你就可以将自己的数据链接到区块链上了。而你刚刚计算出的哈希值就是新的数据块头部,在下一轮比拼中,世界上所有的矿工都会读取你的数据块头部,加入到自己的字符串中,并疯狂进行下一轮的哈希运算。
可是,既然哈希值是无法反向计算的,矿工们又如何才能得到前n位都是0的哈希值呢?别无他法时,只有暴力破解。也就是:每个用户不停地改变自己字符串中的随机数,0、1、2、3……每次改变随机数后都对字符串做两次哈希运算和一次检验,直到尝试出那个符合条件的随机数和哈希值为止。它非常类似于暴力破解密码的过程。
需要指出的是:每个矿工在挖矿的时候,题目难度是不一样的。这是因为虽然每个矿工都读取了区块链上最后一个块的头部,但是每个矿工记录的账单信息、时间戳、个人信息等内容都是不一样的。所以,满足哈希值小于某个值这一条件,需要给出的随机数大小也不同。有些人运气好,有些人运气不好,所以计算的时间也有长有短。不过,平均来说,谁的计算能力更强,在单位时间内尝试的次数更多,谁就更有希望找到正确的哈希值成为幸运的矿工。
北美某比特币矿场
为了更加高效地进行SHA256运算,人们设计了专门的芯片ASIC矿机和GPU矿机,跟我们常用的CPU比起来,它们对这种低级而又重复性高的计算更加拿手。又因为它们耗电量非常大,所以大型矿场都建设在水电站旁边等电价相对便宜的地区。
CPU和GPU架构不同
03
 难度设置
中本聪设计比特币时,为了保证比特币不会滥发,要求每10分钟出现一个新的区块。可是,世界上的矿机越来越多,计算速度也越来越快,如何保证这个时间不变呢?这就涉及到难度设置的问题。
我们刚才说到:SHA256算法可以将任意字符串转化成一个二进制数,它的每一位要么是0,要么是1,每一种可能的概率都是50%。那么,如果要求一个哈希值的前n位是0,概率就是:
反过来说,平均计算2n次才能出现一次前n位都是0的哈希值。我们可以根据全球矿机的计算能力来确定数学计算的难度,保证打包的速度不会太快或者太慢。如果挖矿的人太少,这个n就会变小,让计算变得容易一些;如果挖矿的人太多,就将n调大,让问题变得困难一些。
比特币平均算力走势(来自QKL123)
举个例子,假如世界上有一万台矿机,每一台矿机的计算速度是14T/s——每秒钟可以进行14T(1T≈1012)次哈希运算。那么,全世界的矿机在10分钟(600秒)内可以进行的哈希计算次数是:
想要一万台矿机大约用十分钟时间算出结果,设置的难度n应该需要满足:
所以,此时应该把挖矿的难度设置为n=66,第一个通过改变随机数,让自己的区块的哈希值前66位都是0的的人,能够成功挖到矿。
2020年1月2日难度达到13.80T(来源BTC.com)
这回为大家介绍了比特币挖矿的具体过程,它根据计算机的算力,动态调整问题的难度,每十分钟出现一个获胜者,打包一个区块。不过,我们依然有许多问题没有解决,例如:在比特币交易中如何防止出现双重支付?如何防伪?关于这个问题,我们会在下一回给大家介绍,敬请期待比特币(三)比特币如何防伪?
美提课堂
美提课堂www.mtketang.com.cn致力于打造中学理科(数学、物理、化学、生物)精品课程,致力于让优秀的课程服务更多的学生,所有老师均毕业于北大、清华、北师大等著名学府,并拥有国内一流中学十年以上教学经验。目前,网校已经累计开设直播课、专题课、公开课、讲座等数千小时。只需一次点击,让你和名师0距离。了解更多资讯和视听课程快戳这个链接:美提课堂2021年寒假和春季直播课火热报名中!
客服小姐姐微信: mtketang0007
客服电话:400 155 2135
点击“阅读原文”进入美提课堂
继续阅读
阅读原文