树图区块链相关说明

背景

最近在寻求提升区块链交易TPS的方案,注意到目前有采用DAG结构来实现出块并发的方案来实现提高交易TPS。这里发现Conflux项目的树图区块链采用的就是DAG结构,在这里把方案的出发点,解决之道进行相关阐述。

相关阐述

为何全序?

所谓交易全序指的是交易在所有节点上的顺序是确定的、一致的。例如A有10个币,转给B 7个币,转给C 5个币,这两个交易如果顺序不确定则得到的结果也是不确定的,这个在比特币上是不允许的。

比特币中几种安全攻击

双花问题

假设A要同时给B和C同样的交易,也就是同一个币花费两次,称为双花问题。共有三种可能实现双花:
第一种可能,让A去验证同时带有两个相同交易的一个block。假设A拥有百分之一的计算能力,那么A有可能幸运的验证出这个block。但是,这个双重花费将会马上被其他节点发现验证并且拒绝,尽管A解决了工作证明的难题,但是区块无法上链确认。

第二种可能性,A试图分别公布两个交易。A可能给一部分挖矿者公布一个交易,给另一部分挖矿者公布另一个交易,A希望让两个交易都得到验证。这种情况下,因为交易是全序的,一个交易完成后,另一个交易会被其他节点验证拒绝,网络最终只会确认其中一个交易。所以这个也不是问题。

第三种可能,A = B,也就是说A试图将一个币给C,同时A又将那个币给A自己,因为A自己可以有多个账户。这种情况下,A的策略是等到C接受了这个比特币,也就是在交易在最长的blockchain中被确认6次之后。A再试图去解决另外一个拥有A发给自己的交易的那个block分支。但是,这个时候A已经比最长的blockchain晚了6步。A很难跟得上最长的分支。其它的正常挖矿节点不会帮助A,因为它们都需要在最长的分支上工作才能得到奖赏。除非A在解决工作证明的时候能够比网络上其它节点结合起来还快(也就是说A有多于整个网络50%的计算能力)。当然,A可能会偶然幸运,在百分之一的算力的情况下能解出一个block,但是同时赶上6个块的话相当于1/100^6 。这种情况概率可以说是几乎为0。
在这里插入图片描述

分叉问题

两个挖矿者几乎同时挖出区块,这时blockchain上会产生分支。它们会同时公布到网络里,有些节点在A分支上更新它们的blockchain,另些节点用B分支更新它们的blockchain。

树图区块链相关说明_第1张图片
这种情况,交易会乱序,谁有哪个比特币也就不清楚。比特币消除分支的规则是这样的:如果分支情况出现,那么网络上的节点继续保持两个分支,任何情况下,矿工只在最长的blockchain上工作。
有一些矿工先收到block A,另一些矿工先收到的是block B。那些收到block A的矿工将要继续沿着A的分支挖矿,而其他矿工在Block B的分支挖矿。假设在B分支上的矿工先挖到下一个block:
树图区块链相关说明_第2张图片

当矿工收到这个消息后,在A分支的矿工会注意到现在B分支是最长的,于是就会转换到B的分支。在A分支上的工作就会迅速的停止,这样矿工就会都在同一个顺序的blockchain上工作了。然后block A就会被忽略。当然,所有在block A里面的待定交易将会继续保持待定状态,随后会在B分支上被放到新的block里,这样,所有的交易最终还是会被验证的。
同理,如果在分支A上的矿工先挖到下一个block,那么在B分支上工作的人就是停止,转到A分支上。
这个过程保证blockchain有统一的顺序。在比特币中,一个交易能不算作确认直到 :a、它存在于最长的分支中的block里;b、至少有5个验证过的block在其后面得到验证。这种情况,我们称为这个交易有了“6次确认”。

链式全序带来的问题

区块无法并发

由于矿工同时挖出区块,会有一个分支的区块被舍弃,导致出块无法并发,进而导致比特币的TPS非常低,一般为几笔每秒。比特币想要提高交易频率,两种方法:a、增加每个区块包含的交易数;b、提高出块的速度。
这两种方法会导致:a、区块增大,网络传播时间变长;b、出块的时间变短。这就使得一个新块在产生以后还来不及传播到全网就会有其他的节点产生另外的新块,于是就在区块链上产生了分叉。虽然整个系统最终会收敛到某一个最长的分叉上,但是出块率和出块大小越大的话,分叉的情况就会越严重,分叉也会进一步出现在已有的分叉上,所以最终就是有很多的分叉。
这带来两个问题。第一,这些分叉浪费了网络和计算资源,因为只有最长链中的区块才被认为是有效的。第二,它危害了安全性,因为整个区块链里的最长链变短了,这使得攻击者只需要少于50%的算力就可以产生出恶意的最长链。

树图的解决之道

树图区块链需要解决交易的全序,安全性(50%算力攻击),提高交易频率这三个问题。

如何实现全序?

树图区块链相关说明_第3张图片

