查看原文
其他

互联网计算机-共识协议介绍

胖协议&ICPLabs ICPLabs 2022-03-21



对什么达成共识?


共识目标


共识组成部分
  1. 区块构造:构造候选区块

  2. 公证:保证区块的有效性

  3. 随机数灯塔:对随机性达成共识以加速

  4. 敲定:确定共识达成的时间


下面以一个4节点的子网为例,按照共识的四个组成部分来描述子网是如何达成共识的。

一、区块构造

子网中的节点充当区块构造器,负责构造区块并通过向子网广播提议新区块。


在某个特定的区块高度,比如区块高度 30,区块构造器负责把所有可获得的有效信息打包到一个区块中,然后广播。


有效信息包括:用户与 canister 的通信、 canister 之间的通信以及这些通信的顺序。


二、公证

公证过程中,节点使用 BLS 门限签名(2f + 1)对区块进行公证,当三分之二的节点验证并签名一个区块时,这个区块就获得了公证。节点的私钥通过 DKG (分布式密钥生成)来产生。

BLS 门限签名算法可以将同一个信息的多个签名聚合为一个固定大小的签名。这意味着即使子网很大公证节点很多,公证的大小也会很小。


某些节点提议的区块可能是无效的,所以每个区块都必须经过公证,公证这一步骤使得每一轮都至少有一个有效区块产出。


以一个由 4 个节点组成的子网为例,假设当前区块高度为 29,并且之前的区块都已被公证过。


当节点 1 收到一个新的区块时,节点 1 会验证此区块,如果区块有效,节点会给这个区块一个签名,这个签名叫做公证份额(notarization share),然后把这个签名发送给子网中的其他节点,以表明节点 1 认为这个区块是有效的。


当节点 1 收到了节点 3 和 节点 4 对区块 30 进行了公证份额, 那么几个公证份额就会合成一个公证,这时区块 30 就得到了公证(总共有 4 个节点)。




如果节点公证了一个有效的区块30 后,又有一个有效的区块出现,那么也可以继续公证。


因为不同的节点可能对不同的区块进行了打包,进而公证的区块也可能不一样,如果在一个区块高度只公证一个区块,那么就可能出现所有区块都没有获得足够的公证份额,而导致区块链在这一高度卡住。


这意味着在同一个区块高度,可能会有多个区块被公证,此时的区块链可能是下图这个样子:


三、随机数灯塔

公证过后,每个区块高度可能会出现多个区块,这增加了达成共识的难度。因此 ICC 共识协议就使用随机数灯塔来减少每一轮产生的公证区块数。


在每个区块高度,子网内都会有一个共享的随机数叫做随机数灯塔,随机数灯塔是可验证且不可预测的。


节点使用 BLS 门限签名(f+1)对上一轮的随机数灯塔签名,当二分之一的节点对一个随机数灯塔签名,那么就会产生一个新的随机数灯塔,这将为子网共识提供随机性。



区块构造器排序


有了随机数灯塔,子网就可以使用随机数灯塔来对节点排序,节点会优先公证排名靠前的节点打包的区块,并且当节点看到了已公证的区块后就不再公证其他区块,进而减少每轮产生的区块数。


比如可以使用第 29 轮公证的随机数灯塔来对第 30 轮公证的区块构造器来排序。比如顺序为:节点1、节点4、节点2、节点 3 。顺序是随机的,并且由随机数灯塔来提供随机性。

当进入新一轮的公证后,计时器开启。开始时,节点只会对 只有排第一的节点打包的区块进行公证。


比如在第 30 轮公证时,节点 1 收到了一个有效的区块,但这个区块是由节点 4(排名第二)的节点发起提议的,所以节点 1 暂时不会对这个区块签名而是继续等待。如果节点 1 收到自排名第一的区块构造器构造的区块,那么节点 1 就会对这个区块签名。


如果一段固定时间之后,节点1 还没有提供有效的区块,那么节点就会开始公证节点 4 (排名第二)打包的区块,依次类推。



在大多数情况下,每轮都只会有一个区块被公证,但在某些情况下还是会产生两个及以上的区块,区块链还没有完成共识,因此我们还需要一个最终确认共识的步骤,那就是敲定。


四、敲定



然后就可以剔除这个高度之前出现的分支:




 总结



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存