# ICP共识机制

By [ZR](https://paragraph.com/@zr) · 2022-05-07

---

第一层：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区块区块消息。

---

*Originally published on [ZR](https://paragraph.com/@zr/icp)*
