共识

防止双花要基于两点,第一是实现交易排序,这个是通过时间戳服务器完成的,第二是账本的不可篡改,因为双花攻击还有另外一种形式,那就是攻击者花币买了个东西,但是拿到东西后又去把对应的交易给篡改了,比如直接删除,或者修改数额等等。所以防止双花还要保证账本是不可篡改的,这是通过共识来达成的,这节的主角就是比特币的共识机制。

POW 共识机制的基本规则

比特币采用的是 POW 共识机制,咱们先聊聊它的基本规则。

首先聊聊什么是共识?比特币是一个人人平等的系统,如果有攻击者出来改动了账本,那么没有老大出来证明他的账本是无效的,而必须是其他诚实的节点一起达成共识,这样才能把错误的东西剔除。所以共识就是大家沟通后共同认可同一份数据。共识的方式很多,例如 POS 或者 POA,当然也包含咱们要聊的 POW 共识机制。

POW 共识机制是通过算力赛跑来争夺创建区块的权力。每隔十分钟,网上就只会产生一个区块,但是同时网络上每个节点都是平等的,那么这个区块到底要有谁去生成呢?每个节点都会收集一些交易并尝试生成区块。但是产出一个区块是非常难的,因为必须找到一个很难的数学问题的结果,才能出块成功。所以这是一个运算能力的赛跑过程,跑的最快的那个节点最有可能获得创建区块的权力。

那是不是一个节点只要配置了比其他人都快的一台机器,就可以每次都出块成功呢?也不是。因为数学问题的求解是带有随机性的。很像一个掷骰子游戏,谁先掷出符合系统要求的的点数,谁就胜出。所以最快的机器也只是有最高的概率可以率先算出结果,但是由于节点众多,每个节点的概率都是比较小的。

具体 POW 共识机制的数学细节,我们下一节中再展开。这里理解了这几点就可以继续下面的内容了。

最长链原则

实际上网络是有延迟的,所以如果有两个节点差不多同时都出块成功了,那么网络会很难判断是哪个块先出的,这样该如何处理呢?这就引出了最长链原则。

最长链原则的基本原理是这样的。如果我的节点收到一个区块后,紧接着又收到了一个区块。这两个区块又都是上一个区块的子区块,也就是说区块链已经分叉了。由于网络扩散也是不均匀的,所以其他节点先收到的哪个区块是不一定的。但是这不要紧,我可以继续在先收到的区块之后去添加新区块,但是也随时监听网络,如果另一个分支上首先出块了,那么我就会直接放弃运算,直接切换到那个分支上。节点出块的时候,要保证自己的块是在最长的链上的,不然即使出块成功,后续还是会被废弃的。

最长链原则也是共识机制的关键组成部分。

防篡改的能力

在 POW 机制之下,想要篡改数据就变得很难了。

来看看攻击者如何抹掉一条已有的交易。攻击者支付给 Alice 1个币,交易被打包到区块中之后,攻击者就必须在这个区块之前的一个区块拿出来,然后在那个区块上继续运算,也就是说,强行不遵守最长链原则,自己拼命的往自己的分支上去添加新区块。如果最终这条分支成了最长链,那么这次篡改就成功了。白皮书的第十一部分《计算》中有详细的数学推导,因为攻击者要对抗的是整个网络,所以一般来讲网络上诚实的算力之和要远远大于攻击者的算力,在这个条件下,攻击者想要独自创造出最长链来是非常难的。比如说,攻击者掌握了全网算力的十分之一,那么它第一个块比诚实节点出的早的概率是0.1,这个看上去可能性还是有的,但是一般比特币交易要等交易之上有六个块之后才会认为交易成功,那么这样攻击者需要连续六次都有着百分之十的好运才行,实际上能够追上概率就是0.1的6次方,已经小到可以忽略不计了。

话说回来,坏人也没有动力去攻击网络,而是会遵守网络的规则去挖矿获得收益。假设有一个人它掌握了全网算力的一半以上,比如 51%,那么这样他追上来的概率就是0.51的 n 次方了,换句话说,给定足够的时间,它是一定能做出最长链,也就是可以篡改账本成功的。但是这种情况也很难出现。首先,比特全网算力已经变得非常的大了,掌握51%的算力需要很多的钱。另外,篡改账本也不能凭空给自己添加根本没有的币,而只是能把已经转出的币再收回,所以收益很有限。而如果用这样的算力去继续添加区块,获得出块奖励,却可以获得非常多的币。就像白皮书《激励》部分所说

greedy attacker ... ought to find it more profitable to play by the rules, 贪婪的攻击者...会发现遵守规则会获得更多利润。

总之,账本被篡改的可能性是非常低的。

总结

白皮书《摘要》部分有这么一句话

The longest chain not only serves as proof of the sequence of events witnessed, but proof that it came from the largest pool of CPU power. 最长链不仅仅能够体现事件发生顺序的证明,而且能证明它自己是来自最大的算力池。

可见,最终被系统保留下来的区块链首先能够体现出交易发生的顺序,给防止双花提供了时间戳服务器,同时又保证了区块链数据的不可篡改,这样就解决了比特币要解决的双花问题。