本文深入探讨了Hedera的Hashgraph共识机制,它作为区块链的一种替代方案,旨在解决区块链在处理速度和资源浪费方面的问题。Hashgraph通过有向无环图(DAG)结构记录网络中的所有通信历史,并利用虚拟投票机制实现快速且无需实际投票的共识。文章详细解释了Hashgraph的工作原理,包括事件的传播、时间戳的确定以及交易排序,并讨论了其与传统区块链在去中心化和数据不变性方面的权衡。
这是关于区块链的一系列文章的一部分。如果你是第一次看到这篇文章,我强烈建议从本系列的开头开始阅读。
贯穿我们整个旅程的共同因素是赋予该系列名称的相同结构:区块链。
除了我们简要了解的 Ripple 之外,到目前为止我们分析的每个系统都围绕着区块链(数据结构)这个概念,作为将交易组织成一个独特的、共享的事件历史的方式。
通常,我们将结构本身置于背景中,几乎没有触及,而专注于其他方面,例如如何达成共识,或者如何更快地处理交易。这样做,我们放弃了分析区块链本身是否是一个好的架构决策。
简单回顾一下我们在本系列开头讨论的内容,我们知道区块链是一种链表,其中对前一个元素(或区块)的引用存储为该元素的哈希值。因此,每个区块都以密码学方式与所有后代绑定,使得整个链不可篡改。
听起来不错——而且大多数生态系统确实是围绕这种数据结构构建的。但我想让我们停下来思考一下:我们是否可以使用另一种数据结构?
今天,我们将通过研究一个提出完全不同模型的系统来解决这个问题:Hedera。
从本系列文章的一开始,我们就赞扬区块链(数据结构)是组织事件历史的好方法。我们看到 Solana 的 历史证明 及其时间戳功能略有差异,但最终,一切仍然放在区块链上。
我们最初的要求只是能够对交易进行排序。 我们真正需要的是确定一个正确的执行顺序。 如果我们能找到另一种以去中心化的方式来实现它的方法,我们可能就遇到了区块链的替代方案!
Hedera 实施的一种解决方案就是如此。 他们使用的结构和共识被称为 Hashgraph Consensus Mechanism,我向你保证——它与我们习惯的完全不同。
那么这是如何运作的呢?
首先,让我们谈谈什么是 有向无环图 (DAG)。 正如你可能从相当描述性的名称中猜到的那样,它是一个具有有向边的图。 最关键的是,它没有任何循环:如果你从任何节点开始并开始沿着边移动,你将永远不会回到同一个起始节点。
就像这样! 无论你多么努力,你都找不到任何循环
Hashgraph 只是一个 DAG,其中边是指向另一个节点的哈希值的指针。 隐含地,我们说每个节点都有一些内容,就像区块链中的区块也有一些内容可以被哈希以产生唯一的标识符一样。
尽早消除这一点很重要,因为 Hedera 的整个共识机制都基于这种数据结构的属性。
为了激发接下来的内容(并暗示 DAG 的用处),让我们回到工作量证明一会儿。 当两个矿工同时创建新区块时,网络必须选择一个并丢弃另一个。 当我们扩展到越来越多的矿工时,这变得非常浪费,因为大多数区块都被丢弃了。
关键的洞察是,我们可以尝试避免丢弃所有这些有价值的努力和完全有效的信息——这就是 Hashgraph 的用武之地:通过允许同时合并多个数据源。
好的,我们已经有了结构。 我们到底用它做什么? Hashgraph 中的节点又应该是什么呢?
一切都始于 Hedera 的 gossip 协议。 我们已经在本系列前面讨论过 gossip,我们应该已经熟悉了一般概念:在对等方之间传递消息,以便它们最终到达网络中的每个成员。
但是 Hedera 的 gossip 协议 与众不同。 他们以 事件 进行通信,这些事件是包含一些元素的简单数据结构:时间戳、交易数组、签名(证明发送者的身份)和两个哈希值(指向其他事件),当然还有他们自己的 哈希。
所有这些元素都是整个过程成功的关键 - 但在指定每个元素的作用之前,我想首先将我们的重点放在事件中的一对哈希值上。
事件在节点之间随机交换,作为关于网络观察到的状态进行同步的结果。
别担心,很快就会明白了。
所以让我们想象一下 Alice 和 Bob 即将同步。 他们交换了他们最新观察到的事件,这意味着他们现在各自拥有两个事件:他们自己最新观察到的事件,以及另一方最新观察到的事件。 这些分别是自身父事件和其他父事件。
在下一步中,事情开始字面上地结合在一起:Alice 和 Bob 都创建一个新事件,通过它们的哈希值指向两个旧事件。 这将成为他们新的最新观察到的事件,因此在下次与另一个节点通信时,他们将使用这个新事件进行同步。
请注意,在同步之后,Alice 和 Bob 都将创建彼此的镜像的单独事件——它们唯一的区别是自身父散列和其他父散列的顺序。 但本质上,它们携带相同的信息。
作为一个重要的补充说明:新事件中的交易数组要么是空的,要么包含每个节点想要包含到网络中的新交易。 旧交易不会被复制到新事件中。
这也是这两个兄弟事件之间差异的来源之一!
在同步期间,参与者还会交换他们所有的事件历史——或者至少是另一个节点尚未看到的所有事件。 所以现在,他们几乎拥有相同的事件历史——相同的 Hashgraph。
这有一个重要的结果:只要 Charlie 之前与 Bob 同步过,Alice 就可以知道 Charlie 过去的事件,而无需与他同步。
是的,它很快就会变得混乱
正如你在上图中看到的,在仅与两个节点同步后,我们会获得由其他节点产生的事件的信息,因为对等方之间先前同步。 有点酷!
通过将更多参与者添加到这个同步游戏中(通过随机配对),随着时间的推移,网络中的每个对等方将最终拥有相同的 Hashgraph。 这将构成共识的基础!
不过,让我们不要忘记我们的目标:我们需要在交易上放置时间戳,以便我们可以正确排序它们。
作为网络参与者,我们可以使用这个不断增长的图 - 那么我们如何尝试从中导出一个时间戳呢?
Hashgraph 包含大量信息。 重要的是,每个事件都有一个时间戳,但问题是它可能是错误或恶意的。 然而,有了足够的信息,网络可以通过称为 虚拟投票 的过程,集体且公平地决定每个交易何时发生。
通常,投票 涉及与对等方之间交换包含投票的消息。 这转化为延迟,以及整体上更慢的共识机制。
但是通过分析 Hashgraph 结构,Hedera 做了一些出色的事情:每个节点都可以确定性地确定 每个其他节点将如何就每个交易发生的时间投票,而无需显式交换任何投票。
Wuuuut?
是的,这是一个非常棒的机制。 让我们试着放慢速度。 请稍等一下。
还有 Hedera 团队的解释。 你可能也想看看!
该算法完全是关于可见性的。 它依赖于 见证人事件 的概念,我们可以将其视为检查点。 该过程分为三个步骤:
当一个节点发布它的第一个事件时,我们认为它是属于某个轮次 r 的第一个 见证人事件。 轮次将作为将时间划分为离散块的度量,并有助于时间戳过程。
当然,这个轮次 r 是从网络的状态确定的。 新节点需要查询系统以确定当前轮次,然后再加入对话!
然后,节点将开始参与 gossip,了解越来越多的事件。 最终,它将(通过遍历 Hashgraph)获得当前轮次 r 的 其他节点 的见证人事件的可见性。
在这里,我们必须进行区分。 看到 一个事件意味着在节点持有的 Hashgraph 的某个当前版本中,从事件 A 到事件 B 存在一些 路径 。 但是 强烈看到 意味着我们可以找到从 A 到 B 通过至少 2/3(一个超多数)的网络参与者的 见证人事件 的独立路径。
是的,再读一遍。 需要一段时间才能理解它。
像这样:
在图像中,紫色事件强烈地看到橙色事件,因为我们可以找到通过 5 个参与者中的 3 个的见证人事件(蓝色)的独立路径。
当一个节点强烈看到 2/3 的网络参与者(通过来自轮次 r 的见证人事件)的轮次 r - 1 的见证人事件时,它创建的下一个事件将是轮次 r+1 的见证人事件,标志着该节点新轮次的开始。
有点复杂,是的。 给它一些时间来消化。
这背后的想法是,节点在向前移动之前确认先前的轮次已得到充分建立。 当他们对网络状态有足够的知识和可观察性时,他们可以做到这一点。
我应该注意到,见证人事件没有任何特殊标记 - 任何人都可以仅从 Hashgraph 的结构中确定事件是否是见证人。 他们确实标记了它们,但只是在本地。
检查见证人事件。 现在,我们如何使用它们?
现在我们进入了虚拟投票的核心:确定哪些见证人事件是 著名的。
开个玩笑,声誉 是一种过滤见证人的机制。 简而言之,并非每个见证人都变得著名,只有著名的见证人才成为网络的合法检查点 - 并被纳入共识决策。
至少理论上是这样。 但是我们如何确定声誉,一旦我们这样做会发生什么?
为了确定见证人的声誉,我们查看 Hashgraph,选择轮次 r(我们称之为 A)的见证人,并问自己以下问题:节点 X 的轮次 r + 1 的见证人是否看到 A?
请注意,我们这里需要简单的看到 - 两个见证人之间的任何路径都可以!
从概念上讲,我们要求的是某个节点是否知道一个见证人,如果它知道,则算作对它的声誉的投票。
当一个见证人收集到超多数的选票(超过 2/3)时,它就变得 著名。 再次,这类似于说:
大多数网络都知道这个见证人
太棒了! 我们快完成了。
因此,我们将时间划分为轮次,识别出见证人事件,并确定了哪些事件是著名的。 现在是最后一步:使用这些著名的见证人来确定每个交易发生的具体时间。
请记住:我们的目标是确定一个事件的时间戳 - 以及其中包含的交易。
假设我们想对事件 A 加上时间戳。 实际上,此事件(和所有事件)都将有它们自己的时间戳 - 但如前所述,问题是我们无法知道此时间戳是否未发生时钟漂移,甚至是否是恶意的。 我们就是不能信任它。 因此,我们需要一种不同的方法。
我们将一个见证人 首次了解 某个事件 A 的时刻定义为 A 的直接后代的时间戳,该后代也是该见证人的祖先。 我认为图片会有所帮助:
定义了这一点之后,该过程非常简单,只有两个步骤:
就是这样! 就好像每个著名的见证人用一个时间戳投票,然后,为了完全公平,我们简单地为每个投票分配相同的权重。
最终,一旦一个事件被加上时间戳,那么包含在该事件中的交易将被分配相同的共识时间戳。 如果多个交易共享相同的时间戳(这可能会发生),那么它们将通过一些额外的标准(如签名)进行排序。
最有可能按字典顺序,这意味着按字母顺序排列,但在二进制或十六进制中。 不过我没有找到确切的方法。
这实现了我们的最终目标:获得整个网络中所有交易的完全排序! 真正值得注意的是,每个节点都将得出相同的排序,而无需交换任何选票。
如果你一直在密切关注,你可能会有一个挥之不去的问题。 你看,我们确定我们需要一个超多数(2/3)的选民来确定一个事件的时间戳。 但是我们如何确定两个节点没有不同的超多数集合?
你问得完全正确! 这是 Hashgraph 共识机制最微妙的方面之一。
当结合上述三种机制时,我们可以使用来自集合论的一些结果来证明有足够的重叠以确保每个人都将得出相同的结论。 是的,节点将暂时对 Hashgraph 有不同的看法,但魔力在于仅对足够“深入”到 DAG 中的事件进行时间戳。
但这仅当 2/3 的节点是 诚实的时才成立。 每个分布式系统都有这种类型的正确操作的阈值——或者用更专业的术语来说,是保证 拜占庭容错 的阈值。 Hedera 恰好有一个相对较高的阈值,因此节点非常值得信赖是一个基本要求。
因此,Hedera 作为一个 财团模型 运行,而不是完全无需许可。 该网络由一个由已建立的组织(如谷歌、IBM 等公司)组成的 理事会 管理,该理事会运行共识节点。 与比特币不同,任何人都可以作为矿工加入,Hedera 仔细挑选和选择其共识参与者,以确保 2/3 诚实的假设在实践中成立。
我们将分析你的提案,儿子
与往常一样,这是一种权衡:你可以获得令人难以置信的速度和最终性,但你牺牲了一些 去中心化 来换取可靠性。
另一个要考虑的方面是,与区块链不同,这种 Hashgraph 结构不能无限期地增长——它只会消耗太多的内存。 由于这种限制,一旦事件 足够旧 并且它们的共识已经最终确定,节点就会修剪掉 Hashgraph 的旧部分。
剩下的是有序的交易历史——按共识顺序应用交易产生的最终状态。 Hashgraph 本身只是一种用于共识的临时机制,但需要在大小方面保持控制。
虽然这听起来很有希望,但值得注意的是,还有另一个重要的权衡:虽然 Hashgraph 实现了快速共识和高吞吐量,但它牺牲了区块链的完全不变性保证。 换句话说,区块链允许你追溯 所有交易,直到创世区块,并在需要时验证整个历史记录。 使用 Hedera 的方法,你信任 修剪后的共识已被正确计算和存储。
我敢打赌你没有想到这一点!
所以再说一次,没有什么是免费的。 我觉得我最近重复了很多次,但这是一个根本不能被低估的事实!
今天我们讨论了一些非常有价值的东西:区块链 本身并不是分布式账本技术或分布式共识的唯一可用解决方案。 就我们所知,它甚至可能不是最好的。
我的意思是,我们才进入区块链的历史不到 20 年! 谁知道呢……
Hedera 的方法当然是一个非常不同的方法,因为我们没有矿工或验证者——只有通过 gossip 协作的节点。 Hashgraph 结构只是捕获了网络的完整 通信历史,并且不丢弃任何内容。
突破在于虚拟投票机制。 可能有点难以理解,所以我建议在需要时多读几遍。
诚然,我在写这篇文章时不得不读了几遍!
如果说有什么的话,Hedera 的解决方案表明,有时最优雅的解决方案源于质疑我们的基本假设,或者至少是技术的假设。 最后,传达的信息是让我们对新的想法和可能性保持开放的心态!
只是为了澄清一下,我不是在这里推销 Hedera,就像我没有在本系列中的任何其他区块链中真正做的那样。 请记住,它也带有一些权衡,最终由我们(用户和开发者)来选择更适合我们需求的网络。
好的! 一篇文章的篇幅已经足够长了。
在下一篇文章中,我想继续探索这些与标准模型的背离,但让我们尽量保持更熟悉。 我们将研究一个老朋友的回归,工作量证明,以及我们可以做些什么来避免浪费计算工作。
在那之前,我的朋友们!
- 原文链接: medium.com/@francomangon...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!