EOS双花和分叉问题

参考文档:http://8btc.com/thread-158287-1-6.html

什么是双花和分叉

一笔交易在广播时,被多个节点同时接收产生新的区块,此问题被称为分叉。

两笔相同的交易,同时向全网进行广播,造成重复话费的问题被称为双花。

如何解决

分叉

EOS 采用 BFT-DPoS 共识机制 ,每个时间段只有一个超级节点在打包交易生产区块,所以不存在像 pow 一样的竞争关系,所以具有很强的抗分叉的能力。

当其中部分节点作恶,进行分叉。任何时候一个诚实的超级节点看到一条有效的更长链时,都会从当前的分叉切换过来,又由于超级节点数量为奇数个,所以在任何时刻一定会有一条较长的链。

双花

在 EOS 交易的数据结构中,ref_block_num, ref_block_prefix和expiration三者是用作TaPOS(Transaction as Proof of Stake, 交易作为权益证明)算法,是为了确保一笔交易在所引用的区块之后和交易过期日期之前能够发生.

EOS 超级节点收到两笔相同信息的交易信息时,两笔交易在网络上将分为一前一后到达,因为超级节点在
EOS 节点收到广播的请求,同时节点上会存在全网所有的区块信息来验证该交易的合法性,所以当第二笔相同信息的交易再次验证时,将不会通过。

业务中处理

当一笔交易被广播后 3 秒后将被添加到不可逆的区块中,如果一笔交易在这段时间之后没有在链上被查询到,则可以认为这笔交易广播失败。具体原因请看下面 BFT-DPoS 共识机制。

先来了解下这些

BFT协议

N ≥ 3F + 1 的情況下一致性是可能解決,N为总计算机数,F为有问题的计算机总数。由此可以看出,拜占庭容错能够容纳将近1/3的错误节点误差。

在 EOS 中首先在一群数量有限的节点中通过轮换或者随机算法选出某个节点为主节点,该节点在此时具有出块的权利。当主节点将该时段的交易打包成区块后用自己的私钥对该区块签名,并将其广播到所有节点。其它节点对该区块进行验证和确认,若某个节点确认该区块后对该区块进行签名并发送给主节点。当主节点收到至少三分之二的不同节点的签名区块后,则该区块完成了所有节点的验证成为不可逆区块串联到区块链中。
image|549x495

DPoS算法

DPoS在最小化网络成本的同时,赋予每个持股人一定的投票权,由他们投票产生“超级节点”代表。最后由获得票数最多的一定数量的超级节点轮流平等地产生区块。

EOS中选择了21个超级节点,主要有两方面原因:

  • 由于用户很难对较多数量的超级节点充分了解,所以过多的超级节点会降低用户投票的活跃度;
  • 规模为21的节点数目可以在拜占庭问题中以更低的资源成本来获得高效的共识。
超级节点的主要职责
  1. 提供相关计算资源和网络资源,保证节点的正常运行;
  2. 当轮到某超级节点拥有出块权时,超级节点收集该时段内的所有交易,并对交易验证后打包成区块广播至其他超级节点,其他节点验证后把区块添加到自己的数据库中。

在EOS技术白皮书中,每个出块间隔定义为3秒,这主要是由于在当前的网络环境下,一个超级节点打包区块并将其广播,绝大多数其他节点收到该区块的过程耗时最多3秒。只有下一个超级节点收到了上一个超级节点广播的区块时,再进行新区块的生成才不会造成对某个超级节点产生区块的忽略。而一个区块要成为不可逆区块需要超过三分之二的超级节点进行确认,在 DPoS 中只有超级节点产生一个新区块,才表示它对之前收到的区块链进行了确认,所以一个区块产生后,其后续串联14个区块才表明该区块是不可逆区块,区块中的交易是不可逆交易,整个确认过程需要45秒。

BFT-DPoS 共识机制

在最新版的EOS Dwan 3.0中为使区块链系统有更快的出块速度,EOS 采用了BFT-DPoS共识机制从而达到了500毫秒的出块间隔。

该机制的具体过程是:EOS的持有者通过投票系统对各个超级节点竞选者进行投票,选出21个节点为超级节点。然后这21个超级节点以自身的网络资源状况商议出一个出块权拥有顺序,在每个超级节点拥有出块权时,以间隔为500毫秒(500毫秒是EOS团队通过大量实验测试得出的当前网络状态下可达到的最小的稳定状态下的出块间隔)连续产生12个新区块,然后切换到下一个超级节点连续产生之后的12个区块。

当超级节点A产生第一个新区块后,A将该区块进行签名并广播给其他超级节点,其他超级节点对该区块进行验证后对其进行签名并返回给A节点,当A节点收到来自14个不同节点签名的区块后,该区块就成为不可逆区块串联到之前的区块链中(以500毫秒产生新区块的过程和对区块进行BFT协议共识的过程在超级节点中是同时进行的,即确认过程不影响超级节点产生新的区块)。

在当前的网络状况下,一个超级节点广播一个新区块并确认的过程可在1秒的时间内完成。因此,每个新区块的产生到成为不可逆区块最多需要1.5秒的时间。因为一个区块链在引入另一条区块链的交易状态时必须等待其成为不可逆交易,所以两个基于EOS的区块链在3秒钟以内就可以进行一次来回的通信。

超级节点网络延迟造成的问题

由于网络延迟使得上一节点产生的最后几个新区块有可能被该超级节点忽略。为解决此问题,EOS选用了确定顺序的超级节点轮流出块,比如以纽约(美国东海岸)、芝加哥(美国中部)、洛杉矶(美国西海岸)、日本东京、中国上海这样的顺序,该顺序使得上一节点产生的最后区块传播到下一节点时有最小的延迟,从而避免下一个超级节点忽略上一节点产生的区块。如果是随机定义出块权的超级节点,那么在现有的网络条件下,出块间隔只有控制在3 秒时才可保证下一节点较大概率上不会忽略上一节点产生的区块。


 上一篇
nodejs错误处理最佳实现 nodejs错误处理最佳实现
参考资料:https://segmentfault.com/a/1190000002741935#articleHeader3 四种传递错误的方式 作为异常抛出 把错误传给一个callback 在EventEmitter上触发一个Err
2018-11-16
下一篇 
bignumber.js快速上手 bignumber.js快速上手
简介用于任意精度小数和非小数运算的JavaScript库。 解决某些小数相加出现意外情况 console.log(0.1+0.2); // 0.30000000000000004 参考地址:https://www.npmjs.com/pac
2018-10-25
  目录