英文版地址:http://www.swirlds.com/downloads/SWIRLDS-TR-2016-02.pdf
摘要:本文通过hashgraph上的一系列例子来说明Swirld hashgraph共识算法。通过结合图形来解释算法详细的步骤,包括算法的核心思想,创建交易以及达成共识和时间戳等。
上图就是一个哈希图,随着时间的增长而增加,每个参与者在内存中都保存了一份哈希图的拷贝。上图中,我们假设网络中有四个节点ABCD(分别对应Alice, Bob, Carol, Dave)。每个节点开始时都会创建一个event的数据结构。
Event是包含一个或多个交易的容器(类似于比特币中的块)。Swirlds哈希图共识算法的目的就是让节点对event的顺序(event内交易的顺序)达成共识和event的时间戳上达成共识。
节点通过gossip协议进行通信,也就是说每个节点重复的随机的同步其他的节点。
比如,Bob随机的选择Dave。当它们相互通信时,Bob向Dave发送它知道而Dave不知道的所有的event。在上图中其实就是Bob自己创建的event。
Dave通过创建一个新的event的方式记录这个同步。也就是说新的event引用这个event(类似于比特币中的块指向父区块的过程)。实际上,event的哈希图就是记录的所有节点的通信过程。
下面我们详细描述下Dave创建的新的event:
上文已经提到Event是一个数据结构,除了包含自己的交易外,还包含它的之前的两个时间的hash。此处我们需要结合下图进行详细说明。对于Dave(D节点)来说,新创建的event(红色框)指向(引用)自己创建的event(蓝色)和B节点(Bob)发送的event(黄色),所以在这个新创建的event里面会保存黄色框event和蓝色框event的hash。
Event包含交易、两个hash、时间戳、签名,通过gossip协议通信。
各个节点都随机的选择节点来传播自己节点上的event。这样,哈希图会越来越壮大,会变成像下图所示的样子。
Round的概念在算法中是一个非常重要的概念。一个子event不会在它的父event之前创建round(这句话是废话),因此随着时间的增长,round的个数要么保持不变,要么会越来越多。后面我们会详细说明round的创建是如何计算的。在这里你需要get到的点是,当你收到一个event的时候,你马上能计算出来你是否要创建一个round。所有的节点收到event时都以同样的方法计算。
技术细节: 按照时间水平线划分round。每个round都有一个编号index,每个节点在round[r]中创建的第一个event就叫做witness。一旦出现一个可以see 三分之二个witness的event的时候,从该event起就是新的round[r+1]了。此处比较难理解,需要结合后面的描述来理解。
节点在round中创建的第一个event叫做witness。例如上图中A节点的witness就是A1,A2,A3.
一个节点在一个round中没有witness也是可能的。
技术细节:一个节点可能通过forking作假或者从同一个父event创建两个event作假。在这种情况下,在一个round中,这个节点可能就有两个witness。这种情况本算法是可以解决的。
![](https://i-blog.csdnimg.cn/blog_migrate/5c4ce04b67e910dc4270f17c01d85d7c.png)
对每个witness,我们需要判别它是不是famous witness。下面我们就举例说明我们是如何判别B2是一个famous witness节点的。
这个过程是通过后面一个round中的witness来完成的。也就是说,B2是否是famous witness首先由A3,B3,C3,D3判定。然后对于判定的计数又是由再后面一个round中的witness决定的。
每个witness都将投票决定B2是否是famous。每个witness的投票都是一个单独的过程。
此处有一个概念:A3能够see B2,表示有一个从A3到B2的路径。换句话说,B2是A3的一个祖先,A3是B2的一个后裔。
A3能see B2,所以A3给B2投yes认为B2是famous witness。
B3也能see B2,所以也给B2投yes。
C3也能see B2,所以也给B2投yes。
D3也能see B2,所以也给B2投yes。
四个witness都投了yes,所以我们可以认为B2是famous的。但是到此投票还没有结束,因为我们接下来还需要统计票数。
投票的统计将在下一个round进行。所以B4来统计票数或者是D4统计票数。
上图中没有A4和C4.但是随着时间的推移,hashgraph越来越大,A4和C4也会出现,他们也可以对投票进行计数。
B4收集它能够strongly see的witness的投票结果。B4 Strongly see某个witness的意思是从B4有超过supermajority条不同的路径到达这个witness。
Supermajority就是所有节点总数的三分之二。如图中,是四个节点,那么Supermajority就是3.
在这个例子中,B4能够stronglysee A3.绿色的那条路径,实际上已经B4由多条路径到达A3.所以B4是strongly see A3.
同样的,B4 strongly see B3.
B4 strongly see C3(译者注:此处应该有错,B4应该是不能 strongly see C3的)。
B4 strongly see D3。
至此,B4收到了超过Supermajority票的yes,所以B4可以认定投票结果是yes。所以绿色的B2节点现在就是famous的了。
所以我们需要能够strongly see supermajority个witness的节点来统计票数。![](https://i-blog.csdnimg.cn/blog_migrate/586812af3b52791e645cb7c4c50bbe32.png)
现在我们再看看C2是否是famous。
黄色路径表明,C3能see C2,所以C3投票yes。但是A3,B3,
D3不能see C2,所以它们投票为No。
![](https://i-blog.csdnimg.cn/blog_migrate/a706c79ceb109ee2912dd270314a1c07.png)
B4 strongly see A3,B3,C3, D3,所以它将统计投票结果,投票分别是No,No,Yes,No,所以结果是No。所以C2不是famous的。
![](https://i-blog.csdnimg.cn/blog_migrate/cd3507bcd74c459189eb74fbf5c0c23b.png)
经过一系列的过程后,我们可以看到A2,D2,A1,B1,C1,D1都是famous的。
但是在这个过程中,我们可以看到,大多数event都不是witness,所以对大多数的eventslai说都没投票。大多数证人在第一轮投票中以几乎一致的投票被宣布为famous。所以大多数选举不会持续很长时间。
在这个例子中,我们已经确定了round 2中每个witness的声望。一旦一个round中的所有witness的声望已经确定,那我们就可以为一组event找到round received和共识时间戳。
首先考虑A2以下的灰色event。
![](https://i-blog.csdnimg.cn/blog_migrate/68d574264ccd70a136841f191b5d4a12.png)
这个event(黑色的event)能够被round2中的每个famouswitness see(如图中红色、绿色、蓝色路径所示)。
这里仅仅要求see,而不是strongly see。这里不要求C2 see,因为C2不是famous witness。
因为黑色的这个event能够被round 2中的所有famous witness see,所以我们就说这个黑色节点有一个round received of 2.
![](https://i-blog.csdnimg.cn/blog_migrate/70f86abc563d513a0a5c6c9e741d270b.png)
接下来也能找到黑色event的共识时间戳。
在A节点上找一个更早的event X,这个event X是A2的祖先,同时还是黑色event的后裔。
同样的,通过B节点找到一个event Y,这个event Y是B节点的祖先,同时还是黑色event的后裔。同样的也可以通过D节点找到这样的event Z。
取出event X Y Z的时间戳,这个时间戳是节点在创建event的时候加上的。然后按顺序对这些时间戳排序。取出排序中的中间时现在考虑B2下面的灰色event。它能够被B2 see,但是不能被A2或者D2 see。所以它不能被round2中的famous witness see。所以它将在round2之后才有可能收到received round。仍然将它标为灰色,就是说明它目前还没收到received round。
接着,我们可以找到6个黑色event和4个深绿色event的共识。一共就由10个event收到的了round2 的received round。我们需要将这10个event按照所有节点都同意的顺序排序。这个顺序就是共识顺序。
这个排序就是通过它们的round received来进行的。通过中位数时间戳来打破联系(这句话没怎么懂)。
总结一下,上文已经描述了hashgraph算法的基本过程,但是其实该算法有个前提,原文中没有提到,那就是该算法是运行在代理之上的,因为每一步决定famous witness的时候需要超过三分之二的witness see这个event,所以我推测应该是运行在代理之上的,因为在全网的话无法判断三分之二具体是多大的数字。另外此算法的机制比较复杂,也没有一个很好的证明能够说明该算法在及时收敛上是管用的。
转载自:https://blog.csdn.net/lcloveyou/article/details/80289258?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param