甲肝病论坛

首页 » 常识 » 诊断 » 比特币二哈希函数与工作量证明
TUhjnbcbe - 2021/6/3 18:24:00

上一回在《比特币(一)》中我们讲到:中本聪在设计比特币时,为了激励大家进行记账,安排了“转账手续费”和“打包奖励”,谁能够将自己的账本打包链接到区块链上,谁就能获得这些奖励。为了争夺打包权,每个用户必须进行“工作量证明”——计算一个复杂的数学题,谁第一个做出来,谁就能获得这份奖励。那么这回我们就来讲讲,这个复杂的数学题到底是什么。

注:本课内容为之前所作视频的文字稿,相应视频请见:

比特币和区块链啥原理?矿机挖矿是啥意思?

比特币1

比特币交易如何防伪?私钥公钥地址啥意思?

比特币2

声明:本人从未持有任何比特币或其他数字货币,也未接受过任何比特币投资机构的资助,本文只从技术角度探讨比特币原理,不构成任何投资建议,不鼓励购买任何虚拟货币。

01哈希函数

以前,我们曾经讲过生日碰撞——一个班级里有23名学生,就会有超过50%的概率有两个同学的生日在同一天。无论一个人的名字有多长,或者这个人是什么国籍什么民族,他的生日总是以年、月、日的形式构成,生日的长度是固定的。在计算机科学中,有一种运算与求某人的生日很像,那就是哈希函数——它能够将任意字符串转化成一个固定位数的数字摘要。

哈希函数有两个特点:

第一,无论输入的字符串有多长,输出的字符串长度都是固定的。例如美国国家安全局发明了一种哈希算法SHA,它能将任意字符串输出成一个位的二进制代码。而且,如果输入的字符串有一点点变化,哈希值都会变得面目全非。

第二,哈希函数的正向计算很容易,反向计算非常困难。举例来说,我们可以设计这样一种运算:将一个10进制数每个位上的数字三次方取和,再除以取余数,再转化成二进制,这就是一种8位哈希函数。给定任意一个十进制数字,求出这个哈希值并不难;反过来,给出哈希值,问原来的数字是什么,却是非常困难的。

因为哈希值的这个特点,它被广泛用于计算机科学中,例如在校验、数字签名等领域都有应用。而中本聪在设计比特币时使用的工作量证明,也正是基于哈希函数。

数字签名的原理

02工作量证明

明白了哈希运算,我们就可以来解释挖矿的具体过程了。

首先,区块链上每一个“块”都有头部和信息两个部分。参与挖矿的矿工们会读取前一个区块的头部,再加上自己收集的账单、打包的时间戳、个人信息和随机数等其他内容,生成一个字符串。

随后,用户会对这个字符串进行两次SHA的哈希运算,求出它的哈希值。

中本聪在《白皮书》中设计:只有那些计算出的哈希值小于某个值(从二进制数字上看,就是前几位数字都是0的哈希值)才是满足条件的,如果你找到了这个哈希值,那么就有资格把自己打的包链接到区块链上。

计算成功,顺利打包一个新块

此时,你给出了一个字符串和相应的哈希值,并向所有人广播,其他人经过检验确认了你的结果,于是你就可以将自己的数据链接到区块链上了。而你刚刚计算出的哈希值就是新的数据块头部,在下一轮比拼中,世界上所有的矿工都会读取你的数据块头部,加入到自己的字符串中,并疯狂进行下一轮的哈希运算。

可是,既然哈希值是无法反向计算的,矿工们又如何才能得到前n位都是0的哈希值呢?别无他法时,只有暴力破解。也就是:每个用户不停地改变自己字符串中的随机数,0、1、2、3……每次改变随机数后都对字符串做两次哈希运算和一次检验,直到尝试出那个符合条件的随机数和哈希值为止。它非常类似于暴力破解密码的过程。

需要指出的是:每个矿工在挖矿的时候,题目难度是不一样的。这是因为虽然每个矿工都读取了区块链上最后一个块的头部,但是每个矿工记录的账单信息、时间戳、个人信息等内容都是不一样的。所以,满足哈希值小于某个值这一条件,需要给出的随机数大小也不同。有些人运气好,有些人运气不好,所以计算的时间也有长有短。不过,平均来说,谁的计算能力更强,在单位时间内尝试的次数更多,谁就更有希望找到正确的哈希值成为幸运的矿工。

北美某比特币矿场

为了更加高效地进行SHA运算,人们设计了专门的芯片ASIC矿机和GPU矿机,跟我们常用的CPU比起来,它们对这种低级而又重复性高的计算更加拿手。又因为它们耗电量非常大,所以大型矿场都建设在水电站旁边等电价相对便宜的地区。

CPU和GPU架构不同

03难度设置

中本聪设计比特币时,为了保证比特币不会滥发,要求每10分钟出现一个新的区块。可是,世界上的矿机越来越多,计算速度也越来越快,如何保证这个时间不变呢?这就涉及到难度设置的问题。

我们刚才说到:SHA算法可以将任意字符串转化成一个二进制数,它的每一位要么是0,要么是1,每一种可能的概率都是50%。那么,如果要求一个哈希值的前n位是0,概率就是:

反过来说,平均计算2n次才能出现一次前n位都是0的哈希值。我们可以根据全球矿机的计算能力来确定数学计算的难度,保证打包的速度不会太快或者太慢。如果挖矿的人太少,这个n就会变小,让计算变得容易一些;如果挖矿的人太多,就将n调大,让问题变得困难一些。

比特币平均算力走势(来自QKL)

举个例子,假如世界上有一万台矿机,每一台矿机的计算速度是14T/s——每秒钟可以进行14T(1T≈)次哈希运算。那么,全世界的矿机在10分钟(秒)内可以进行的哈希计算次数是:

想要一万台矿机大约用十分钟时间算出结果,设置的难度n应该需要满足:

所以,此时应该把挖矿的难度设置为n=66,第一个通过改变随机数,让自己的区块的哈希值前66位都是0的的人,能够成功挖到矿。

年1月2日难度达到13.80T(来源BTC.

1
查看完整版本: 比特币二哈希函数与工作量证明