DFINITY区块链连载(二) - 阈值组创建与区块生成

上一篇初步介绍了DFINITY网络和所使用核心技术-BLS短签名算法,我们将会继续介绍DFINITY网络实现快速强一致性的技术实现。

作者:季宙栋、丛宏雷

核心关键词:阈值组、概率插槽协议、阈值接力

一、如何创建阈值组

1)新加入网络的客户端通过VRF算法被随机分配到不同的组

2)初始化阈值组的参数(见上篇-包括组大小、阈值等)

3)初始化完毕,成功创建的组的公钥被登记到网络中

4)阈值组的创建与区块链业务流程是解耦的,所以可以并行执行,如图所示,我们同时创建红色和绿色组


5)新加入的阈值组以及客户端(或矿工)需要等待2个EPOCH周期才能够激活

如何选择合适的Epoch长度:为保证正确性,一个Epoch必须包含比一次链分叉更多的区块数目。但是,由于轻量化的客户端只保存关键帧的区块头信息,出于效率考虑,epoch需要被定义的尽量长,比如,一个星期。

二、概率插槽协议 - 保障出块和避免分叉

在阈值签名接力结构中引入概率插槽协议,可保障网络中的矿工始终在最优的主链进行出块,同时,结合VRF算法实现了高一致性和高效的区块确认时间。

每个h高度的出块流程如下:

1)通过VRF算法将当前高度阈值组的进程进行排序




2)对排序完的进程划分不同的插槽,标记为系统内的优先级顺序

3)对不同插槽的进程打分,标记权重

3*)DFINITY也引入了基于超时的机制,即等待第一个被选中的进程多久,如未出块,则由下一个进程执行出块。


如图所示,一个完整的出块流程:1)随机排序; 2)分组(插槽);3) 打分; 4)选出最高得分的进程打包区块并广播; 5)阈值组接力, 继续周而复始的寻找最高得分的链

三、遗留的问题

通过阈值接力结构和概率插槽协议可以实现高效的出块和极低概率的链分叉事件。不过我们依然会碰到网络中的恶意角色试图进行的攻击,比如以下两种情况:

1)自私挖矿攻击:恶意对手会选择性的保留挖出来的区块并逐步发布,相比诚实节点获得了控制交易的优势;同时,自私挖矿攻击增加了达成最终一致性所需的确认数。

2)无利害关系 : 恶意对手只需要运气足够好,被选为一系列0插槽(即最高优先级),那么它就可以随时在所有的分叉上进行投票,并从h高度之后创建分叉并实施重放攻击。

DFINITY网络提出了一种解决方法:

核心思想就是引入公证人,当前高度必须存在公证人的签名,这样一来,如果延迟发布区块,就得不到公证人的签名,则区块将会被视为无效。

四、公证人模式出块流程

为了解决两个潜在的威胁,我们引入了公证人来对区块执行签名,出块原理的分析:

1)当前高度h收到上一组的阈值签名后,组成员启动各自的计时器,收集BLOCK_TIME之内的交易信息(不进行处理)。

注:DFINITY并不依赖严格的时钟同步

2)在等待BLOCK_TIME期间,由概率插槽协议对进程进行打分,选定打包的进程

3)BLOCK_TIME即5s等待时间到了之后,经过二次判断:1* 是否已经给最高分的链打过分;2*验证区块是否有效,且插槽被选为负责打包的进程;公证人验证区块,进程广播该区块的阈值组签名的分片

那何时终止签名动作?一旦达到阈值组合当前高度的组签名则不再对当前高度的签名分片执行签名

几点总结:

1>在正常网络运行情况下,如果考虑到网络同步,将BLOCK_TIME设置得足够大,则每个组成员将只会优先处理最高得分的链

2>公证人组只会证明代表最高得分的链的区块

3>这种方式可以防止分叉,从而实现快速的达成最终一致性

五、解决相同得分问题

由恶意对手控制的0插槽中的进程可能将大量不同版本的它的区块广播到DOS中。虽然这个恶意进程会因为拜占庭行为而被很快逐出网络,但是如何防患于未然?

解决方案:如果进程发现最高得分相同的区块,则只转发到尚未检测到相同得分的节点。
如果组成员发现最高得分相同的区块,则不执行签名,而是开始签名来自不同插槽的的下一个最高得分的区块。

六、小结

通过整体的架构设计,DFINITY网络提供了高效出块的能力,任何作恶行为会被网络忽略及公证人的惩罚。

在理想情况下,DFINITY网络仅需要2个区块和阈值组接力即可实现最终一致性,这对于竞争的区块链平台来说存在巨大优势。当BLOCK_TIME设置为5秒时,平均的确认时间仅需7.5秒



DFINITY计划于近期发布铜发行版本,从出块时间、交易确认所需时间以及燃料消耗等方面相对第一(比特币)和第二代区块链技术(以太坊)存在较为明显的性能优势。

下一篇 主要对DFINITY网络的关键技术FAQ解析

文章被以下专栏收录