HASHGRAPH 共识算法详解

英文版地址:http://www.swirlds.com/downloads/SWIRLDS-TR-2016-02.pdf

哈希图的特点

  • 闪电般的快速结果:  Hashgraph在带宽使用方面提供了惊人的效率,并且它可以在单个碎片(网络中完全连接的点对点网状节点)中每秒处理数十万事务。共识延迟以秒为单位来衡量,而不是几分钟,几小时或几天。
  • 安全性 它实现异步拜占庭容错(aBFT )。其他平台容易受到分布式拒绝服务(DDoS )攻击。哈希图对这些类型的针对共识算法的攻击具有适应性,并且实现了由aBFT定义的安全的理论极限。大规模实现这种安全级别是分布式系统领域的根本性进步,因为它是此类安全的黄金标准。
  • 治理: 它将由各自领域的39家领先组织统治,带来所需的流程和业务经验以及共识模式,其中每个节点为其拥有的hashcap加密货币投下一票。新的节点将加入网络,并在维护散列图方面得到补偿。预计节点数量将迅速增长,确保将共识投票权限分配给数千个节点。

 摘要:本文通过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。这种情况本算法是可以解决的。

对每个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的节点来统计票数。

现在我们再看看C2是否是famous。

黄色路径表明,C3能see C2,所以C3投票yes。但是A3,B3,

D3不能see C2,所以它们投票为No。



B4 strongly see A3,B3,C3, D3,所以它将统计投票结果,投票分别是No,No,Yes,No,所以结果是No。所以C2不是famous的。



经过一系列的过程后,我们可以看到A2,D2,A1,B1,C1,D1都是famous的。

但是在这个过程中,我们可以看到,大多数event都不是witness,所以对大多数的eventslai说都没投票。大多数证人在第一轮投票中以几乎一致的投票被宣布为famous。所以大多数选举不会持续很长时间。

在这个例子中,我们已经确定了round 2中每个witness的声望。一旦一个round中的所有witness的声望已经确定,那我们就可以为一组event找到round received和共识时间戳。

首先考虑A2以下的灰色event。



这个event(黑色的event)能够被round2中的每个famouswitness  see(如图中红色、绿色、蓝色路径所示)。

这里仅仅要求see,而不是strongly see。这里不要求C2 see,因为C2不是famous witness。

因为黑色的这个event能够被round 2中的所有famous witness see,所以我们就说这个黑色节点有一个round received of 2.


接下来也能找到黑色event的共识时间戳。

在A节点上找一个更早的event X,这个event X是A2的祖先,同时还是黑色event的后裔。

同样的,通过B节点找到一个event Y,这个event Y是B节点的祖先,同时还是黑色event的后裔。同样的也可以通过D节点找到这样的event Z。

取出event X Y Z的时间戳,这个时间戳是节点在创建event的时候加上的。然后按顺序对这些时间戳排序。取出排序中的中间时
间戳,这个中间时间戳就是黑色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按照所有节点都同意的顺序排序。这个顺序就是共识顺序。

猜你喜欢

转载自blog.csdn.net/sinat_34070003/article/details/80536121