双花问题
如果Alice钱包里面有10美元,她可以去购买等值的物品。如果Alice去商店后,发现台灯和桌子都是10美元,那么她只能买其中一样东西。
而我们所说的双花问题,正好与之相反,同样的10美元,你可以购买两样东西。
不过,双花问题在我们生活中其实不会发生,因为你在购买东西的同时,也同时进行了支付(也就是说,这是个中心化系统)。换句话说,如果Alice花费10美元购买台灯,那么这10美元就不属于她了。
但是在分布式系统中,问题会有些不同。
对于分布式系统来说,交易记录会广播给网络中所有节点(也就是说,Alice会在网络广播交易信息,从而网络中的每个节点都会知道“Alice已经花费10美元来购买台灯”)。
每个节点都会记录这个交易信息,然后将信息传输给网络中的下个节点,并且这个过程会持续直到网络中的所有节点已经记录了这条信息“Alice已经使用了10美元来购买台灯”。
但是,在信息通过庞大网络进行传输的时候,以下问题也会出现:
• 当信息在网络中传播的时候,路径不同,并且在不同时间到达不同节点。
• 由于节点会失效,有些节点也许不能将信息传递给下个节点,然后这个消息就会丢失。
因此,在某个时间会发生这种情况,某些节点知道Alice已经花费了10美元购买台灯,但是某些节点却不知道这一消息。
对于那些不知道Alice花费10美元购买台灯的节点来说,这条信息还没有传达给他们;他们仍然会认为,Alice还有闲置的10美元可以购买任何其他东西。
因此,对于Alice来说,很可能她会向网络中传播另一个消息“Alice已经花费了10美元来购买桌子”,并且如果这个信息在“Alice花费了10美元来购买台灯”这个消息之前达到节点,那么这个节点就会认为Alice已经花了10美元来买桌子。
这就有可能造成这种情况,Alice能够花费10美元买桌子,并且花费同样的10美元来买台灯;这是违背常理的,因为Alice只有10美元,并不是20美元。
这就是双花问题。
双花问题会在分布式系统中出现,是因为交易信息在庞大的网络中传输需要花费时间。
由于网络中信息传输的时间差,无法保证信息达到节点的顺序和信息创建的顺序是相同的。
注意:有人会说,转账信息中会包含通用的时间戳,同时还有哈希值来保证数据的完整性,这就很容易解决转账信息会按照不同时间达到某个节点。
但是,Alice可以在签署信息之前造假时间戳,同时把第二条信息放入更早的时间戳,给网络造成疑惑。
从更深层次来看,现在网络处于不一致的状态,其中有些节点已经验证“Alice花了10美元买灯”,其他节点验证了“Alice花了10美元买桌子”。
为了解决网络中状态的不统一性(很少节点会验证某个交易,并且其他节点已经验证一个相反的交易),我们需要某个共识机制,确保交易的顺序,从而将网络带回统一的状态。
分布式账本技术和区块链技术的共识机制
“真理不是事情的真相或者原因。简单来说,就是每个人都同意这个事情。”
― Gregory Maguire, 坏女巫:新绿野仙踪
这种共识的形成有两种方法。
基于投票的共识(需要信任的联盟节点或者私有分布式网络,例如,超级账本):网络中的每个节点都是互相认识的,而且每个节点会进行投票,从而对交易进行验证。最后,通过多数人投票选举和担保政策(例如,实用性拜占庭容错算法)来实现交易,而且担保政策可以使得只要全网2/3节点通过的前提下,就可以让交易有效。
基于抽奖或者竞争的共识(公链或者无需信任节点网络,比如以太坊):网络中基于工作量证明或者权益证明选出的成员,可以决定交易是否有效,并且这个决定需要被全网都认可。无论谁赢得了这个奖励,全网都会同意由获胜节点验证的转账是有效的。
这种通过竞争选出的下个节点的方式,通常是通过解决加密数学难题来实现,例如工作量证明,或者是根据对网络投资的贡献,来得到更高的获胜概率,例如权益证明。
共识机制(不论是投票还是抽奖),都是让网络决定哪个交易是有效的。网络中所有的节点然后再去验证这个交易,这些只会通过有效交易的共识来进行处理。
有意思地是,有效交易可能并不是正确的交易。在我们的例子中,如果群体共识投票“Alice花费10美元买了桌子”作为有效交易,那么正确的交易“Alice花费10美元买灯”就会被网络所有节点认为无效。
其实,共识算法的目标并不是确定两个交易之间,哪个是正确的。共识算法是为了防止分布式网络中的双花问题(也就是说,在我们的例子中,通过共识机制,我们可以确保Alice可以消费10美元,并且只消费了一次);而且保证全网只会同意某个交易信息,并且任何不同的交易信息都会被网络认为是无效的。
在“无需信任的网络”构建“信任”
Bodhi:“你不信任我吗?”
Johnny Utah:“你需要去获得信任。”
— 惊爆点(1991)
通过工作量证明算法,获胜者可以通过解决数学难题,从整个网络脱颖而出,而且获胜者可以去决定网络中哪些交易是有效的,并成为区块链中下个区块的一部分。
但是问题来了,为什么我们需要节点互相竞争来解决复杂的加密数学难题,再选出获胜者? 也就是说,为什么我们需要复杂的工作量证明?任何节点可以被随机选择并称为下个获胜者吗(随机选择)?同时,这个节点还要被选举出来,并对有效的交易做出决定。
答案如下。
如果彩票获奖者并不是通过计算量选拔出来并且添加区块(或者有些代币是需要算力,例如权益证明),那么对于任何节点来说就会很容易将下个区块添加到区块链上。
这意味着很多人都可以添加他们认为的区块到区块链上,并且拥有最强算力的人能够扩大区块链,并且获得最长的链。
中本聪对这个问题的解决方案“在无需信任的网络中构建信任”,也是为了确保对于任何人或者团体(只要团体算力小于50%)都无法通过算力来控制整个网络,也就是控制区块链上区块的创建,同时维持区块链上最长的链。
因此,基本原理是,如果想在区块链中添加区块,需要通过难度很高的计算,并且引进某种机制来完成。这些机制中,最常见的,就是工作量证明算法。
但是,其实也有消逝时间证明(PoET)机制,这种算法需要在区块链上加入下个区块之前,“等待”一段时间,从而再次人为地将添加区块的计算难度变得很困难。
对于权益证明算法,代币的抵押机制可以选出创建区块的下个人,这也让任何个人都很难去持有足够的代币,来控制整体网络。