一文解析Dfinity的链上共识机制

D Plus Community

    
    首先我们了解一下Dfinity的基础,它是由遍布全世界各地运行的(ICP)协议众多节点组成的,该协议连接了这些节点,并且在这些节点上协调了软件容器的组成,应用程序可以是单个容器组成,但是因为容器的容量有限,可以由许多相交互的容器组成,容器可以承载任何规模复杂的企业系统、网页,泛行业平台。
    当用户在和部署在Dfinity上的应用程序进行交互时,用户发送的新消息通过Dfinity发送到容器,接下来互联网计算机对该消息的输入执行容器,并最终计算出用户可以查询的输出消息,执行该消息,容器的状态会按照代码的规定进行更新,节点负责处理子网容器中的数据和状态执行。
    每个容器会在多个节点上运行 ,不仅仅是一个节点,因为单一节点可能会出现单点故障,通过ICP协议确保一个容器在多个节点上运行,并且这些节点根据协议按照顺序处理和计算结果的值达成一致,保证了容器可以永远运行。(一个应用可能会涉及多个容器,不同的容器可以具有不同的功能,有些是数据容器,有些可能是查询容器,容器之间是可以互相调用的,在应用需要扩容的时候,原容器可以创建新的容器,或者分叉原容器。)
    
    在Dfinity中子网是一个比较重要的角色,子网要处理不同的消息,包括用户通过网络到容器的消息,或者容器调用相互容器的消息,但是此时节点和节点之间看到消息的顺序是不一样的,使用ICP共识协议子网需要等待容器更新完状态之后的消息,同时需要一个共识机制把节点要处理的消息达成一致(ICP共识协议)。
    ICP共识协议使用的是POS共识机制,参与网络节点需要有一定的(ICP代币)作为保证金,如果作恶的话会损失部分保证金,共识机制由四个层次。
    
    第一层:ID和注册
    第二层:随机数灯塔
    第三层:区块链与分叉协议
    第四层:公证与近乎即时的最终性
    基于第一层,加入Dfinity网络的客户端(ID)都是可以抵御女巫攻击的,我们称为授权过的节点,这个节点就是子网中的节点,回到上方子网打包消息打包成区块。如果一个子网中只有一个节点负责打包消息的话如果这个节点掉线了那么区块就卡住了,所以就需要多个区块提议者,我们把这些区块提议者称为提议委员会,如果出现了一个问题,这其中的一个区块提议者是恶意节点提出了一个无效区块。
    这时候就要引入解决方案基于随机灯塔数筛选出这轮次的公证节点,我们暂且称为公证委员会,委员会的存在类似于DPOS算法,和EOS的DPOS算法不同,EOS的委员会几乎不变,Dfinity的委员会成员每次共识都会随机改变,公证委员会主要对区块进行公证和传播,这里的公证区块的意思就是对区块进行验证,委员会中的公证人都验证了区块是有效的话,就会对此高度区块进行签名进行公证并且广播,如果公证中有一个公证人掉线也没关系,只要有大部分的公证人对此进行公证通过这轮公证就结束了,公证委员会是根据随机数组产生的,简单来说就是在子网节点中使用等他随机数选择出一些节点作为公证委员会,每轮的委员会都运行这一组随机数灯塔。(公证委员会的存在就是验证区块)。
    这时候节点中的公证委员会也是公证也是采用阈值签名,所以我们可以把他们认为是一阈值组,通过验证完区块之后用阈值签名进行公证,只要阈值超过一定的值,这轮区块公证结束。
    该阶段公证也会出现一个问题,就是分叉问题,如果此时出现了两个分叉块,并且都是有效区块。那么公证委员会将公证哪一个区块是一个问题,因为公证委员会只能签署一次公证,最差的情况就是这两个区块被分成了55开的公证,最终会导致这两个区块也是无法批准,基于这种情况就要采用一种随机排序了——概率卡槽共识,这个共识主要解决的就是分叉问题,并且这个也是随机性的排序,简单来说我们把分叉的有效区块分假设为高度都是30的区块,因为这些有效区块都是提议委员会提出的,这时候这两个节点分别是节点1和节点2进行排点进行排序,假设这个随机排序输出的排列是:区块提议委员会的节点1排序是0级,区块提议委员会节点2的是1级,假设0级就是最优先级的,优先级会影响一个节点添加到链上的概率,公证委员会这时候首先收到的是提议委员会2的区块,这时候公证委员会可能会选择等待,他们会选择优先级更高的区块进行阈值签名,然后公证结束进行出块。
    这里有个理解盲区,为什么公证委员会可以实现阈值签名,解答:为了确保互联网计算机传输给用户输出结果的正确性,用户一般都还需要验证收到的消息确实来自计算机而不是其他地方,因为单个节点是没有可信度的,所以这个消息的签署是由托管用户查询结果的容器共同签名的,而在一个子网中,每个节点的密钥都是秘密共享的,使这些节点能够联合签名消息,只要达到一定的阈值签名同意,子网的公钥就会验证签名。随着时间的发展,容器和子网根据需要都要添加新的容器和子网进来,节点不一定要运行容器,节点是根据需求来划分组成新的子网,然后再把容器分布在这些子网上,而这时候基于非交互式分布式密钥生成(NIDKG)技术来给新加入子网节点共享密钥,基于此技术也可以将旧的子网节点退出子网然后重新共享私密密钥。基于这项非交互分布式密钥生成(NIDKG)技术也是使Dfinity无限扩容的原因之一。
    阈值签名:简单来说就是一个临界值在Dfinity中所有节点的签名可以成为一个阈值,只要达到了一定的临界值就ok。
    总结一下Dfinity的首先区块制造者就是区块提议委员会首先由随机排序算法决定优先级概率,然后在由可验证随机函数选出每轮的公证委员会,然后通过阈值门限密码阈值签名出块,而验证签名的唯一子网公钥只有48字节,而以太坊上每次都是由不同的节点签名,设备需要同步400Gb的签名数据,所以Dfinity上可以很快达到确认区块时间,现在一秒可以确认个16.45区块区块消息。