科普 | DFINITY的共识机制

我们知道区块链是建立在达成共识这个基础上的,共识机制解决了区块链如何在分布式场景下达成一致性的问题。通俗的来讲,共识机制决定了是谁来写区块而获得奖励。DFINITY自2017年起就没有转变过PoS+随机数+WASM虚拟机的技术方向,共识方面的设计是DFINITY的一大亮点。

DFINITY的共识机制层

DFINITY的共识机制是一个由下至上的四层结构:


第一层:身份层(Identity Layer)

网络中所有活跃的参与者称为客户端Clients,具有永久的伪匿名的性质,首先需要在网络上进行注册。比传统的 PoW 具有更加灵活的功能,例如如果客户端有作恶的行为,那么矿工就会失去作为区块生产人获得回报的可能,而不是仅失去本轮的回报,这样身份层可以在一定程度上帮助DFINITY网络抵御女巫攻击(攻击者指单个节点拥有多重身份)。

第二层:随机灯塔层(Random Beacon Layer)

这一层用来生成至关重要的随机数,由注册的客户端通过变量随机函数 verifiable random function (VRF)来生成。这一点是DFINITY的核心技术,通过 BLS 签名来实现这一特色。

(1)阈值签名机制(Threshold Signature Scheme)

我们可以想象有这么一个黑箱子,它由三个部分组成:输入、输出、黑箱子本身。黑箱子的输入是一组人(假设有100个)的指纹,输出是一个随机数。对于黑箱子本身有着这样一种机制,只要黑箱子接收到了这100个人的任意50个人上的指纹后,就能够输出一个确定的随机数。但是在黑箱子得到任意小于等于50个人的指纹之前,没有人能够预测它的输出是什么。并且这个黑箱子有三个特点:

· 可验证性(Verifiable)

任何人都可以凭借超过50个人的指纹输入对输出的随机数进行验证,因而这个黑箱子也可以叫做可验证随机函数(Verifiable random function);

· 决定性(deterministic)

是一旦有超过50个人输入指纹产生随机数后,任何人都可以对这个输入输出过程进行测试,输出的随机数都是确定的,不变的;

· 非交互性(Non-interactive)

这些输入指纹的人之间互相不需要交流,只需要输入自己的指纹就能得到一个公共的输出。

在密码学中,已知具有上述三个特点,并且能够实际有效运行的可验证随机函数只有[这个说法来自白皮书]基于BLS[由Boneh, Lynn和Shacham在2003年时提出]的密码机制。而随机灯塔层利用的就是这个机制。

第三层:区块链层(Blockchain Layer)

第三层部署了“概率插槽协议”(PSP)。该协议针对每一个区块高度对客户端进行排序,此排序由该区块高度时随机数灯塔的公正输出决定。然后将权重按照提议者排序等级分配给区块提案,使得来自列表顶部客户端的区块得到较高权重。分叉问题通过支持拥有“最重的”累积区块权重的链条得到解决-与传统的工作量证明共识基于最高累积工作量非常相似。PSP协议的第一个优点是,排名是即时可用的,这使得可预测的、恒定的出块时间成为可能。第二个优点是总有一个排名最高的客户端,这允许了均匀同质的网络带宽利用。

(1)区块权重(Block Weight)

我们说过在每一轮,随机灯塔层都会产生一个新的随机数,这个随机数随后被用来随机抽样选择区块生产委员会。但是这个随机数除了能够帮助产生区块生产委员会之外,还能够对委员会中的每一个客户端进行排名,给予不同的客户端不同的权重。而这个客户端的权重,也是该客户端提议的区块的权重,代表其提议的区块的优先级。在正常情况下,最终进入公正过程的只有一个被提议区块。优先级越高的被提议区块也就有着更大的机会进入公正程序而后被公正。在DIFINITY中,随机赋予区块的权重是呈指数递减的:

(2)链的权重(Chain Weight)

虽然在正常情况下,只会有一个被提议的区块进入公正程序。但是这也不排除由于某些原因导致超过一个区块进入了公正程序,并且都得到了公正的情况。这时候便产生了分叉。对于这种情况的产生,由区块权重引出一个链的权重的概念。链的权重指在分叉开始的那一个区块开始,每条分叉链的区块累计权重,也就是分叉链上的所有区块权重的加总。下图描述了这种情况。

从第r-3轮开始产生了分叉,出现了两条链。这时候深色链中有3个区块的权重为1,1个区块的权重为0.25,链的权重为3.25;而另一条浅色链中,有2个区块的权重为1,另外2个区块的权重为0.5,链的权重为3。由于深色链的权重大于浅色链的权重,这时候下一轮的客户端在进行区块提议的时候就应该放弃浅色链,选择权重较大的深色链。(R:权重,C:链,wt C:链的权重)

第四层:公正层(Notary Layer)

一个特定交易的最终性意味着一个系统范围内的共识,即一个特定的交易已经被不可逆转地执行。Dfinity在其第四层部署了新的区块公证技术来加速最终性的达成。公证是由注册客户端共同创建的某个区块下的一个阈值签名。只有经过公证的区块才可以包含在链中。在所有提交给客户端进行公证的区块候选者中,客户端只为排名最高者提供公证,该排名是基于由随机数灯塔驱动的公开的可验证算法进行的。公正的过程正是经典的“拜占庭将军”问题。对于拜占庭将军问题的解决,唯一的办法是通过某种拜占庭协议。但是在DFINITY中却采用了上面描述的一种“乐观协议”,至于出现有超过两个以上被公正的区块情况出现时,前文描述的链的权重也能将其解决。

如何生产区块

共识的过程

Dfinity 的网络是由客户端组成的,客户端实现三种功能:

· 参与随机灯塔层随机数的产生

· 参与去中心化的公证

· 产生区块


为提高扩展性,随机灯塔和公证都是由委员会(committee)所构成的。如果网络的规模小,那么委员会可以是所有的客户端。网络规模比较大的话,那么可以按照一定的规模分成小组,所有的操作都是一轮一轮轮流进行的。委员会的规模是按照可能犯错的概率计算出来的。

共识的过程如下图所示:


在第r轮的过程中,随机灯塔产生随机数,根据随机数给出区块生产者产生区块不同的权重,然后公证层对产生的区块进行公证。在随机灯塔看到公证的区块就会进入到下一轮。

随机灯塔,区块的生产以及公正的过程


图4-1表示在r轮,一个新的提议区块Br产生,这个区块指定向上一个区块Br-1,然后由ξr抽取公正委员会的各个客户端对其进行签名;

图4-2表示提议区块Br获得了公正委员会中超过阈值数量的客户端的签名,然后生成一个公共数字签名Zr,区块Br正式被加入到区块链中;

图4-3表示在第r轮由随机灯塔抽取的委员会成员的数字签名被随机灯塔收集,达到阈值后,随机灯塔产生了一个新的随机数ξr+1,这时候第r轮结束,准备进入r+1轮;

图4-4表示第r+1轮正式开始,新的委员会即将由ξr+1抽取,然后重复上一轮的过程

出块流程

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

2、在等待BLOCK_TIME期间,由概率插槽协议对进程进行打分,生成排序区块的得分顺序;

3、BLOCK_TIME即5s等待时间到了之后,经过二次判断:

· 是否已经给最高分的链打过分;

· 验证区块是否有效,且插槽被选为负责打包的进程;公证人验证区块,进程广播该区块的阈值组签名的分片。

4、当BLOCK_TIME到期时,组成员对通过公证人证明的区块执行签名,直到至少1个区块接收到阈值签名。

5、一旦达到阈值组合当前高度的组签名则不再对当前高度的签名分片执行签名。

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