AI > AI技术 > 详情

比特币中的哈希函数是如何工作的

发布时间:2023-05-16 发布时间:
|

长假最后一天,不知道假期结束甚至几年后回想起来是否还记得住祖国70岁生日的这段时光呢?是否那个时候还会觉得这七天过的有意义呢?除了国庆阅兵和几个让人值得刷一刷的电影,如果你除了娱乐还没有什么特别的记忆,不妨读下本系列文章一分钟了解比特币,告诉大家你学习到了当下最热门的有关比特币的技术知识,而且是有深度有内涵的那种哦。

哈希函数是一个只能在一个方向上计算的函数,这保证了区块链世界的清晰性和安全性。这也意味着,如果我们输入一个函数,我们就可以计算输出,但是只给输出却不可能逆向计算出输入。(在这个意义上,这一特性就像从私钥中获取公钥一样。)不过,我们现在不讨论它背后的数学原理或者它是如何工作的。我们需要做的就是理解它的作用,把它当成魔术看待。

我们可以选择自己所希望的哈希函数输出范围。例如,我们可以使用0到9之间的所有数字(但是只使用单个数字),0到99,0到100万,或者是像0到894这样的确定值。

为了更好地说明哈希函数是如何工作的,我们可以假设哈希函数的范围是0到9。无论我们输入的内容是什么,函数最后都会得出0到9其中一个数字。如果我们输入一个表情符号,它可能得出5。如果输入7859,可能会得到3。如果我们输入一篇文章,它可能会得出数字7。

比特币中的哈希函数是如何工作的

哈希函数总会输出一个数字,但我们不知道为什么。现在想象一下我们输入的是小说文本,但是在文末添加了一个额外数字7,你可能认为这种输入方式最后得出的输出数是我们在最后输入的东西,因此自己最后可能得到数字7。这样想可就大错特错了。

在哈希函数中,输入和输出没有可预测的相关性。这种不相关性可以有效防止黑客入侵,因为输入和输出无关就不能找出逻辑上的漏洞。

除了加密货币之外,哈希函数还用于在集中网页服务器上存储密码。网络数据库经常被黑客攻击,如果黑客能够做到成功破解数据库并读取每个人的密码的话,用户就要遭殃了。

为了让用户更安全,几乎所有的现代网站都会对用户的密码进行哈希处理,然后再将其存储到数据库中。这样一来,黑客没有办法仅凭数据库里读取的数字就算出用户的密码。因为从输入到输出每一个哈希函数都是一个非常复杂的代码,基本无法破解。黑客读取数字的时候也只能看到一系列毫无关联的随机数字。

但是,每次用户登录时,服务器都可以正确地验证他们提供的是否是真正的密码。因为服务器只接受正确的密码,并再次对密码进行哈希函数验证,查看它是否与存储在数据库中的哈希结果相匹配。在这种情况下,密码本身才是关键,获得“哈希”数对黑客来说毫无用处。

哈希函数猜谜游戏

在比特币领域,我们选择奖励给矿工发布区块的权利。矿工可以通过哈希函数来运行他们准备发布的区块,并且输出给定范围内的数字。接着矿工会把格式数据用于一个有序的、格式化的方式中,并开辟一块地方用于存储少量无用的垃圾数据(称为“nonce”)。这如同我们举办一个比赛,我们告诉玩家添加一个或两个随机文章的文本并运行它,通过哈希函数来找到与输出相匹配的具体数字。

本质上,我们是在反向操作——给定哈希输出,矿工需要找到合适的输入。但是,这不是不可能的吗?不可能的是用某种方法从输出中推断出输入。那么随机猜测是可能的吗?

让我们回到哈希函数的例子,它输出0到9之间的数字。想象一下,我们正在玩文本输入的哈希游戏,如果你编辑文本时用几句无意义的话,只要哈希到3,你就可以得到奖励。游戏很简单,因为从任何输入中得到3的概率是1 / 10。矿工只需要平均尝试五种不同的输入就能获得奖励。

一台速度很快的MacBook上的标准CPU每秒可以在哈希函数中插入88,000个猜测数值,所以实际上只需要几分之一秒的几分之一秒就可以得到答案。

如果有五十人都使用Macbook参加挑战,而且他们的竞争持续大约一个小时,你就可以用88000乘以60秒的数量乘以60分钟(假设有人可以做一个小时),然后乘以五十多的人数来计算可能量。由此可见,哈希函数的范围很大:从0到(88000 * 60 * 60 *50),范围从0到15840000000。你必须猜对才能得到奖励。

