- 数字货币:货币革命进行时
- (美)尼尔·梅塔 阿迪蒂亚·阿加什 帕斯·底特律
- 2388字
- 2021-04-01 17:09:11
随机值游戏
如何阻止这样的攻击?让攻击者很难比诚实的矿工更快地挖出区块是个办法。为此,中本聪的设计是,挖出一个区块需要花费非常多的时间。
中本聪的设计从交易着手。还没有被纳入区块链的交易被搁置在交易池等待审核和确认。交易池也被称为内存池。如果你想要挖掘一个区块,你就要从中选择几千条交易,验证它们,然后才能挖掘出你的区块。
在完成上述操作后,你所要做的就是为你的区块生成一个哈希,之后就可以把这个区块放在区块链上,并且得到你的奖励。
但是生成哈希并不是一件容易做到的事。哈希函数需要三个输入:前一个区块的哈希、交易和一个你选择的被称为随机值(nonce[5])的特殊数字。
问题是,输入不同的随机值将输出不同的哈希值,而只有当哈希以正确数量的“0”开头时,你才被允许将区块添加到区块链中。所以,如果你选择的随机值不能产生正确的哈希,你就必须一次又一次地尝试。
哈希函数使用3个输入来生成一个区块的哈希。
改变随机值会输出一个完全不同哈希。
猜测和检验
困难的是,哈希中没有明显的模式。无法根据哈希函数的输入预测哈希,即使对输入进行很小的更改,也会使输出完全不同。如果你用流行的MD5哈希函数处理单词“cat”,你会得到这个不可思议的输出:
d077f244def8a70e5ea758bd8352fcd8
而输入“bat”的MD5哈希大相径庭:
5f3f4681121b460e3304a1887f42f1c3
更重要的是,计算机运行的哈希函数往往是所谓的单向函数,即在给定输入的情况下很容易计算得到输出,但在给定输出的情况下,猜测输入几乎是不可能的。
人名的首字母缩写也是这样的。如果看到一个名字的首字母缩写为“GMD”,你无法马上猜出这个人的全名是什么。[6]
这意味着“破解”哈希函数的唯一方法是猜测所有的输出。所谓“破解”哈希函数就是根据输出计算出输入。强行破解计算机的哈希函数是非常困难的。破解比特币的SHA-256哈希函数将花费数百万年的时间,成本极有可能达到数百万美元甚至数十亿美元。[7]
换句话说,你不能试图逆向找到正确的随机值。所以挖掘一个区块的唯一方法就是一遍又一遍地猜,直到你猜中,这就像玩数字彩票一样。我们称之为随机值游戏。
动手试一试
模拟这个游戏很有意义。请访问网站md5online.org,它允许你通过MD5哈希函数运行文本。你的挑战是选择一个随机值,当它放在“hello”之后时,产生一个以“0”开头的哈希。
你可以从将随机值设为“1”开始,此时你的输入是“hello1”,文本“hello1”的MD5哈希是:
203ad5ffa1d7c650ad681fdff3965cd2
不行。你可以将“2”作为随机值,而文本“hello2”的MD5哈希是:
6e809cbda0732ac4845916a59016f954
这也不行。
如果你持续将随机值增加1,你最终会发现,第一个以“0”开头的哈希的随机值是“33”。文本“hello33”的MD5哈希是:
005529451481309d2b8f708bbb81ea41
成功!
这并不难,从数学上来说,这应该不难。MD5哈希函数是用十六进制编写的,这意味着每个数位上的值都是16个可能字符(0~9和a~f)中的一个。这意味着平均每进行16次尝试,你将获得一次成功。从“1”开始尝试是不糟糕的,因为我们试了33次才得到一个成功的哈希。
续表
输出的哈希实际上是随机的,所以必须不断猜测随机值,直到得到一个幸运的哈希。第一次输出成功的哈希的随机值是“33”。
现在设想一下,如果你必须选择一个随机值,让它产生一个至少有4个零开头的哈希。那么,每164个,即65536个随机值中只有一个随机值能产生一个成功的散列。如果你好奇的话,我们可以告诉你,产生有4个零开头的哈希的最小的随机值是105484,文本“hello105484”的MD5哈希是:
0000049898 d233686087e44bc2a1c97a
这个哈希的开头有5个零。别担心,我们是用代码来猜测到这个随机值的。
试图通过猜测正确的随机值来挖掘比特币就更难了。在撰写本书时,你每尝试一个随机值,只有大约66000000000000000000000(660万亿亿)分之一的概率挖掘一个区块。660万亿亿与宇宙中星星的数目相去不远。
“武装”自己
对于猜出一个合适的随机值并挖掘一个区块的困难程度,再怎么夸张地形容也不过分。如果你试着用一台MacBook运行挖掘算法,你可能要花200万年才能猜出一个成功的随机值。
出于一些显而易见的原因,专业的矿工不会使用笔记本电脑来挖矿。他们购买的是功能强大的计算机,这种计算机配备有专用的计算机芯片(ASIC[8]),这种芯片针对比特币的哈希算法进行了高度优化。用来挖矿的ASIC能以惊人的速度猜测随机值,但它们不能做其他事情。[9]
一个专门运行比特币哈希算法的ASIC。来源:维基媒体
这种配有ASIC芯片功能强大的计算机都非常强大,但成本高昂。一台售价2000美元的中型的、配备ASIC芯片的挖矿计算机每秒可以输出大约56万亿个哈希,这意味着它每秒可以尝试输入56万亿个随机值。但是由于很难猜测出正确的随机值,所以即使有这么强大的硬件,成功挖掘一个区块也需要大约38年的时间。
AntMiner S17 Pro是一台价值2000美元的计算机,每秒可以输出56万亿个哈希。来源:MiningCrate
换句话说,挖掘比特币就像用几十年的时间盲目地投掷一个有数万亿个面的骰子,希望你能幸运地掷到你想要的那一面。
工作证明
如果这个系统看起来很浪费金钱、时间、精力,那是因为它本身确实如此,而且它被设计成这样是为了让区块链不容易被劫持。
由于挖矿工作最困难的部分是猜出正确的随机值,而能否猜出正确的随机值取决于尝试的次数,因此拥有更强性能的计算机的人更有可能获得正确的随机值,从而挖出一个区块。你的计算机的性能越强大,你就能越快地挖出区块。
从另一个角度来看,你的挖矿速度与你控制的哈希能力的比例[10]成正比。
回想一下前面的恶意的矿工想开挖一条比合法区块链长得多的诈骗链的例子。要做到这一点,他的挖矿速度需要比其他所有诚实的矿工的速度总和还快,所以他需要控制世界上超过50%的哈希能力。这种攻击被称为51%攻击。51%攻击是可能实现的,但它的代价也是高昂的,这个恶意的矿工需要购买所有这些配备了ASIC的超级计算机。而且,除非这个恶意的矿工能够控制51%的哈希能力,否则他就没有机会篡改区块链。
简而言之,要挖掘比特币,你就必须投入大量的工作和资金。因为工作量庞大,比特币挖掘系统被称为工作证明。赢家是那些为挖矿付出最多努力的人。如果挖矿像运行几行代码一样简单,那么攻击者就可以很轻易地劫持区块链。而通过随机值游戏来加大挖矿难度是比特币阻止攻击者的一种方式。