Cover photo

HashGraph

DAG

有向无环图

图 G 包括一个点集 V,一个边集 E.每个点集中的元素在 DAG 账本中对应一个交易或者区块,边集中的每个元素(u,v)是一个二元组,表示 u,v 两点之间的偏序关系,大多数情况下表示 u节点间接确认了 v 节点代表的内容,从而形成了一种偏序关系。

什么是偏序?

设R是集合A上的一个二元关系,若R满足:
Ⅰ 自反性:对任意x∈A,有xRx;
Ⅱ 反对称性(即反对称关系):对任意x,y∈A,若xRy,且yRx,则x=y;
Ⅲ 传递性:对任意x, y,z∈A,若xRy,且yRz,则xRz。 [1] 
则称R为A上的偏序关系,通常记作≼。注意这里的≼不必是指一般意义上的“小于或等于”。
若然有x≼y,我们也说x排在y前面(x precedes y)

无环,字面意思

不存在一个标准的一致性确认机制(即账本或日志体系),同时对操作顺序进行全局统一排序

(1) 基于主干链的 DAG 共识协议,首先在 DAG 中确定主链,进而确定交易全序;

(2) 基于平行链的 DAG 共识协议,网络中各实体或实体集合分别维护一条链,链间通过相互引用构成平行链结构,实体间利用此引用关系进行共识;

(3) 基于朴素 DAG 的共识协议,除基本引用规则外无特殊限制,在 DAG 拓扑结构中利用某种投票机制进行共识 —————————————

Conflux

Conflux

Conflux中的区块之间由多条边(Edge,连接)组成,这些边分成两类:父连接,以及引用连接。在确定主链(Pivot)的基础上,新生成的区块必须使用父连接连接到主链的最后一个区块上。除了主链外,还存在其他一些非主链的路径,新生成的区块必须使用“引用连接”连接这些非主链的最后一个区块。Conflux中组成DAG的区块会确定一条主链(Pivot Chain)。在主链确定的基础上再确定所有区块的先后顺序,Genesis是“创世纪”块,也就是第一个块。父连接用“实心”箭头表示,引用连接用“虚线”箭头表示。区块C使用“父连接”连接到A,使用“引用连接”连接到B。新生成的区块(New Block)使用“父连接”连接到H,使用“引用连接”连接到K。

如何确定主链

如图所示,区块A和区块B是创世区块的两个孩子区块。A子树有6个区块,B子树有5个区块,所以选择区块A作为紧接着创世区块的主链上的区块。根据同样的规则,把区块C,E,H,都选择进了主链。

如何排序

Conflux中的每个新区块在产生时,除了选择主链(该区块观察到的主链)上的最后一个区块作为自己的父亲区块外,还必须把所有自己观察到的但还没有被其他区块引用的区块引用起来,表达不同区块之间的happens-before的关系。

被指区块肯定比主动去指的区块早

如上图所示,如果一个机器节点在产生区块E的时候,发现系统中已经有了区块D,而且这个时候区块D还未被任何其他区块引用,那么区块E就把自己的引用指针指向区块D,也就是说在区块E和区块D之间加上一个有向的引用边,表示D是在E之前产生的。

主链上的每一个区块确定一个Epoch。在分叉上的区块属于哪个Epoch,是由第一个产生在它之后的主链区块所在的Epoch决定的。比如区块D属于Epoch E,因为D最先被E引用,所以产生在E之前,但是D并不产生在C之前

拓扑排序和哈希排序来确定每个Epoch的中区块顺序

https://img-blog.csdn.net/20180625175824103?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzEzMjU2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

哈希排序

用下标作为数字的值,来统计顺序。

HashGraph

结构

结构图
结构图

A、B、C、D分别表示共识节点,圆圈表示一个Event。这个Event可以是交易,也可以是一个区块。Event中包括时间戳、transaction list、两个Event hash以及Event的签名。两个Event hash,一个指向自己最新发布的Event,另一个指向最近收到的别的节点的Event。

post image

