45. 工作量证明:让区块链条唯一
上一章,我们已经将区块链条的数据结构大幅优化,验证数据的成本也大幅降低。但是,验证者必须持续同步区块头链。而即使持续同步区块头链,也有可能同步的是一条被专门定制的虚假链。我们的数字档案馆伪造一条虚假链的成本并不高,甚至可以为每个人都精心制造一条虚假链,也可以在一个全新用户加入时临时伪造一条链。
如何让任何人一看到区块链条,就相信这个链条是唯一且正确的那个呢?解决思路是,提升制造一条区块链条的成本,并且要让人们相信,我们没有余力制造另一条虚假的链。
具体怎么做呢?还是利用哈希函数。
哈希函数 SHA256 的输出结果,是一个介于 0 ~ 2^256 的整数。如果我们想要输出一个小于 2^200 的整数,那么就必须进行大量的尝试,也就是穷举。每一次尝试只有 1/2^56 的概率落在 0 ~ 2^200 这个范围内。大量的尝试,就意味着消耗大量的能源让计算机运算,意味着高昂的成本。而当制造一条链的成本吃掉了一个节点的大部分收入,节点便无法再伪造另一条链了。
一个小于 2^200 的哈希值,如果写成 64 位十六进制数,前面很多位都是 0。例如:
0000000000000005b16bfd313264c2f619ec35be3d1ebb336dcf8b8d4550ee38
0 的数量越多,说明需要尝试的次数越多。任何人看到这样的哈希值,都能感受到凝结于其中的“努力”。
我们现在就要求,区块头的哈希值,必须小于一个目标值,这个目标值小到节点必须耗尽大部分收入才能制造出满足要求的区块头。同时在区块头里添加一个可以填写任意数用来穷举的区域。
这样,我们的区块链条的每个区块头都凝结了大量的能源成本,以至于想要伪造一条虚假区块链条的成本变得非常高。
正是通过这种“自律”的方式,我们让用户更加相信链条是唯一的。
通过穷举任意数凑出小于目标值的哈希值的机制,我们称之为“工作量证明”,英文Proof Of Work,简称POW。字面意思就是,哈希值证明了工作量。
目标值又称“难度值”,但要注意,难度值越小,难度越大,所以这个概念容易混淆,要多加留意,本书尽量用“目标值”一词。
这一章,我们遗留了一个问题:目标值应该怎么定,才能让外界相信我们已经用尽了全力。