主页 > token.im官网 > 比特币(二)哈希函数和工作量证明

比特币(二)哈希函数和工作量证明

token.im官网 2023-02-08 06:09:01

01

哈希函数

之前,我们讨论过生日冲突——一个有 23 名学生的班级比特币计算过程,有超过 50% 的几率会出现两个我同学的生日在同一天。不管一个人的名字有多长,无论他是什么国籍或国籍,他的生日总是以年、月、日的形式出现,而且生日的长短是固定的。在计算机科学中,有一种类似于查找某人生日的操作,那就是哈希函数——将任意字符串转换为数字的固定数字摘要。

哈希函数有两个特点:

首先,无论输入字符串有多长,输出字符串的长度都是固定的。例如,美国国家安全局发明了一种哈希算法 SHA256,可以将任意字符串输出为 256 位二进制码。另外,如果输入的字符串有一点点变化,hash值也会变化得面目全非。

第二,哈希函数的正向计算容易,反向计算非常困难。例如,我们可以设计这样一个运算:取一个十进制数的每一位数字的三次和,除以256,取余数,转换成二进制。这是一个 8 位散列函数。 给定一个任意十进制数,不难找到哈希值;反之,给定哈希值,很难问出原来的数字是多少。

由于哈希值的这一特性,它被广泛应用于计算机科学,如验证、数字签名等领域。中本聪在设计比特币时使用的工作量证明也是基于哈希函数。

数字签名的原理

02

工作证明

了解了Hash运算,可以说明挖矿的具体过程。

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

然后,用户将对该字符串执行两次 SHA256 哈希运算以找到其哈希值。

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

计算成功,新区块打包成功

至此,你已经给出了一个字符串和对应的哈希值,并广播给大家,其他人已经验证了你的结果,所以你可以将你的数据链接到区块链上。而你刚刚计算出来的hash值就是新的数据块头。在下一轮比赛中,全世界的矿工都会读取你的数据块头,将其添加到自己的字符串中,然后发疯。一轮哈希。

但是,既然哈希值不能逆向计算,那么矿工如何得到前n位全为0的哈希值呢?没有其他办法的时候,只有蛮力。即:每个用户不断地改变自己字符串中的随机数,0、1、2、3... 改变随机数后,对字符串做两次。进行哈希运算和校验,直到尝试了满足条件的随机数和哈希值。这和暴力破解密码的过程非常相似。

需要指出的是,每个矿工在挖矿的时候,问题的难度是不一样的。这是因为虽然每个矿工读取区块链上最后一个区块的头部,但每个矿工记录的计费信息、时间戳、个人信息等都是不同的。因此,要满足哈希值小于某个值的条件,需要给出的随机数的大小也是不同的。有的人运气好,有的人运气不好,所以计算时间各不相同。然而,平均而言,谁拥有更多的计算能力并且在单位时间内进行更多的尝试,谁就有更好的机会找到正确的哈希并成为幸运的矿工。

北美的比特币矿场

为了更高效地进行SHA256运算,专用芯片ASIC矿机和GPU矿机,相比我们常用的CPU,在这种低级、高重复性的计算上更胜一筹。而且由于消耗大量电力,大型矿井建在电价相对便宜的地区比特币计算过程,例如水电站旁边。

CPU 和 GPU 架构不同

3

难度设置

中本中本聪在设计比特币时,为了保证比特币不会被垃圾邮件,每10分钟就需要一个新区块。但是,世界上的矿机越来越多,计算速度也越来越快。如何保证这个时间不变?这就涉及到难度设置的问题了。

我们刚才说了:SHA256算法可以将任意字符串转换成二进制数,每一个都是0或者1,每一个可能的概率都是50%。那么,如果要求哈希值的前n位为0,则概率为:

反之,平均需要2n次计算才能得到一个前n位全为0的hash值。我们可以根据全球矿工的算力来判断数学计算的难易程度,保证打包速度不会太快或太慢。如果挖矿人太少,这个n会变小,计算更容易;如果挖矿的人太多,增加n会使问题变得更加困难。

比特币平均算力趋势(来自QKL123)

例如,如果世界上有10000台矿机,每台矿机的计算速度为14T/s - 14T(1T≈1012)每秒可以进行哈希运算。那么,世界上的矿机每秒可以进行10分钟(600次哈希运算)。每秒可以进行哈希计算的次数)为:

如果要10000台矿机在十分钟左右计算出结果,那么设置难度n应该满足:

所以,此时的挖矿难度应该设置为n=66。第一个改变随机数,使自己区块哈希值前66位全为0的人,就可以成功挖到矿了。

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

这次给大家介绍一下比特币挖矿的具体流程。它根据计算机的计算能力动态调整问题的难度。每十分钟,就会出现一个获胜者并打包一个区块。但是,我们还有很多问题没有解决,比如:在比特币交易中如何防止双重支付?如何防止假冒?下次我们会为大家介绍这个问题,敬请关注比特币(三)比特币如何防伪?