Hashgraph共识与PBFT共识类似都要求系统中拜占庭节点的数量少于1/3,也意味着Hashgraph共识是有准人条件的。与PBFT不同的是,Hashgraph中Event即承载交易信息,也代表着投票,所以Hashgraph不需要像PBFT那样需要进行特意广播投票信息(DAG都有这个特性),只需要不断进行Event的广播即可。

祖先(ancestor):如果事件A是事件B的父亲事件,或是父亲的父亲的事件等等,又或者事件A等于事件B,那么事件A是事件B的祖先(ancestor),也就是说自己是自己的父亲事件,自己是自己的祖先事件。

**可见:**事件A可见事件B,当且仅当存在一条由A到B的路径。

**强可见(strongly see):**事件A到事件B的所有路径经过的事件的集合S,当S中覆盖了超过2/3的共识节点,那么事件A强可见事件B。

**见证人(witness):**每个共识节点的每一创建轮次的第一个Event。如图4中的A2、B3等。(其实叫见证人事件更好理解)。

创建轮次(round create): 如果事件A强可见超过2/3的创建轮次为x的见证人,那么事件A的创建轮次为x+1,否则为事件A的祖先事件中的最大轮次。

img
img

接受轮次(round received):如果 R 轮(创建轮次)中的所有知名见证人可见【注意这里不要求是强可见】某一普通event,则该event的接受轮次就是 R 轮,如果某普通event没有被 R 轮所有知名见证人可见,则它的接受轮次一定晚于 R 轮。【其实也就类似于,被6个块所引用的块叫做确认块是一个道理】

img
img

**著名见证人(famous witness):**通过统计投票决定,投票过程比较复杂,分为投票和统计两个过程,下面详细描述。

1)投票

每一轮的见证人会给前一轮的见证人投票,如A3、B3、C3、D3会对B2进行投票。投票的规则很简单:如果可见投yes,否则投no。如A3、B3、C3、D3给B2投的都是yes,如图5所示。这些投票结果会在后面的轮次进行统计。

img
img

图5.投票

2)票数统计

对x轮的投票统计将在x+2轮开始,只统计强可见的投票,如果收集到大多数的yes票,则为著名见证人。如图6,B4对B2是否是著名见证人进行票数统计,B4强可见A3、B3、C3和D3,收集到的票为4个yes,因此B2为著名见证人。对于C2,收集到的票为3个NO,因此C2不是著名见证人。只要任何一个见证人能判断即可,也就是说B4能判断B2是著名见证人,那么不用C4或其他见证人再进行判断了,因为可证明其他见证人的判断结果将是一样的。只统计强可见的票的目的是保证统计到的票超过2/3的共识节点都看到了这一张票,即这张票的结果大部分人都看到了。根据数学理论证明,任何一个 R+2 轮见证人如果对投票结果做出了决定,那么这个结果就是全网的结论,如果这轮见证人无法做出决定,就由下一轮见证人计票决定,直到得出确切结论。

img
img

假如在下一轮无法做出决定(例如 2:2 的投票结果),则将延续到下一轮,根据数学定理只要我们在每十轮增加一个随机轮次( coin round ),则选举过程最终一定会结束(以概率 1 收敛,通俗点说就是几乎必然收敛,这是概率论中的概念)。在随机轮中,收集到绝对多数结果的见证人仅投票而不做决定,而其他见证人则根据数字签名的中间位进行随机投票。

共识Event执行顺序

一个事件Event什么时候被确认呢?当事件Event拥有接收轮次(round received)时就被确认。Hashgraph共识的结果是事件Event的全局顺序,当Event拥有接受轮次后,使用一下排序规则进行排序

虚拟投票

在节点之间通信,但这仅仅只是通信步骤,节点之间达成共识还需要虚拟投票机制,为什么说是虚拟投票,因为通过执行gossip算法后所有节点都是全节点,都存储了完整的网络历史(可能不同时间节点存储的不一样!但是最终都会趋向一样!),在需要对某一提案达成共识时并不需要大规模的消息通信,每个节点独立执行投票算法,并且所有节点一定会得出相同的共识结果。