我想了很久如何架构这些技术系列。因为很难选择一个大家都能跟得上的技术水平,因为每个人的背景不同。如果你是新手,可以看看系列的第一篇文章,大致了解一下Tangle的工作原理,以及它与区块链的区别。(这里)。再往下说,我会用一些技术术语,但你应该能顺利理解。
共识算法的思想是将Tangle结构化,让每个观察者只要观察Tangle就能得出什么是有效的,什么是无效的结论。一旦Tangle以这样的方式结构化,节点就会在本地计算出最终性。
共识形成的过程可以这样分解:
- -一个节点收到一个交易;
- -节点接收到一个事务,它在本地检查是否有效;
- -如果节点认为交易有效,它就把它附加到它的Tangle副本中,并把它广播给它的邻居。
- -它把将它放在Tip选择算法中进行处理(那些是节点认为有效的Tip)。(注:Tip是最近已加入的交易,这些交易是新交易进行引用的候选者。IOTA协议规定,一个交易只有被2个或多个交易引用,它才会被固化(确认))
- -如果一个节点检测到冲突(2笔交易试图花费相同的资金),它就会报告它。
- -如果冲突被报告,节点投票解决冲突。
- -这时,节点要么仍然认为交易是有效的,要么它知道这是一个双花。
- -所有节点都会这样做
- -他们继续发布交易,并引用(Reference)Tip选择算法中的交易(那些是他们喜欢的Tip)。
- -如果一个交易被FPC投票认为是无效的(下面解释),TIP(未确认的交易)选择算法就不再引用它。
- -节点会在本地计算有多少节点引用了该交易。
- -当它达到一定的阈值时,它会确认它是最终的和不可逆转的。
- -所有的交易都会这样做。
与区块链中的中本共识相比,IOTA的共识背后的天才之处在于,在IOTA中,节点假设一个交易是有效的,他们只对冲突的交易进行投票。在区块链和中本共识中,所有节点基本上都会问领导者什么是真的,他们会验证领导者的决定。在IOTA中,没有领导者。所有节点同时发出交易。
当节点假设一个交易是有效的,他们只须在本地检查,如果它是有效的,他们将它附加到他们的Tangle副本中,并向他们的邻居进行Gossip广播。之后,如果它们检测到双花,那么它们会参与解决冲突。他们使用FPC(快速概率共识)来达成协议。你可以阅读数学证明(在这里)。
我试着用通俗的语言解释一下它的工作原理,让大多数人能够理解。
当冲突被报告时,节点必须就什么是有效的,什么是无效的达成一致。他们会随机询问其他节点的意见,并进行多次投票(多轮投票)。
如果有超过多数的节点喜欢一个交易,他们都会以高概率达成协议,认为这个交易是有效的。
如果没有相当多数的节点喜欢某项交易,那么这项交易将高概率地无效。
节点不会询问所有节点的意见,而是只询问随机的节点子集。
拥有更多共识法力的节点在网络中拥有更大的发言权(权重)。他们会被更频繁地询问,所以他们的意见比低法力值节点的意见更有价值。
高法力值的节点会把他们的意见写在Tangle里,并把它通过gossip广播。他们这样做是为了减少他们端的消息开销。他们知道节点会询问他们的意见,所以通过这样做,他们只陈述一次意见,并让所有人都能看到。
低法力值的节点不会这么做,因为只有少数节点会询问他们的意见,所以直接回答这些节点比向所有根本不会考虑他们意见的节点八卦他们的意见更有效率。
当每个节点连续N轮没有改变意见时,就会单独停止投票。
这就是对FPC工作原理的简单解释。
为什么IOTA可以异步达成共识?
这就是Tangle数据结构的特性造成的。区块链是一个线性的数据结构,有一个总的交易排序。哪个交易先来很重要。节点不仅要对交易的有效性达成共识,还要对这些交易的顺序达成共识。Tangle是一个非线性数据结构,它没有总的排序。节点只对交易的有效性达成共识,并不关心哪个交易是第一个,哪个是第二个,在一个时间范围内。我说在一个时间段内,因为在这个时间段内,顺序是不知道的,但你可以清楚地说,一个交易发生在今天,而另一个交易发生在昨天。只有在那个时间段内,当节点不知道哪个交易先发生时,才有可能发生双花攻击。
如果攻击者尝试双花,他会强迫节点投票。如果他等待交易得到确认,并且他的两个交易之间已经有足够的时间,在这种情况下,节点知道第二个交易来得比较晚,它将被拒绝而不投票。在不知道顺序的情况下,我们如何定义这个时间窗口呢?本质上,它是网络延迟的倍数(我认为是网络延迟的2倍)。过了这个时间,你就知道所有节点都收到了交易。如果没有报告冲突,你就知道未来试图进行双花的攻击者在之后来了,并且会被拒绝。
这个共识的另一个重要部分是Tip选择算法。Tip是最近已加入的交易,这些交易是新交易进行引用的候选者。
为了保持简单,节点随机选择他们喜欢的Tip。他们在交易中参考这些Tip。当一个节点收到来自邻居的交易时,它会检查它是否有效,是否有冲突。如果节点接受了交易,它就会看是谁发出的,它参考了哪些交易。
这是一个关键点。
这些引用向一个节点传达了足够的信息,所以它知道发行节点的意见。当它通过这种方式收集到足够多的意见时,它就会计算出交易的最终性。意见是由法力(Mana)加权的,所以当达到一定的阈值时,交易就是最终的、不可逆转的。
需要注意的是,交易只在有限的时间内被视为Tip。如果它们在这段时间内没有被参考,它们就会成为孤儿并从账本状态中删除。
冲突的交易会产生多个事实(realities),但只有一个事实获胜。就是那个事实得到足够的批准权重,而其他事实则被丢弃。一个有效的方法是使用 “审批重置开关 “来保留那些附着在被丢弃的现实中的事务。这样一来,这些事务就不必重新附着在获胜的(主)事实上。我做过一个关于这个主题的视频(这里)。
计算交易最终性的一个最笨的方法是遍历Tangle,看看有多少独特的节点引用了它。将他们的共识法力值相加,如果大于某个阈值,交易就是最终的。然而这是一种低效的计算批准权重的方式。在IOTA中,一个叫做 “标记 “的概念被用来高效计算审批权重。想详细了解的朋友可以看看(这里)。
关于Tangle和这个共识机制的美丽之处在于,当一个交易是最终的时候,它是不可逆的,你不能回滚它。在中本共识中,你可以。你可以回滚生产新的区块,一旦这个链子变得比之前的链子长,它就赢了,另一个链子就会被丢弃,就像它从来没有发生过一样。(在IOTA中,冲突的真实性也会被丢弃,但这些交易从未被确认)。
诚实的交易会在几秒钟内得到确认,因为节点不会对它们进行投票。不会被检测到冲突,它们会迅速积累批准权重。另一方面,恶意行为者将不得不等待更长的时间让FPC解决冲突,因此节点同意如何格式化Tangle。
你可能想知道,攻击者可以一直发出冲突的交易,并使节点处于投票循环中吗?
不能,每个攻击者的资源都是有限的,我们都是如此。他只能根据他所拥有的法力尝试用有限的TPS来攻击网络,这是他的权力。他即可以选择通过双花消费来浪费他的TPS(每次尝试需要2次以上的交易),或者他可以选择做一些更有意义的事情,比如出租他未使用的TPS来获得回报。无论哪种方式,这都是他的选择,网络都会成功缓解任何尝试。
希望你觉得这对你有帮助,有参考价值。这些帖子的原样,免费提供给任何愿意阅读的人。他们类似于我的观点和理解。它们不是投资建议,对于官方的研究和实施,请参考IOTA的官方渠道。有任何问题可以在twitter上联系我(这里),或者加入IOTA的官方Discord(这里),在这里你可以与社区互动,提出你的问题和疑虑。
本文原文非中文版本,由BruceX进行翻译,如若转载,请注明出处:http://www.iota.love/202101/the-tech-behind-iota-part-2-consensus/