首先来了解树图的结构,树图的实现主要通过父边和引用边来构建。如上图所示,每个区块都有一个指向它的父亲区块的父边,每一个区块还可以有多个引用边。这个引用边主要是记录和表达区块之间的顺序。比如,一个节点产生区块E的时候,链上已经有了区块D,而且此时D没有任何一个其他区块引用它。那么这个节点可以给E加上一个引用D的边来表示D是在E之前产生的。
首先,这些节点先在树图中决定一个一致的主链,然后,再根据这个主链来决定一个一致的区块的全序。
为了决定主链,使用Ghost规则。具体来说,从创世块开始,迭代的从孩子区块中选择下一个在主链上的区块。选择的规则是挑选拥有最大子树的孩子区块。比如,区块A和区块B是创世区块的两个孩子区块。A的子树有6个区块,B的子树有5个区块。所以我们选择区块A作为紧接着创世区块的主链区块。相应的我们根据相同的规则,将区块C,E,H,都选进了主链。如下图所示:
树图区块链相关说明_第4张图片
为了产生一个新的区块,一个机器节点首先选择主链上的最后一个区块作为新区块的父亲,然后这个新区块再把所有已经收到但还没有被其他区块所引用的区块引用起来。这里之所以使用Ghost规则而不是最长链规则来选主链,是因为Ghost规则中所有的区块,包括那些在分叉上的区块,都会对主链的选择做出贡献。这样的话,就保证了只要攻击者的算力没有超过50%, 就无法改变由诚实节点确定的主链。
现在我们有了让所有机器节点对主链产生共识的机制。那接下来,这些节点如何对区块的全序达成共识呢?为了做到这一点,引入一个Epoch的概念。在主链上的每一个区块就确定了一个Epoch。在分叉上的区块属于哪个Epoch,是由第一个产生在它之后的主链区块所在的Epoch决定的。比如,区块D属于Epoch E,因为D最先被E引用,所以产生在E之前,但是D并不产生在C之前。
首先按照Epoch的顺序来给区块排个序。然后在每一个Epoch内部,再按照拓扑排序来确定区块的顺序。如果出现平局的情况,再根据区块的哈希值来打破平局。然后在每个区块内部,按照交易在区块里所在的位置来排序,这样就实现了交易的全序。如下图所示:
树图区块链相关说明_第5张图片

怎么保证安全?

树图区块链相关说明_第6张图片

双花问题

同比特币一样,要想双花,共有三种可能。

第一种可能是将同样交易打到同一区块中,这个区块会被其他节点验证,位于后面的重复交易会无效掉。

第二种可能,将同样交易打到不同区块中,同样位于后面区块的该交易会被其他节点验证,不能被通过,会被无效掉。

第三种可能,就是我们提到的算力攻击了,具体地,一个攻击者如果想逆转在账本中的一个交易,比如交易Tx4。为做到这一点,一个攻击者需要产生一个交易Tx4的双花交易,打包到一个区块里面,并且将这个区块在区块的全序中插入到区块B的前面。但攻击者很难做到这一点,主要有两个原因:

  • 第一个原因,除非攻击者能够改变主链,不然他不能够逆转交易,因为交易的顺序是由主链来决定的。比如一个攻击者想把一个块插在靠前的位置,他能做就是在一个很早的Epoch里面的区块后面接着产生新块。但是只要这个块不在主链上,它就最终还是会属于一个很晚的Epoch。因为当一个诚实的新块产生以后,它会通过引用边把这个攻击者的区块给拉到新的Epoch里面。
  • 第二个原因,如果攻击者没有超过50%的算力,他就没有办法改变主链。假设区块A是一个主链上的块,一个攻击者想要用区块A’来取代A在主链上的位置。那么所有攻击者产生的块都会在A’的子树下面,然而所有诚实的节点所产生的块都会在A的子树下面,这样的话,攻击者就需要超过50%的算力才能让A’的子树超过A的子树。根据理论分析,A’能够取代A的概率是随着时间的增加而指数下降的。

分叉问题

树图允许区块分叉,即允许区块并发产生,并保证了交易的全序。提高交易频率的同时并不降低安全性。

树图如何提高交易速度?

区块的产生可以并发,分支的区块不会被舍弃。并保证了交易的全序。提高交易频率的同时并不降低安全性。

树图的缺点

各个节点维护图的信息相比链式结构要复杂的多。

当前联盟链PBFT共识能否参考?

比特币和树图都是公链,采用的是工作量证明机制,通过上面的阐述的方法实现了交易的全序以及安全性。树图通过改变链的结构,使区块可以并发产生,提高了交易TPS。

POW共识能使更多的节点参与进来,可以更好地实现去中心化,但是带来的问题就是TPS上不去。PBFT通过算法实现了交易的全序,一致,可以提高交易TPS,但是一般只能用于联盟链,因为过多节点参与进来,P2P网络压力会比较大。facebook的libra项目采用了bft共识算法,就是为了提高TPS。树图也为提高TPS提供了一种方案。

PBFT采用三阶段的方式保证了交易的全序,最后commit阶段保证了所有non-faulty节点的提交数据是一致的,并根据commit里的batch数据生成区块,不会产生区块分叉。PBFT共识的性能瓶颈是三阶段网络通信及签名验证的压力。

通过上述分析可知,采用树图并不能有效地提升PBFT共识区块链网络的TPS。

你可能感兴趣的:(共识算法,区块链,树图)