HASHGRAPH 共识算法详解

2023-11-04

英文版地址: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。这种情况本算法是可以解决的。

对每个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按照所有节点都同意的顺序排序。这个顺序就是共识顺序。

这个排序就是通过它们的round received来进行的。通过中位数时间戳来打破联系(这句话没怎么懂)。

 

总结一下,上文已经描述了hashgraph算法的基本过程,但是其实该算法有个前提,原文中没有提到,那就是该算法是运行在代理之上的,因为每一步决定famous witness的时候需要超过三分之二的witness see这个event,所以我推测应该是运行在代理之上的,因为在全网的话无法判断三分之二具体是多大的数字。另外此算法的机制比较复杂,也没有一个很好的证明能够说明该算法在及时收敛上是管用的。













本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HASHGRAPH 共识算法详解 的相关文章

随机推荐

  • r语言如何将图变成矩阵?_SPSS矩阵散点图:多变量关系探查利器

    多变量关系探查 矩阵散点图是非常不错的选择 是可视化利器 假设你有5个指标数据要考察两两之间关系 不需要依次制作10个散点图 矩阵散点图可以 一次搞定 在一个大坐标下完成所有散点图的绘制 按照矩阵的形式呈现出来 更高效 SPSS提供独特的散
  • C++ 学习大纲

    一 C 基本语法知识点 二 数据结构和基本算法 刷题 三 数据库 四 并行 五 网络编程 socket编程 服务器开发 并行量吞吐量稳定性 六 库的使用 引入第三方库 boost库 七 操作系统的知识
  • 四元数-坐标系转换-旋转-转欧拉角

    1 四元数世界坐标系转换到父节点坐标系下 公式 Q Q父 1 Q子 把四元数转到父坐标系下 ChildLocalQuat VDFULL GetChildLocalQuat quaternion father quaternion child
  • Qt子线程的“信号队列”(转载)

    对Qt的多线程编程没有深究 只了解了基本的用法 够我用就行了 之所以写这篇文章是因为前几天遇到一个疑问 如果其他几个线程同时向一个线程发signal 而这个线程没有自己的事件循环 那是不是会丢失signal呢 下面是我总结的两种子线程的工作
  • Android开发把项目打包成apk

    做完一个Android项目之后 如何才能把项目发布到Internet上供别人使用呢 我们需要将自己的程序打包成Android安装包文件 APK Android Package 其后缀名为 apk 将APK文件直接上传到Android模拟器或
  • (2021,FastGAN)用于高保真 few-shot 图像合成的更快、更稳定的 GAN 训练

    Towards faster and stabilized gan training for high fidelity few shot image synthesis 公众号 EDPJ 目录 0 摘要 1 简介 2 相关工作 3 方法
  • 在windows中ohmyzsh 的powerlevel10k主题及插件推荐

    1 安装powerlevel10k git clone https github com romkatv powerlevel10k git ZSH CUSTOM themes powerlevel10k 配置ohmyzsh 主题 vim
  • Java初识泛型

    目录 一 包装类 1 基本数据类型和对应的包装类 2 装箱和拆箱 3 自动装箱和自动拆箱 二 什么是泛型 三 引出泛型 1 泛型的语法 四 泛型类的使用 1 语法 2 示例 3 类型推导 Type Inference 六 泛型如何编译的 1
  • 计算机组成原理题库(2)

    计算机网络题库 目录 计算机网络题库 1 选择题 2 填空题 3 分析判断题 可能会有重复 大家跳着看 4 计算题 5 简述题 1 选择题 1 总线通信中 若发送方和接收方设备的速度有差异 但不是特别大 则最适合选择 时序控制方式 A 同步
  • unity打开VS2017异常解决 unity打开VS2017很慢 unity只打开mono

    早几天开始安装了VS2017 关联好unity 但后续使用编译脚本时 发现经常打开很慢 最后总是打开mono 检查过自己的关联没有错误 也试着修复了几次VS 上网搜了几遍 连老外的网站都看了 最后找到的解决方案是更换成VS2015 原因在于
  • PyTorch深度学习实战(8)——批归一化

    PyTorch深度学习实战 8 批归一化 0 前言 1 批归一化原理 2 批归一化优势 3 批归一化对模型训练的影响 3 1 未使用批归一化 且输入值较小 3 2 使用批归一化 且输入值较小 3 3 使用批归一化 且输入值较大 小结 系列链
  • element ui自定义主题

    一 在element ui 里找到自定义主题 1 1 在自定义主题 设置对应的颜色 并下载 1 2 在项目目录下安装element theme element theme chalk npm i element theme chalk 2
  • virtio sr-iov

    虚拟机规格 12核 32G内存 负载模拟 利用bc将CPU所有核占用提高的98 echo scale 500000 4 a 1 bc l q VirtIO 9 37 Gbps 4 5 12 SR IOV 9 40 Gbps 4 5 7 低负
  • 蓝桥杯单片机组经验分享之(一)引言

    一 开篇激励 蓝桥杯单片机组真的是非常容易拿奖的 尤其是省赛 水军特别多 结合我以及我的师兄师姐的参赛经验 基本上编程题全部完成就能保证省一了 至少广东是这情况 至于想拿国一的话得靠平时专业知识的积累了 只靠程序高分是拿不到国一的 第八届我
  • 小程序使用 企业微信客户服务插件(联系我) contactPlugin

    小程序插件接入步骤 1 开发者在小程序管理后台申请使用插件 添加路径 设置 gt 第三方服务 gt 插件管理 gt 添加插件 搜索并添加插件ID wx104a1a20c3f81ec2 无需审核确认 设置 第三方服务 插件管理 添加插件 2
  • 【Linux初阶】信号入门

    hello 各位读者大大们你们好呀 系列专栏 Linux初阶 本篇内容 Linux信号的基本概念 生活信号 技术信号 信号生命周期 信号的保存位置和发送本质 信号的产生 四种方式 一个系统调用接口 作者简介 计算机海洋的新进船长一枚 请多多
  • vue自定义指令-加载指令v-loading和占位图指令v-showimg

    了解自定义指令的钩子函数 bind 每当指令绑定到元素上的时候 就会立刻执行bind这个函数 只调用一次 和css相关的操作 可以放在这个钩子函数中 inserted 元素插入到DOM中的时候 会执行inserted函数 只调用一次 upd
  • 狂神说SpringMVC02:第一个MVC程序

    狂神说SpringMVC系列连载课程 通俗易懂 基于Spring5版本 视频同步 欢迎各位狂粉转发关注学习 未经作者授权 禁止转载 Hello SpringMVC 在上一节中 我们讲解了 什么是SpringMVC以及它的执行原理 狂神说Sp
  • 图片隐写术 - 透明部落通过BMP的RGB通道隐藏PE数据

    透明部落通过BMP的RGB通道隐藏PE数据 报告和样本 Transparent Tribe APT expands its Windows malware arsenal https blog talosintelligence com 2
  • HASHGRAPH 共识算法详解

    英文版地址 http www swirlds com downloads SWIRLDS TR 2016 02 pdf 摘要 本文通过hashgraph上的一系列例子来说明Swirld hashgraph共识算法 通过结合图形来解释算法详细