74

分布式和区块链系统中的双花问题:为什么我们需要工作量证明?

 6 years ago
source link: https://www.sandianzhong.com/news/20180822/n29245.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

双花问题

如果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)机制,这种算法需要在区块链上加入下个区块之前,“等待”一段时间,从而再次人为地将添加区块的计算难度变得很困难。

对于权益证明算法,代币的抵押机制可以选出创建区块的下个人,这也让任何个人都很难去持有足够的代币,来控制整体网络。


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK