本文将会介绍DFINITY网络快速强一致性的技术实现,核心关键词:阈值组、阈值中继、概率卡槽共识、阈值接力。
背景介绍
DFINITY使用PoS共识机制。参与网络需要一定数量的stake(即DFINITY代币)作为押金(deposit)。所有节点都是平等的,增加回报的唯一方法是向网络添加更多节点。强调一点,所有的DFINITY节点的押金都是一样多的,多付押金不会有任何额外的好处。
PoS的部分优势在于,所有节点对于平台来说都是已知的,因此平台可以调用节点来执行某些功能,也会预期这些节点是在线的。如果被调用的节点是离线状态的,该节点可能会损失部分押金。
正因为我们知道谁参与了网络,并假设几乎所有节点都在线,我们可以随机将任务分配给节点,并比较确信这些任务将会完成。这也是DFINITY的基础。
阈值组
Committee
阈值组是DFINITY整个共识产生过程中非常重要的概念。阈值组让我们避免了只有单一决策者的情况,是DFINITY的核心。在任何时候,网络中都有一个活跃的阈值组池。每个阈值组从连接到网络的全部节点中随机抽样组成, 一个节点可能被同时包含在多个阈值组中。
阈值组的所有节点一同工作以创建随机性;每一轮都要从阈值组池中选择新的阈值组。

阈值组提前随机选择出来并放入池中的。正如下图所示,在时间段1期间,时间段2的阈值组被选择出来。在时间段1结束时,该时间段的阈值组解散,时间段2的阈值组开始运作。同样的过程无限重复。
阈值中继
Threshold Relay
DFINITY的随机性是由阈值中继可验证随机函数产生的。想象一下你在玩扑克游戏——你需要能够验证发牌人无法预测或操纵从牌组中出来的牌。这也是你要在公众视野中洗牌的原因。洗牌就是一种可验证随机函数,适用于不信任的节点网络——扑克玩家。
为了创建阈值中继,我们使用了阈值加密。不过,首先我们先来了解下公钥加密。想象一下,你家的门有两把钥匙,一把锁门的钥匙,一把开门的钥匙。你可以把锁门的钥匙给任何人,谁会在乎别人可以锁上你的门呢?重要的是,只有你才能开门。
公钥加密中的数字签名基本就是这样,但更抽象。你有两个密钥,一个可以签署一个数据,另一个可以用来验证签名。如果其他人可以在一个数据上验证你的签名,这是一件好事,前提是你是唯一可以创建这个签名的人。这就是“公钥私钥密码学”的来源。签名密钥必须是私有的。
阈值加密基本是一样的原理,除了一个区别:在阈值加密中,私钥或签名密钥被分成多份(share),每份都可以用于创建签名。一旦聚合了阈值比例的签名份,它们就会创建一个完整的数字签名,可以使用公钥进行验证。
如果没有足够比例的share来创建一个完整的数字签名,就无法被验证。在DFINITY的实际实施中,我们只需要让聚合比例达到多数(51%)。这里我们要知道:每个阈值组有一个公钥,每个组成员有一个私钥的share。

下面是阈值签名的流程。阈值签名有一个非常棒的特点,那就是,无论聚合哪些签名份来创建一个完整的签名,最后得到的签名是相同的。
然后我们就会得到一大堆的数字签名,如果没有人事先知道其中的内容,那么这就是一个很好的随机性来源。后面我们会把这个签名作为随机信标(Random Beacon)使用。

那么随机信标是怎么产生的呢?我们从随机源开始,用随机源来选择一个阈值组,阈值组成员签署随机性(用于选择阈值组)。
那个阈值签名(记住我们只需要51%的阈值,并且这里任何阈值组成员都无法对签名产生影响),用于选择下一个阈值组。这个过程无限持续下去。

随机排序——概率卡槽共识
Probabilistic Slot Consensus
因为协议有全部连接到网络的节点的列表,所以它可以将这个列表和随机信标作为输入,输出一个随机排序的列表。而这个随机排序就需要通过概率卡槽共识进行。
顶部的节点被认为有更高的优先级(rank)。优先级会影响一个节点将区块添加到链上的概率,优先级越高,概率越大。

节点可以自己完成此操作并在创建和广播区块之前确定其优先级。这节省了计算和网络资源,因为在实践中可能只有少数(例如五个)节点必须创建和广播区块。
区块签署
在DFINITY网络中,创建随机性的阈值组还有签署区块的作用。
每个阈值组成员要遵循相同的规则:他们收到一个区块,如果该区块无效,则将其丢弃。如果有效,则检查其优先级。
如果优先级低于他们之前收到的一个区块,他们就会丢弃它。如果优先级更高,他们会使用私钥share对其进行签名,然后广播区块和签名share。

一旦一个区块收集了必要数量的签名share来生成一个完整的、可验证的签名,则将其视为“经过公证的”,然后将这个区块添加到链中。
以下就是整个出块的过程:

DFINITY的高效区块确认
基于阈值中继可验证随机函数的使用,DFINITY网络的区块确认时间仅为两个区块,确认时间可低至2.5秒,每秒的交易处理量约为50笔。总的来说,在区块确认方面速度的确是很快,我们也必须看到VRF在其中发挥的巨大作用。
如何创建阈值组
1)新加入网络的客户端通过VRF算法被随机分配到不同的组。
2)初始化阈值组的参数(包括组大小、阈值等)。
3)初始化完毕,成功创建的组的公钥被登记到网络中。
4)阈值组的创建与区块链业务流程是解耦的,所以可以并行执行,如图所示,我们同时创建红色和绿色组。
5)新加入的阈值组以及客户端(或矿工)需要等待2个EPOCH周期才能够激活。
如何选择合适的Epoch长度:为保证正确性,一个Epoch必须包含比一次链分叉更多的区块数目。但是,由于轻量化的客户端只保存关键帧的区块头信息,出于效率考虑,epoch需要被定义的尽量长,比如,一个星期。
概率插槽协议-保障出块和避免分叉
在阈值签名接力结构中引入概率插槽协议,可保障网络中的矿工始终在最优的主链进行出块,同时,结合VRF算法实现了高一致性和高效的区块确认时间。
每个h高度的出块流程如下:
1)通过VRF算法将当前高度阈值组的进程进行排序。
2)对排序完的进程划分不同的插槽,标记为系统内的优先级顺序。
3)对不同插槽的进程打分,标记权重。
4)DFINITY也引入了基于超时的机制,即等待第一个被选中的进程多久,如未出块,则由下一个进程执行出块。
如图所示,一个完整的出块流程:①随机排序;②分组(插槽);③打分;④选出最高得分的进程打包区块并广播;⑤阈值组接力, 继续周而复始的寻找最高得分的链。
遗留的问题
通过阈值接力结构和概率插槽协议可以实现高效的出块和极低概率的链分叉事件。不过我们依然会碰到网络中的恶意角色试图进行的攻击,比如以下两种情况:
1)自私挖矿攻击:恶意对手会选择性的保留挖出来的区块并逐步发布,相比诚实节点获得了控制交易的优势;同时,自私挖矿攻击增加了达成最终一致性所需的确认数。
2)无利害关系 :恶意对手只需要运气足够好,被选为一系列0插槽(即最高优先级),那么它就可以随时在所有的分叉上进行投票,并从h高度之后创建分叉并实施重放攻击。
DFINITY网络提出了一种解决方法:
核心思想就是引入公证人,当前高度必须存在公证人的签名,这样一来,如果延迟发布区块,就得不到公证人的签名,则区块将会被视为无效。
公证人模式出块流程
为了解决两个潜在的威胁,我们引入了公证人来对区块执行签名,出块原理的分析:
1)当前高度h收到上一组的阈值签名后,组成员启动各自的计时器,收集BLOCK_TIME之内的交易信息(不进行处理,注:DFINITY并不依赖严格的时钟同步)。
2)在等待BLOCK_TIME期间,由概率插槽协议对进程进行打分,选定打包的进程。
3)BLOCK_TIME即5s等待时间到了之后,经过二次判断:①是否已经给最高分的链打过分;②验证区块是否有效,且插槽被选为负责打包的进程;③公证人验证区块,进程广播该区块的阈值组签名的分片。
那何时终止签名动作?一旦达到阈值组合当前高度的组签名则不再对当前高度的签名分片执行签名。
几点总结:
1)在正常网络运行情况下,如果考虑到网络同步,将BLOCK_TIME设置得足够大,则每个组成员将只会优先处理最高得分的链。
2)公证人组只会证明代表最高得分的链的区块。
3)这种方式可以防止分叉,从而实现快速的达成最终一致性。
解决相同得分问题
由恶意对手控制的0插槽中的进程可能将大量不同版本的它的区块广播到DOS中。虽然这个恶意进程会因为拜占庭行为而被很快逐出网络,但是如何防患于未然?
解决方案:如果进程发现最高得分相同的区块,则只转发到尚未检测到相同得分的节点。如果组成员发现最高得分相同的区块,则不执行签名,而是开始签名来自不同插槽的的下一个最高得分的区块。
小结
通过整体的架构设计,DFINITY网络提供了高效出块的能力,任何作恶行为会被网络忽略及公证人的惩罚。
在理想情况下,DFINITY网络仅需要2个区块和阈值组接力即可实现最终一致性,这对于竞争的区块链平台来说存在巨大优势。当BLOCK_TIME设置为5秒时,平均的确认时间仅需7.5秒。
DFINITY的铜发行版本,从出块时间、交易确认所需时间以及燃料消耗等方面相对第一代(比特币)和第二代(以太坊)区块链技术存在较为明显的性能优势。
问题
问题:时间段2的阈值组在时间段1期间选出,这样的话,时间段2的阈值组成员会不会容易遭受DDOS攻击?
答案:答案是不会。因为在DFINITY里面,这些成员是隐藏的,平台选择了这些成员,但是没人知道他们是谁。
问题:创建BLS密钥时,通信问题是瓶颈。DFINITY一个阈值组里有多少节点?如何改善这个问题?
答案:一个阈值组里有400个节点。通信很昂贵,但还不足以成为我们需要解决的问题。
问题:一个阈值组成员公开了他的私钥怎么办?
答案:因为我们需要一定阈值(51%)的私钥share来达成共识,一个share的泄露是没有关系的。
问题:有多少节点被选择用于发起区块?
答案:答案是0。每个节点可以可能被选择用于发起区块,具体的概率由前面的随机排序算法决定,优先级高的概率高。发起区块的话,实际实施的大概5个节点。

你关心的 IC 内容
技术进展 | 项目信息 | 全球活动

收藏关注 IC 币安频道
掌握最新资讯

