今天早上,在万众期待中,Hans Moog发布了他的“终极”共识的第四篇,在这篇文章发布之后,Hans和Popov进行了一场长时间的辩论,目前还没有结束,让我们一起阅读看看里面到底有什么?
在这篇博客文章的这一部分,我想最后谈谈新的投票方案,它使节点能够在不通过额外的投票或者不得不放弃交易的情况下达成共识。
概述
目前,IOTA中的一个交易只能意味着一件事:它“批准”两个引用的交易,这意味着它保证引用的交易的完整历史,直到起源。既然交易只能表达“完全同意”,那么处理“不同意”的唯一方法就是放弃Tangle的“坏”部分。
这对投票机制没有太大的好处,因为投票的结果在前期并不是很清楚(正如“投票”一词所暗示的那样)。因此,如果节点将交易附加到了与大多数意见不一致的交易上,我们将不得不放弃部分Tangle。这增加了重新连接的需要,并允许攻击者(通过频繁的交易冲突)来伤害网络,尽管双花最终也不会成功。
事实上,这甚至是一个巨大的博弈论问题。让我引用Alexander Skidanov,他在分析雪崩Avalanche时提到了这个问题,他也使用DAG来继承投票:
交易本身,只有在其祖先中的所有交易都被批准的情况下才被认为是被批准的。因此,交易发布者有强烈的动机在祖先中尽可能少地进行交易,在极端情况下只引用创世纪。如果他们只引用了genesis,而没有任何重复发布,他们的交易将被保证被接受,而如果他们引用了其他人的交易,他们的交易将有可能因为引用的交易而被拒绝。祖先中的交易越多,拒绝的机会就越高。因此,如果没有其他的激励机制,所有合理的参与者将总是只在他们的交易中引用起源,从而创建一个非常宽、非常浅的图。
如果我们想对新交易做出决定,我们需要人们去附加这些“尚未决定的交易”,并投票决定它们的命运。但是,如果对“未决定的交易”进行投票降低了交易被接受的机会,那么首先就没有投票的激励,这意味着整个协议存在很强的激励问题。
IOTA最初试图通过使用“基于累积权重的随机游走”来解决这个问题,这意味着诚实的节点更倾向于选择离起源很远的Tip。因此,在不靠近Tip的地方进行附加将最终降低其他人获取这个交易的机会,这迫使人们遵守协议。这确实解决了问题,但也有一些不受欢迎的副作用:
- 累计权重计算是昂贵的,而且伸缩性不是很好。
- 诚实的交易有可能被抛在后面,即使它们甚至没有附加到一个冲突的交易(例如,因为它们运气不好,没有增加足够的权重)。
- 随机游走是可能被操纵的,它暴露了各种攻击向量(如寄生虫链攻击,blowball攻击等)。
由于随机游走是IOTA最大的“瓶颈”之一,因此我们希望取消它,所以我们需要找到一种新的方法,让节点能够表达自己的意见,而不必担心它们的交易在之后被抛弃掉。
新的投票制度
为了实现这一点,我们将通过在Tangle之上引入另一个“本体”来改变阅读Tangle的方式,这将允许我们在不必放弃交易的情况下进行投票。
1. 通过“世界”跟踪交易意见
正如本文前面部分所解释的,每个交易都属于一个特定的“世界”。这个“世界”独立于它的附加位置,只取决于交易所移动的资金的来源(“Tangle中的Tangle”)。不是双花的诚实的交易和数据交易将永远属于“主“世界””。我们称这个“世界”为“资金来源的世界”。
此外,每一笔交易都有反映其观点的第二个”世界“。它继承自父类,通过将参考交易的意见”世界“与自身的资金来源”世界“聚合计算得到。 这个意见“世界”代表了交易所投票支持的“世界”。由于”世界“是以分层的方式组织的,交易也会自动为所有的父”世界“投票,这些父”世界“是这个观点”世界“的祖先。
这听起来有点复杂,但它实际上只是描述了这样一个事实,即“批准”一个冲突交易的交易将继承这个冲突交易的”世界“作为其观点的表达。
让我们来看一个例子,这个观点是如何被继承的:
TX4、TX5、Tx7和TX8都是诚实的,但都属于未来的冲突锥,继承了它的“意见”
注意:聚合“世界”的规则已经在这篇博文的第二部分描述过了。
2. 多态的交易
前面的例子展示了当前Tangle的工作原理,其中交易总是继承其父辈对账本状态(观点)的看法。如果“冲突”被拒绝并因此被放弃,那么它的所有批准者也将被放弃。
为了解决这个问题,我们在每个交易的元数据中引入一个额外的标记——”branch liked switch(分支认同开关)“——它允许我们改变分支引用的含义:
将”branch liked switch(分支认同开关)“设置为0,将允许我们引用交易而不必“继承”它们的意见。
Partially Liked(部分认同): 交易的发布者认同资金来源的真实性,但不认同表达的意见——即一个诚实的交易批准了“错误的”(从交易发行者的角度来看)双花。因此,在聚合交易意见时不包括分支的意见。
Strongly Liked(强烈认同): 该交易的发行者认同该交易的意见(因此在聚合其自己的意见时包括该意见)。注意,意见自动*包含资金来源。
让我们看一下之前的同一个例子,但是这次TX4、TX7和TX8不同意“冲突”是应该成为账本状态一部分的交易的观点,他们相应地设置了类似开关的分支:
TX4、TX7和TX8可以引用不认同的交易,而不必继承它们的意见。
注意:我们将这个切换限制在分支上,因为我们不能从像一个”部分认同“中推断出很多“知识”,并且我们希望交易总是至少对它们认同什么(使用它们的主干)做出一个声明。”部分认同“只允许我们引用那些必须放弃的交易。
3. 基于本地修正的初始意见
为了确定节点的初始意见,我们使用与当前coordicide解决方案类似的基于本地修正的规则:在发生冲突时,节点最初“认可”它首先看到的交易的“世界”。
4. Tip选择算法
在最初的白皮书版本中,Tip选择算法是共识的一个非常关键的部分,因为它必须“计算”投票(找到最重(权重最大的)的子tangle)才能分发Tip进行附加。这种投票计数是一种非常繁重的操作,因为它要求我们进行随机游走,因此为协议的可伸缩性造成了巨大的瓶颈。
在这个新的提议中,我想要解耦Tip的选择和共识,这使我们能够建立一个更简单,更健壮的算法,不能通过攻击Tangle的结构来欺骗。
新的Tip选择算法的唯一目的是让节点有效地投票和表达他们当前的意见。
其工作原理如下:
- 我们保留了两个Tip列表:强烈认同和部分认同。
- 我们从强烈认同的Tip列表中随机选择主干。
如果“部分认同”Tip列表是空的:
- 我们也从“强烈认同”的Tip列表中选择分支。
- 我们将”branch liked switch(分支认同开关)“设置为1——交易强烈认同两个引用的交易。
如果“部分认同”提示列表不是空的:
- 我们从“部分认同”的Tip列表中选择分支。
- 我们将”branch liked switch(分支认同开关)“设为0—交易强烈认同主干,并且部分认同分支。
一旦交易被固化,我们将确定其资金来源和意见。
如果我们认同交易的意见:
- 我们从相应的Tip列表中删除被引用的交易,并将新交易添加到我们的“强烈认同的”Tip列表中。
如果我们不认同交易的意见,但我们认同它的资金来源:
- 我们将新的交易添加到我们的“部分认同”的Tip列表中。
这个简单的算法允许节点以一种非常有效的方式表达它们当前的观点,而不需要进行任何随机游走。
5. The Future Liked Cone (FLC)未来认同锥
在我们目前对Tangle的理解中,我们已经有了交易的未来锥的概念,它描述了直接或间接引用某个交易的所有交易。
遵循这一思想,我们定义“Future like Cone”(FLC)来包含所有直接或间接“认同”某个交易的交易。
一个交易直接或间接地认同另一个交易,如果存在一个指向被引用交易的路径,该路径包括:
- 完全出于“强烈认同”的引用。
- “强烈认同”的引用,末尾加上了一个“部分认同”的引用。
为了理解这意味着什么,我想展示一个简短的示例,看看使用到目前为止所描述的机制如何实现双花。我们从一个“健康的Tangle”开始,它不包含任何冲突(不同的颜色代表来自不同节点的交易——这后面会用到的):
因为没有一个交易是冲突的,所以所有的交易都“强烈认同”它们引用的交易(实线)。
现在让我们假设一个双花 tx2到达,它与之前的交易tx1相冲突。让我们进一步假设,一个诚实的交易连接到tx2(因为它有一个错误的连接,首先看到的是第二个交易)。认可第一个交易的节点仍然能够引用诚实的交易,即使它在不认同的双花(通过使用类似switch -虚线的分支)的后面:
节点可以通过设置”branch liked switch(分支认同开关)“为0来获取不认同的双花背后的可靠交易。
两个冲突交易的FLC是这样的:
FLC的概念将在以下构建块中发挥重要作用。
6. 基于Mana的累计权重
在讨论实际的共识规则之前,我们的最后一个新概念是基于Mana的累计权重,它将使我们能够在冲突的“世界”之间做出决定。
与白皮书版本不同的是,我们不需要每个交易的累计权重——我们只需要计算整体的“世界”的累计权重(用它的FLC表示)。
要做到这一点,我们只需遍历它的FLC,并为“支持”这个FLC的所有节点创建一个惟一的列表。这个列表中节点的累计Mana值就是这个“世界”的“累计权重”。
注意:事实上,我们甚至不需要在Tangle中游走,因为我们已经可以在交易被附加到这个“世界”(到达/固化)时维护这个唯一的节点列表。交易的意见告诉我们它们属于哪一个。
让我们看一下前面的例子,比较一下两个FLC的累计权重(每个节点都用不同的颜色表示):
tx1的FLC包含比tx2的FLC更多的节点(和可能更多的Mana值)。
7. 编号的交易和变化的意见
到目前为止,我们已经定义了节点如何投票(Tip选择)和如何计数投票(FLC的累积权重),但是为了达成共识,我们需要允许节点更改它们的观点。
其基本思想是,如果较晚的投票表达了不同的意见,那么将取代较早的投票。
因此,我们需要知道哪张票是后者(最好不要做“昂贵的”随机游走)。一种简单而直接的方法是让节点在其交易中包含一个不断增加的nonce作为交易计数器。它们从一个计数器值0开始,并在发出交易时增加它。
注意:此每个节点交易计数器还有助于速率控制和垃圾交易保护。
每当我们收到一个交易,对同一个冲突集的不同的“世界”进行认同,我们将它从独特的“支持者”的过期的“世界”,然后将其添加到独特的“支持者”的新“世界”——这种方式可以改变“世界”的累计权重(结合共识的少数服从多数的规则意见)。
8. 共识规则——权重最大的“世界”获胜
现在,我们只需要定义一个节点何时以及如何更改其意见(实际的共识机制)。
共识规则非常简单:权重最大的“世界”胜出。如果没有比另一个“世界”更重的“世界”,我们将根据创建“世界”的交易的散列排序(并选择第一个)来决定。
让我们看看我们之前的例子,在Tangle的冲突,看看节点如何改变他们的意见:
紫色节点(最初倾向于tx2)现在调整了它的观点以适应更重的“世界”,并相应地附加了他的新交易。由于它的后一票取代了前一票,它现在被计算在另一个FLC的累计Mana值中。
由于每个节点都遵循相同的行为,因此算法Tip速度非常快。一旦一种“世界”稍受青睐,整个网络就会立即跟进它的下一个交易。在大多数情况下,相互冲突的交易中发出节点的Mana值的差异可能已经足够大,足以从Tip选择开始就打破僵局。
即使在tip需要更长的时间的情况下,它也只会影响对这个特定冲突的余额的共识,因为与这样一个冲突相关的交易能够独立地发展它们自己的FLC。
9. 更快的决策——协作交易发布
为了能够做出“快速”的决定并快速达成最终结果,我们需要大量的Mana持有者不断地投票。因为强迫他们发布交易会给这些节点和网络带来很多不必要的开销,所以我们需要找到一种不同的方式来发布他们的意见。
其中一个想法是一个协作交易发布流程,其中希望发布交易的节点首先询问一个大的mana持有者的意见,然后将其答案包含在交易中。通过这种方式,每笔交易都有两个投票人(发行者和一个大的Mana持有者),我们可以相对快速地获得足够的Mana投票(更多的TPS意味着更快的确认)。
协作发出的交易的mana值在发出节点之间共享(以创建响应此类请求的动机)。这样,大的mana持有者只要被选为协作者,就只需要回答一个请求,而不必为每个交易回答来自多个节点的请求。
另外,Mana的共享可能会造成Mana在网络中分布更加均匀的情况。
总结
这个投票机制与Tangle的原始白皮书版本非常相似。我们不使用工作证明来计算累计权重,而是使用节点的Mana值来为冲突投票。
冲突中谁获得最多的票数(即拥有最终的FLC)的获胜, 但是,我们并没有放弃被拒绝的事务,而是通过“部分认同”的引用(这使我们避免了重新附加,因此也避免了普遍存在的随机tip选择的博弈论问题)使它们仍然处于Tangle之中。 ——看到这两种方法的比较:
“世界”的概念一开始可能听起来有点复杂,但本质上它只是一个算法,用来优化计算权重和跟踪交易的意见,而不需要做“昂贵的”随机游走。
我将在这篇博客文章中添加另一部分,讨论攻击向量并分析攻击者可能会做什么(它将相对简短:P)。
原文来源
https://medium.com/@hans_94488/a-new-consensus-the-tangle-multiverse-part-4-59f70fbc19e6
本文原文非中文版本,由BruceX进行翻译,如若转载,请注明出处:http://www.iota.love/201911/a-new-consensus-the-tangle-multiverse-part-4/