比特币使用非常大的数字来表示哈希函数的范围,所以对于玩家来说,即使玩家数量在不断增长,每人每天仍然需要用10分钟来运行这个猜谜游戏。一旦有人赢了游戏,他们写的新块就会被大众认可而发布。

随着挖矿消耗的电力越来越多,比特币网络也随之变化,并根据计算前几个区块的时间长短,动态提高每个区块的“难度”。显然不是说一个集中化的资源决定了这一点,而是每个矿工通过自己的计算决定的。

比特币价值越高,人们对它的需求越多,范围就越广,因此必须确保“游戏”在更多玩家加入的情况下仍然保持平等和广泛。

比特币实际上并没有调整哈希函数的范围来更改游戏的难易程度,而是使用了固定范围:2的256次方。然而,在比特币版本的挑战中,矿工们并不是为了匹配一个特定的数字,而是他们的哈希函数的输出必须在一定的范围内。

调整截止值可以降低挑战难度。例如,如果我们有一个范围为1到1000万的哈希函数,我们可以将截止值设为“2”,那么匹配的概率即为1 / 1000万。而输出必须等于“1”,矿工才能获胜。或者,我们可以把截止值设为500万,那么人们在第一次尝试中获得成功的几率达到50%。

在比特币系统中,矿工能在第一次尝试就解决问题的几率极低,远小于一千万分之一,但考虑到奖品,有人仍然会再坚持十分钟。

想想看:有了足够多的刮刮乐彩票,即使你买了几百张,你个人中奖的几率也很低。但是,只要有一张中奖的彩票,就一定会有人中奖。这种确定性和随机性取代了中央权威。

把“链”放在区块链中

一旦矿工成功地解决了上述难题,会发生什么?他们如何告知其余玩家?所有用户又如何接受这个新块呢?简而言之:经过这场比赛,我们如何才能最终确定一段明确的历史记录,以确保游戏的公平性和清晰度呢?

1. 每个块必须包含前一个块的哈希值

2. 拥有最多矿工信任并在上面继续工作的最长的块链,就是规范链

比特币中的哈希函数是如何工作的

总之,一旦在网络上发布了一个新的、有效的块,矿工就必须捡起这个新块并将它放到他们的链中,然后立即从头开始挖掘一个新的块。每个块必须包含前一个块的哈希值,这样就能确保区块链不断更新。

假设此时的链长为5个块(这是创建比特币后的50分钟——一个块10分钟)。这就意味着我们要让第6块包含第5块的哈希值。

但是假如说有人在我们之前挖掘出第6块,我们就得在挖掘第7块时将别人的第6块哈希值包含进来。我们不能一直浪费时间在第6块上,因为人们已经接受了六个区块是最长的链条,如果我们不赶紧的话,很快就会有第七个了。

这意味着如果我们想让它被接受并获得奖励,我们必须从头开始创建下一个块。而这个过程中的关键点是,一个块只在它之前的另一个块的引用中有效。我们所说的“在另一个块上”采矿是为了确保块与块之间相互联系。

如果两个块同时发布会怎样?矿工会选择其中一个来挖掘顶部,有可能在一段时间里,有两个链相互竞争。但是,在两条链内,一个会很快变得比另一个长,当另一个被抛弃的时候,这个链条会成为了规范。

现在我们可以看到重复消费是不可能的:在一个给定块上发布了几个块之后,该块中的交易实际上被“埋葬”了,不可能被还原或是记录到支付历史中。如果不撤消整个区块链,就无法撤消历史记录。

那么,如何撤销整个区块链呢?事实上,只有当你消耗的电力比其他所有人加起来还多的时候,你才有可能超过其他矿工。这被称为51%攻击,因为我们需要控制进入系统的51%的电力。如果说比特币有什么弱点的话,这恰恰是比特币的弱点。但是,只要这种情况不发生,系统就是安全的。(这也是比特币网络可能被摧毁的方式。如果一个参与者持续进行51%攻击,以一堆垃圾交易来逆转交易过程,那么系统将无法记录任何一个人的支付历史。)

但这还不算是所有问题中最严重的一个:为了破坏区块链生态系统,一个参与者仍然需要花费大量的电力,以尽可能快的速度挖掘比特币从而获取利润。而且,谁想要阻止这种情况(想想其他强大的竞争对手),谁就无法逃脱惩罚,然而值得庆幸的是,一个矿工的耗电量很难在区块链的所有电力加和中占到51%。

 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何避免以太坊智能合约的重入攻击