LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 行情分析 > Polkadotv1.0:分片和经济安全

Polkadotv1.0:分片和经济安全

2022-01-25 Polkadot 中文平台 来源:区块链网络

本文关于支撑 Polkadot 的技术。Polkadot 是具有异构分片的分片区块链。在这种情况下,分片意味着将工作拆分到多个子区块链上,称为平行链。异构意味着每个区块链都有自己的状态转换功能,该功能专为特定用例而构建。不同类型的交易会有不同的归属地,这使得特定场景的链可以最有效地为其用户服务。Polkadot 为所有平行链提供安全和消息传递功能。

这篇文章主要是为对区块链共识有一定了解的技术读者写的。我希望它对除了开发者以外的人有用,并为大家提供对基础层区块链面临的问题和挑战以及 Polkadot 如何解决这些问题的见解。我不会详细介绍我们的解决方案的每一个细微差别,但我会深入描述我们考虑的事物类型以及如何保证我们的目标实现。

Polkadot 之前的链

对区块链的简化理解只涉及一条单链,从这条链的创世区块延伸到其尽头。对于许多人来说,这是唯一重要的链概念,它代表了所有已经发生并已被网络同意的状态转换。任何区块链共识系统的最终目标都是为观察者提供这一事实来源。然而,这条单链,我们可以称为最终链或规范链,只是可能存在的许多可能的竞争链中最后剩下的幸存者。区块链共识算法的作用是从许多可能的链开始,最终只确定其中一个。

区块生产者可以产生下一个区块,但一次可能有多个获胜者。在工作量证明中,矿工通过找到一种方法来生成一个新块,当该块 hash 到一个低于某个困难目标的唯一随机数,从而获得在给定块之上的生产块的权利。在充分竞争的环境中,矿工可能需要大量尝试才能找到满足此条件的区块。作为参考,在撰写本文时,比特币网络的累积哈希率为每秒 162 Exahashes,这意味着比特币矿工总每秒要尝试 162 万亿次来获得贡献下一个区块的权利,难度目标设定为平均每 10 分钟只有一个哈希值低于目标值。请注意,多个矿工可以大致同时找到一个解决方案,该解决方案在区块链中引入了一个小分叉。未来的矿工将不得不选择在哪些区块上进行开采,这可能会导致分叉变长。规则是遵循最长的链,对于从过去的区块开始的攻击者来说,追赶并压倒更长的链变得越来越困难。因此,在最长链中足够深的块可以被认为是概率上最终的块。

Ouroboros 系列权益证明协议使用称为可验证随机函数 (VRF) 的加密技术,通过将时间划分为离散的插槽并将每个验证人从已注册和质押的验证人集合(验证人集合)中分配出来来模拟工作证明每个 slot 产生一个可验证的随机值的机会,如果低于阈值,则作为允许验证人创建新块的凭证。与工作量证明一样,多个验证人可能会产生一个低于阈值的 VRF 值并同时创建块,从而导致分叉。验证人不会激励故意引入分叉,他们会受到 slash 惩罚来扣除他们的链上的质押。这些协议还提供了最长链分叉选择规则下的概率确定性。

与工作量证明中的矿工不同,Ouroboros 式网络中的验证人只需要运行一次计算就有机会创建一个块,而不像矿工必须做的大量哈希值。这允许验证人将大部分时间花在构建带有交易的区块上,并随后允许区块链包含更有价值的计算。

Polkadot 的中继链使用一种称为 BABE 的协议,它是 Ouroboros Praos 的演变。BABE 对 Praos 的具体改进是 BABE 避免了依赖中心化 NTP 服务器让验证人知道当前时间。

BABE 是分叉的,具有概率确定性

虽然概率确定性很好,但等待一个块在最长链中达到一定深度是一种效率低下的机制,因为它旨在适应预期的最坏情况,即网络处于一定程度的网络压力和攻击之下。可能大多数网络已经就哪些区块是规范链的一部分达成了一致。事实上,在几乎所有情况下,网络都能够在一个区块达到最长链的最小深度之前就已经达成共识。为此,我们引入了确定性小工具(finality gadget)和绝对确定性(absolute finality)的概念。最终性小工具是在概率性最终区块链之上运行的二级共识协议,它证明了网络将认为哪些区块是最终区块的更快协议。这些共识协议引入了进一步的经济安全属性:在不 slash 惩罚至少 1/3+ 验证人集合总权益的情况下,确定性小工具永远不会最终确定 2 个竞争块。

Polkadot 的中继链使用称为 GRANDPA 的确定性小工具。它可以在任何特定长度的子链上实现近乎瞬时的最终确定性,并且通过让验证人反复对他们认为位于最长链头部的块进行反复投票来粗略地发挥作用。GRANDPA 目前在 Polkadot 和 Kusama 网络上运行,在撰写本文时拥有 900 个验证人的 Kusama 上,它可以在 3 秒内实现新区块的最终确定性。

验证者对他们认为最好的链进行投票,该算法让他们就要最终确定的公共块达成一致

BABE 和 GRANDPA 的结合允许 Polkadot 仅使用来自单个验证人的输入来乐观地增长链,这很快,并通过获得绝大多数验证人的签名在后台完成。这种属性的组合意味着在良好的网络条件下,Polkadot 实现了高吞吐量和低延迟,而在糟糕的网络条件下,中继链实现了高吞吐量和(更)高延迟,因为 GRANDPA 将转向跟踪 BABE 的最终性。

分片:通过子集选择进行扩展

让我们回到分片。分片的目标是通过以交易的形式在许多称为分片的链上拆分工作来提高吞吐量。分片由顶级区块链引用和保护。在 Polkadot 中,顶级区块链称为中继链,分片是平行链。中继链上出现的大多数数据都是包含对新平行链区块的引用的交易,这使得处理中继链本身的任何分叉变得便宜。请注意,我在这里区分了中继链的任意分叉和最终的中继链。我们在这里的大部分工作是确保中继链的最终部分(用户将其视为规范链)仅包含对有效平行链块的引用。

此图或类似图在互联网上广泛分布。它们展示了验证人如何被分成组并分配给平行链,并从收集人那里获得平行链区块提案。在这篇文章中,我对许多更细微的概念进行了视觉解释。

如果每个验证人只需要检查一些提交的平行链块,而不是全部,分片就只是对可扩展性的改进。如果有 10 条平行链,并且每个验证人必须检查所有 10 条链中的所有区块,我们不妨将所有交易放在一个区块链上,然后收工。诀窍是找到一种方法,让每个验证人在保持经济安全的同时尽可能少地做验证工作:提倡不良平行链区块的验证人在经济上不会受到激励。更具体地说,在他们所有质押被惩罚之前,将一个坏的平行链区块包含在最终的中继链中,一组对抗性的验证人应该不可能串通一气。验证人,实际上是验证人的一小部分,可以串通以获得中继链的未最终分叉所引用的不良平行链块,但我们保证这些分叉在最终确定之前被忽略,并且违规者被惩罚。

当引用它们的中继链块最终确定时,平行链块被最终确定。

当引用它们的中继链块最终确定时,平行链块被最终确定

让我们对我们要防御的对手做出一些具体的假设:

攻击者最多可以控制所有验证人的 1/3,并且可以控制所有这些验证人的行为完全符合预期。

攻击者可以查看诚实验证人人与其控制的验证人之间的所有网络消息。

攻击者可以随时拒绝最多 X% 的验证人,阻止他们发送或接收消息。

在攻击者开始拒绝任何验证人之前需要一个固定的延迟。

在这篇文章中,我不会为该协议设置正式的安全证明,但这些约束应该可以让我们深入了解我们打算防御的攻击类型。

事实上,我们平行链共识的基本单元实际上并不是平行链,而是我们称之为可用性内核或简称内核的东西。这些类似于 CPU 内核:它们并行运行,并在离散的 slot 中安排工作。每个平行链都有自己的专用内核,这意味着它总是被调度到一个特定的内核上。但是,我们也可以将多个链多路复用到一个内核上。唯一的区别是调度算法。

内核服务是中继链吞吐量的有效描述。内核直接对应于验证人需要做的工作量。每个内核最多可以在每个中继链块处理一个平行链块,在峰值。

在任何分片区块链系统中,只有一些验证人检查每个平行链块,数据可用性是确保检查平行链块所需的数据可以恢复以进行欺诈检测的关键组成部分。可用性内核由中继链管理,并跟踪哪些平行链块正在等待数据可用性。可用性内核的主要目的是作为调度原语,并在数据可用性比平时慢时提供背压。

可用性内核的逻辑如下所示。当内核准备好接受新的平行链块时,内核是空的,此时它们被占用。然后,数据要么变得可用,要么可用性过程超时。那时,内核再次变空。

将平行链共识划分为 5 个不同的协议是有帮助的,这些协议在中继链共识中交织在一起。

收集

支持

可用性

审批检查

争议 Disputes

Collation 收集是创建平行链块的过程。收集人构建一个平行链块并将其发送给验证人。

Backing 支持是由一小组中继链验证人最初检查平行链块并在中继链上注册的过程。支持的主要副产品是,如果后来的协议失败,它要求验证人将自己置于危险之中。

Availability 可用性是支持验证人分发检查平行链块所需的数据片段并确保以后可以检查的过程。

Approval Checking 批准检查是随机验证人恢复数据并执行平行链区块的过程。他们根据是否认为平行链区块有效来批准或发起争议。

Disputes 争议是解决验证人对平行链区块的冲突意见、忽略不良平行链区块并惩罚违规者的过程。争议仅作为故障保险存在,预计不会经常触发。

请注意,验证人可能同时参与这些协议中的每一个,并且通常是它们的多个实例化。例如,验证人可能在参与支持较新区块和对更旧区块争议的同时,参与对管道更下游的平行链区块的批准投票。

这种内部并行性也反映了实现的架构:这些协议中的每一个都被实现为一个独立的子系统,并且所有子系统都并行运行。每个节点总是在做一些事情。

提交区块和增长平行链

本节介绍平行链如何与中继链同步增长。

将潜在的平行链块包含到平行链中需要 2 个步骤。第一个是中继链块引用平行链块以及关于其有效性的证明。下一步是检查平行链所需的相应数据。

由于中继链可以有短期分叉,每个平行链也可以有短期分叉。如果在给定高度有两个相互竞争的中继链块 A 和 B,并且 A 包含平行链块 P,B 包含平行链块 P',那么这也构成了平行链中的一个分叉。

出于本文的目的,我们将考虑 Polkadot 中继链状态机的简化版本。提醒大家一下,中继链分支中的每个块都代表从前一个状态到下一个状态的转换。

每个块表示从区块链的先前状态到某个新状态的原子变化单元。账户余额、可用性核心、治理建议和智能合约都是区块链状态的一部分。块通过固有的 logi 更新状态

在构建区块链时,典型的设计模式是节点收集信息并在链下工作,然后将工作记录放在链上。例如,您可以通过相同的视角查看交易包含。节点参与链下八卦协议以收集新交易,然后区块作者将其选择的交易捆绑到一个区块中。平行链的工作方式相同:大部分工作都是在链下进行的,但工作记录保存在中继链上,以提供共识的规范指示。

节点为发展平行链所做的链下工作涉及整理、支持和可用性。

节点监视中继链的最新块以确定它们应该做什么工作。

校对由平行链头和 PoV 或有效性证明组成,这是检查从前一个平行链头到当前头的转换所需的所有数据。只有头部才能在链上运行,但必须提供 PoV。我们使用纠删码来确保 PoV 可用:数据被分成称为块的块,每个验证器一个块,任何足够大的块子集都可以恢复完整数据。这可以防止节点脱机或谎报拥有自己的数据。

在此示例中,数据被拆分为 9 块,任何 4 块或更大的子集都可以恢复完整数据

当验证者观察到可用性核心是空的,并且在该核心上调度的平行链是节点被分配到的平行链时,它将尝试从整理者那里收集整理并参与支持过程。新的潜在平行链区块以及验证者的证明通过八卦系统传播。这意味着每个连接良好的节点都知道每个下一个潜在的平行链块。下一个中继链区块作者监控网络状态并选择一组新的平行链区块以支持他们创建的中继链区块。

这是一个粗略地描述验证器为支持过程执行的逻辑的流程图。只要平行链的可用性核心为空,它们就会执行此逻辑。

该图显示了验证者如何从收集者那里获得新的平行链区块,并与其他验证者合作以从指定的验证者那里获得足够的支持。未分配到平行链的验证者仍然会监听证明,因为无论哪个验证者最终成为中继链块的作者,都需要为多个平行链捆绑已证明的平行链块并将它们放入中继链块中。

一旦平行链区块在链上得到支持(即,它的标头与选定验证者的证明一起出现在中继链区块中,并且通过了各种健全性检查),它就开始占据可用性核心。

当验证器观察到可用性核心被占用时,如果它不是最初证明该块的验证器组的一部分,它会尝试获取其擦除编码的 PoV 块。否则,验证器负责将块分配给相应的验证器。

可用性分布:非支持验证器向支持验证器请求它们的块。一些非支持验证器可能无法直接连接,但只要足够,就可以了。

验证器从需要分发它们的支持验证器请求他们的数据块

每个验证者都会签署关于它拥有哪些区块的平行链区块的声明,并八卦这些声明。中继链区块作者在中继链中包含此类语句。一旦 2/3+ 的验证者表明他们拥有占据核心的平行链块的块,则认为平行链块是可用的,并被正式包含为平行链的一部分,并且核心再次免费。

如果在一定数量的块内没有达到可用性,那么核心被释放,被认为是超时并且占据核心的平行链块被放弃。

可用性核心逻辑作为回顾

总而言之,支持和可用性协议确保在包含平行链块时,它已得到少数验证者的证明,并且检查平行链块所需的 PoV 的可用性已至少得到证明 2/3 的验证者。换句话说,支持和可用性是关于在游戏中获得皮肤并执行问责制。下一节将讨论 Polkadot 如何确保没有经过更彻底检查的平行链区块不会最终确定。

批准检查和最终确定性

批准检查是一种机制,验证者通过该机制随机选择检查可用的平行链块,并将其检查的意图和结果传达给网络的其余部分。

现在,让我们将批准检查的实际过程作为一个黑匣子。我们将首先介绍我们希望该协议做什么的背景知识,以便稍后清楚为什么它会以这种方式运行。

正如我们已经确定的那样,每个验证节点都参与了 GRANDPA,即最终性小工具。GRANDPA 以轮次进行,我们可以将每个验证人在每个 GRANDPA 轮次中所做工作的过度简化版本视为这些步骤的重复:

下一轮开始

选择最终目标区块:我们希望最终确定的最佳区块

对最终目标进行投票

等待其他验证者的投票

找到出现在验证者投票的至少 2/3 链中的最高公共块

完成该块

回合结束

验证者在这个过程中唯一的灵活性是在第 2 步:它选择要投票的区块作为他们的最终目标。这种选择称为投票规则。在基本的 GRANDPA 中,每个验证者只需选择他们知道的中继链中最长的分支,并提交该链的负责人作为他们的投票。但是,对于平行链共识,我们引入了新的投票规则。

GRANDPA 批准检查的投票规则规定每个验证者应该:

选择中继链最长的分支

找到链中最高的块 B,使得当前最终块和 B 之间的每个块仅触发包含验证者观察到已被足够验证者批准的平行链块。

让我们分解一下。请记住,一个主要目标是让网络只完成实际上好的平行链块,并且让每个验证者做尽可能少的工作,以便网络可以扩展。所以在部分:

找到链中最高的区块 B:我们希望每个节点对符合其他标准的最高区块进行投票,以便最终性尽可能快地推进。

使得当前最终确定的区块与 B 之间的每个区块:投票规则需要验证者对仅包含良好平行链区块的链进行投票。在 GRANDPA 中,对区块的投票被视为对其所有祖先的投票,因此即使区块 100 仅包含良好的平行链区块,区块 99 和 98 也可能不会。因此,投票规则需要找到通过其他标准的中继链块的最高连续链。

仅触发包含平行链块:回到关于平行链扩展的部分,这里所说的是平行链块已通过中继链块中的可用性证明变得可用,并且平行链块已添加到 平行链。尚不可用的平行链块还不算作平行链的一部分。

验证者观察到已被足够多的验证者批准:这指的是我们将在下面描述的批准检查机制,这是一种让验证者对平行链块是好的有高度信心而不必自己检查的方法 依靠别人的检查。

下面是 3 个示例,说明如何应用投票规则来选择要对最终确定的区块进行投票。

在第一个示例中,这显示了邻接属性以及我们选择最佳链的祖先的事实。

在第二个示例中,我们对最终确定的区块进行投票,因为这两条链都不是最终确定的。

在第三个示例中,整个最佳链是可最终确定的,因此我们选择对此进行投票。

最后,值得注意的是,这个投票规则是一个在每个验证者上运行的过程,并且他们都可能根据他们看到的中继链块和批准消息对最终目标有不同的看法。但这很适合 GRANDPA:如果所有诚实的验证者都运行这个投票规则,那么除非 2/3 的节点同意它可以最终确定,否则任何中继链块都不能最终确定。

批准检查会稍微减慢最终确定性,但只是一点点。平行链允许有大约 3 秒的执行时间,恢复数据大约需要 1 秒,消息被八卦需要几秒钟。在乐观的情况下,这意味着它增加了大约 5 秒的最终确定性。这是真正的终结,背后有 Polkadot 的全部重量。

因此,让我们进入批准检查的过程,以及节点实际上在做什么,以了解哪些平行链块是好的并且已经被足够多的验证者检查。

批准检查属性和安全性

批准检查是验证者为每个平行链区块运行的子协议。每个验证器节点都在为每个中继链块中的每个平行链块运行批准检查过程。这个过程有几个特点:

任何特定节点上的进程要么输出“good”,要么停止。

如果平行链区块是有效的(即通过检查),那么它最终会在诚实节点上输出“good”。

如果平行链区块无效,那么它只会在低概率的诚实节点上输出“good”

请注意,无效情况下的“低概率”大约是数十亿分之一,具体取决于验证者数量和最小检查者数量等变量。这不是低概率的加密版本,但它适用于加密经济学。

Polkadot 的安全论点基于 Gambler's Ruin。虽然确实可以进行数十亿次尝试暴力破解该过程的攻击者最终会成功,但我们将此过程与一个惩罚系统相结合,以确保每次失败的尝试都伴随着攻击验证者的全部股权的惩罚。Polkadot 是一个权益证明网络,在撰写本文时,每个验证者都有大约 200 万个 DOT 权益支持。最有可能的是,每次失败的尝试都会导致 10 或 20 个验证者的 slash。但即使只有 1 个验证者被削减,很明显攻击者的资金会在成功之前迅速枯竭。

我们通过批准检查的其他一些属性来实现这一点:

验证者检查平行链区块的任务是保密的,直到他们自己披露。

验证者的分配是确定性生成的。

验证者在恢复执行这些检查所需的数据之前广播检查平行链块的意图。

当验证者广播一个检查平行链区块的意图然后消失时,这会导致更多诚实的验证者开始检查。

属性 1 确保攻击者不知道要拒绝谁来阻止他们检查块。

属性 2 确保即使攻击者获得了幸运的“抽奖”并且有足够的恶意节点来说服诚实节点已经检查了某些内容,也很可能有诚实节点将与他们一起进行检查,并且这些诚实节点将发出警报。

属性 3 确保诚实节点不会通过向恶意节点请求数据而意外地将自己暴露为检查者,然后在没有人注意到的情况下被对手离线。即,如果攻击者试图让检查者保持沉默,它会被其他人注意到。

属性 4 确保看似已被 DoSed 的节点将被更多节点替换。批准检查就像九头蛇:如果你砍掉一个头,就会出现另外两个头。

下一节将更详细地介绍批准检查的实际工作原理。

验证者检查什么?

这里验证者的目标是确定支持验证者是否参与了任何不当行为。这需要 3 个步骤:

下载 PoV 数据以检查区块。这是通过获取 1/3 的块并将它们组合以形成完整数据来完成的。

确保 PoV 数据对应于有效的平行链状态转换。

确保平行链区块头提交的所有输出实际上与平行链区块执行的输出相匹配。

假设> 2/3的节点是诚实的并且已经承诺拥有他们的数据块,那么恢复可用性永远不会失败。这就是为什么仅对可用的平行链块进行批准检查的原因。

但是,步骤 (2) 和 (3) 都可能失败。当步骤(2)失败时,表明状态转换本身就是垃圾。当步骤(3)失败时,表示状态转换成功,但中继链上记录的状态转换输出信息是错误的。

在步骤 (3) 中要注意的一个重要情况是平行链块头包含对 所有 擦除编码块的承诺。我们让验证器在恢复 PoV 数据后进行额外检查,即将 PoV 转换回其纠删码形式,并确保标头中的承诺与所有块匹配。如果没有匹配,这可以避免一种攻击,攻击者可以有选择地选择哪些验证器可以恢复数据。攻击的工作方式是这样的:攻击者将数据分成块,并用垃圾替换除 1/3 之外的所有块。它将 1 个有效块分配给诚实的验证者,并给另外 1/3 的验证者垃圾数据。恶意的 1/3 验证者保留了其余的带有有效数据的块。这意味着有足够的验证器 (2/3 + 1) 来考虑可用数据,但如果恶意验证器拒绝回答有关其 1/3 好块的请求,则只有垃圾可用。检查数据的重新编码是否确实与承诺相匹配,可以彻底击败这种攻击。

如果步骤 (2) 或 (3) 中的任何一个失败,检查器将提出争议并将块升级到所有验证器以执行相同的检查。稍后我们将回到争议中来讨论这究竟意味着什么。

验证者何时检查

了解批准检查系统的关键见解之一是每个验证者都被分配检查每个平行链块,但这是他们检查的时间问题。如果验证者在检查时间之前发现平行链区块已获得批准,那么他们根本不检查并继续前进。

从 Unix Epoch开始,时间分为 0.5 秒的离散。0.5 秒的选择是基于小消息通过 gossip 网络传播的预期时间。

验证者打算检查平行链块的时间以延迟部分表示,它与平行链块相关。延迟批次的范围从 0 到 MAX_TRANCHES,并且对应于节点意识到平行链块变得可用后的滴答数。节点对第 0 行对应的分期付款的视图略有不同。

MAX_TRANCHES 是一个协议参数,它确定检查每个平行链块需要多长时间。将它设置得太小意味着我们可能会选择比我们需要的更多的检查器,从而浪费精力。设置太大意味着检查平行链块需要很长时间。作为参考,在撰写本文时,该参数在 Polkadot 和 Kusama 上设置为 89。

刻度是时间的离散度量,基于从 Unix Epoch 开始的半秒增量。

延迟部分是相对于产生中继链块的偏移量。

第 0 批是特殊的,因为第 0 批中的预期检查者数量被设计为大致等于 MIN_CHECKERS,这是一个协议参数,指定在一个平行链块被批准之前所需的最小检查量检查程序。

作为平行链区块支持组的一部分的验证者不允许参与批准检查,因为他们的检查是多余的。所有其他验证器在本地运行 VRF 计算,以确定它们要检查的延迟部分。

分配、批准和未出现

验证器在批准检查中发送两种消息:分配和批准。分配用于传达检查平行链块的意图和资格,并且批准消息表明平行链块已通过所有检查。

每个验证者使用 VRF 和平行链 ID 和中继链块 BABE 凭证作为输入,立即生成一个分配来检查平行链块。验证者将其分配保密,直到需要为止。每个分配都唯一且确定地与延迟部分相关联,延迟部分表示当验证者被分配检查平行链块时的延迟部分。

VRF 很重要,因为它意味着接收者可以验证分配,并且分配的验证者对分配给他们的延迟部分没有影响。验证者确实会通过更复杂的攻击产生一些间接影响,这些攻击涉及在 BABE 随机性有利时故意分叉中继链,但我将把它留到另一篇文章中。

批准是一条简单的消息,由发布验证者签名,表明平行链区块已通过检查。

当验证者开始检查平行链区块时,它所做的第一件事就是将其分配给其他验证者。这会通知其他验证者等待相应的批准消息。验证者完成检查后,会发出一条批准消息。如果批准消息不在 NO_SHOW_DURATION 内,则其他节点将初始验证者视为未出现。未出现旨在表明对手观察到验证者检查平行链区块的意图并试图让他们沉默。NO_SHOW_DURATION 是一个协议参数,目前在 Polkadot 上设置为 12 秒。

这是一个显示 3 种情况的图表:未出现、已完成的任务和延迟完成。最后一种情况尤其重要,因为它展示了验证者如何“起死回生”,即使在被认为没有出现的情况下也能获得批准。

实现:调度和批准状态机

关于批准检查协议的最后一部分将详细说明用于批准平行链区块的状态机。

每个验证器节点都为每个包含的(可用的)平行链块维护一个批准状态。由于网络中的时间和异步性,验证者的状态版本可能会有所不同。国家让我们回答以下问题:

平行链区块是否被批准?

T档的分配是否相关?

在没有其他输入的情况下,问题 (1) 或 (2) 的答案可能发生变化的下一个时间点是什么时候?

批准状态可以通过 3 种方式更新:通过接收新任务、通过接收新批准或通过时间推进。

验证器运行状态机,直到问题 (1) 的答案为“是”。在每条输入之后,他们使用问题 (2) 来确定他们是否应该开始自己检查平行链块,通过查看他们的分配是否相关。问题 (3) 仅用于优化目的:节点通常并行运行数千个这些状态机(每个未完成的平行链块一个),并且每次滴答都轮询所有这些状态机效率低下。

这是每个验证者运行的逻辑,直到平行链块被批准

状态实际包含的是两部分:

所有收到的作业,按批次排序,并用第一次观察到的刻度进行注释。

全部获得批准。

验证器在开始检查之前不会在状态中包含自己的分配。在产生批准后,验证者将其包含在状态中。

这是状态的可视化表示;它是一个中立的对象,可以根据收到的任务、经过的时间以及获得的批准来回答问题。

批准状态中最重要的操作之一是确定要计算哪些分配。我们将全部延迟付款。作业总是与来自同一延迟部分的所有其他作业捆绑在一起。一个节点永远不会从延迟部分计算一个分配,而不计算它知道的同一延迟部分的所有其他分配。

分配处于以下三种状态之一:

待定:该任务没有相应的批准,但它是最近发布的。

已完成:任务有相应的批准。

未出现:该任务没有相应的批准,最近也没有下达。

未出现的任务需要由至少一个非空档覆盖。也就是说,每个未出现都需要被至少一个分配覆盖,但期望不止一个(基于参数化)。

通过以下程序确定要分多少次:

分批,从第 0 批开始,直到它们至少包含 MIN_CHECKERS 分配。

取非空档,每次缺席一张。如果这些非空档中有更多未出现的情况,请重复步骤 2。

如果所有未出现的任务都完成了,那么平行链区块就被批准了。换句话说,如果有任何分配仍在等待中,那么平行链区块就不会被批准。

如果您在任何时候都用完了可取的部分(最大值是协议参数),则该块不会被批准。在该协议的实际版本中,对于不采用“未来”的部分以及基于步骤 2 的每次迭代的漂移时间,还有一些进一步的限制。

此流程图捕获每个验证器运行以确定平行链块是否被批准的逻辑。需要注意的是,这仅基于验证者实际看到的分配和批准。可能存在更改计数过程结果的分配,但如果运行该过程的验证器未收到它们,则不能考虑它们。

如何计算和解释收到的任务和批准

此过程的关键要点是,如果有足够的早期分配,则根本不计算后期部分的分配,并且在神秘情况下消失的节点将被替换。

以下是批准计数程序结果的 4 个示例:

每当验证者运行此批准计数程序并发现需要更多分配时,它就会检查是否应该触发自己的分配并开始检查。验证器在以下情况下触发其分配:

验证者尚未触发其分配。

分配的部分与国家相关:要么它是国家已经计入的部分的一部分,要么计数程序用完了部分并且分配不在未来。

总结

批准检查协议是 Polkadot 的主要欺诈检测机制。在任何事情到达此阶段之前,我们已确保检查所需的数据可用。这种机制要么导致每个平行链块的批准或升级,并且被设计为使试图消除检查的验证者的 DoS 攻击者被更多的检查者所取代。批准检查是九头蛇。它旨在吃掉攻击者并在另一端将其吐出。它将它们发送到我们称之为争议的系统:Polkadot 的共识法院。

争议:为金钱而争吵

当 2 个或更多验证者对平行链块的有效性存在分歧时,就会发生争议。虽然本文前面的大部分内容都集中在快乐路径上,即平行链块实际上是好的情况,但争议是关于批准检查器实际检测到无效平行链块可用的错误路径。

争议过程相对简单。它旨在满足以下目标:

通过所有验证者的投票来确定平行链区块的好坏。

如果平行链块是坏的,请确保不要最终确定或构建任何中继链块使其可用。

确保纠纷的输家受到相应的惩罚。

首先,争议是关于满足 Polkadot 更高级别的目标之一:确保没有任何不好的事情被最终确定。

参与争议的验证者在“支持”或“反对”类别中投票。参与是自动的或明确的。

通过支持和批准检查自动参与。当验证者为平行链区块发布支持证明或批准消息时,他们自动算作参与了“for”类别。事实上,诚实的验证者会记录他们收到的所有最近的支持和批准检查消息,以便以后提供证据反对他们的同行。

绝大多数验证者不是自动参与者。这些验证者明确参与,这意味着他们签署了“赞成”或“反对”类别的投票。他们在进行与批准检查员相同的检查后这样做,即

下载 PoV 数据

验证状态转换

验证对状态转换输出的承诺

参与不是强制性的,但只有至少 2/3 的验证者在一方投票后才能解决争议。验证者因参与而获得奖励,并因站在多数一方而获得奖励。

争议要么以赞成或反对状态结束,因为验证是确定性的。以前的支持和批准声明(分别标记为 (B) 和 (A))会自动计入“for”列

对争端的失败者有严厉的处罚。对实际有效的平行链区块提出异议只是浪费时间和带宽,因此会受到少量惩罚。提交无效的平行链区块是对 Polkadot 的攻击,因此 slashing 惩罚为 100%。

远程和本地纠纷

争议主要是一个脱链过程。也就是说,它们发生在“链条”的级别,而不是“链条”的级别。但是,最终确定的中继链的分叉应该包含争议记录。这是因为削减是一个链上过程。

当发生争议时,所有投票都会记录在链的每个分叉上,以触发罚没并创建争议的永久记录。

远程争议,关于中继链的分叉,是指引用了未包含在中继链分叉中的平行链块。

本地争议,关于中继链的分叉,是指包含在中继链分叉中的平行链区块。

做出这个决定的原因是因为它告诉我们需要放弃中继链的哪些分叉。任何记录了针对平行链区块的本地争议的中继链分叉都应该避免,并且不应由诚实的验证者保存。换句话说,诚实的验证者观察到平行链块是坏的,将自动对包含坏平行链块的中继链的分叉发起 51% 攻击。

最终结果是中继链的最终分叉不包含任何失去争议的平行链区块。然而,当诚实的验证者构建新链并忽略坏的平行链块时,他们会将新分叉上的争议作为远程争议重播。惩罚得以保留,但罪行的影响已从历史中抹去。

此图显示了有争议的平行链块是如何根据您正在查看的中继链的哪个分支是远程或本地的:

关于中继链块的争议是本地的或远程的

争议和共识规则

与批准检查一样,争议伴随着诚实验证者共识参与规则的修改。这些变化有两个主要目标:

避免最终确定任何涉及不良平行链块的中继链分叉。

避免在中继链的任何分支上构建,该分支指的是坏的平行链块。

这些目标分别对应于 GRANDPA 和 BABE 内部行为的变化。

GRANDPA 投票规则是对批准检查 GRANDPA 投票规则的修改。它指出:

根据批准检查投票规则选择一个区块。

找到该链中的最高块 B,以便从最后一个最终确定的块到 B 的所有块仅触发包含没有持续争议或已丢失争议的平行链块。

这与批准检查投票规则类似,但让我们解开最重要的部分,其中验证者忽略中继链块触发包含平行链块:

没有持续争议:这指示验证者避免最终确定存在争议的平行链区块,直到有足够的验证者参与。换句话说,“比抱歉更安全”。

已经失去争议:如果验证者看到 2/3 的意见反对平行链区块,则该验证者将永远不会投票最终确定触发包含该平行链区块的中继链区块。

在此图中,我们展示了如何将争议 GRANDPA 投票规则应用于链的一些示例:

还有一个 BABE(区块作者身份)链选择规则服务于第二个目标。通常,BABE 指示验证者通过在具有最高权重(类似于高度)的中继链块之上构建来扩展中继链。修改后的 BABE 链选择规则指出:

中继链块被认为是可行的,如果它们已最终确定,或者如果它们的父块是可行的,并且中继链块触发包含的每个平行链块是无可争议的或赢得了争议。

如果没有可行的子节点,则中继链块是可行叶。

验证者应该建立在他们知道的具有最高权重的可行叶上。

BABE 链选择规则的含义是,诚实的验证者将放弃中继链的分叉,这会触发包含任何被发现无效的平行链块,即使这意味着暂时建立在较短的链上。

下图显示了 BABE 链选择规则如何要求验证者放弃并停止构建包含已失去争议的平行链块的链的示例。这有效地使他们 51% 攻击中继链的坏分支。

在实践中看起来像是中继链的简短自动回滚。下面举例说明:

在区块 1a 中,包含一个平行链区块 P。

到区块 3a 建成时,平行链区块 P 已经存在争议,被认定为无效。

诚实的验证者开始忽略块 1a 和 1a 的任何子块。相反,他们构建了一个新链,从一个不包含无效平行链块 P 的替代块 1b 开始。

这些诚实的验证者将与平行链区块 P 相关的争议消息发布到中继链的新分叉上,从而确保 P 的支持者被削减。一旦 4b 构建完成,它就会超越原始链,并且 1b 最终确定。

回滚是可能发生,因为诚实的验证者在 1a 获得批准之前不会最终确定它,而批准过程是引发争议的原因。一旦 P 有争议,验证者就会暂停 1a 的最终确定。当 P 输掉争议时,验证者在任何情况下都将拒绝敲定 1a。

一个错误的平行链区块被忽略的“回归”示例

综上所述,争议逻辑是确保检测到的不当行为得到妥善惩罚以及中继链重组以完全避免不良平行链区块的一种手段。争议和相关的链选择规则是 Polkadot 与常规乐观汇总的主要区别。乐观汇总运行在对最终性或分叉选择没有影响的链上,这意味着它们必须对最终确定任何坏块的风险极为保守,因此会施加较长的欺诈期和提款持续时间 (几天或几周)。

在 Polkadot 中,争议协议和链选择规则意味着,当争议正在进行时,最终确定性会被简单地延迟几秒钟,并且链可以围绕坏块构建。终结性仍然很快,终结性仍然是安全的。

这篇文章深入介绍了区块链共识以及我们如何应用这些概念来构建 Polkadot。我们设计方法的很大一部分围绕着确保在网络条件良好时快速运行,但在网络条件差时正确运行。大多数时候,不会有攻击验证者。网络延迟会很低,而带宽会很高。在这样的情况下,批准和最终确定可能会在几秒钟内发生。但是当存在攻击验证者或网络状况不佳时,最终性会相应减慢,中继链有能力围绕不良平行链块进行重组。

自 2016 年夏天以来,我们一直在以一种或另一种形式研究这套协议。看到这些东西在实时、高度分散的网络上实施和运行,真是令人难以置信。

自从我们几年前踏上这段旅程以来,区块链扩展问题只会变得更糟。我们已经看到了许多方法,但其中许多都缺乏安全性或去中心化。Polkadot 通过其支持、可用性、批准检查和争议系统,是提供可扩展性、去中心化和安全性的实用解决方案。

关于协议开发

「以下为个人观点」

构建软件系统是理想、实用主义、美学和时间之间不断的角力比赛。现实永远不会完全符合理想。没有什么是完美的,但事情可以是好的。

协议的理想化版本与最终在计算机上运行的实现之间存在脱节。这类似于戏剧中的角色与演员对该角色的体现之间的差异。全世界的服务器都将穿上我们验证者的服装,但无论他们多么努力,他们都永远不会成为我们协议的验证者。

协议开发是一项重大任务。它需要大量的时间、精力和精力。它需要愿意忽略发生在边缘的绝大多数事情。这些牺牲是典型的——一件作品只能通过提供它所不是的一切来创造。构建某些东西是关于定位彼此相关的符号。最重要的是,建设需要愿意失败。作为协议开发者,我们别无选择,只能失败。但在这样做的过程中,我们遇到了荒谬,并找到了意义。

互联网的大众媒体鼓励主要将建筑信息作为达到目的的手段。我们被鼓励将构建作为更大事物的一部分:商业、金融系统、社会运动和政治声明。将这些目标植根于工艺和建造不仅仅是功能性的东西,而且充满关怀和优雅的简单快乐是很重要的。努力构建一个系统的每一部分以与其他部分保持一致是一种自豪感,即使以其他物质回报为代价也是值得的。

我们已经构建了这里描述的协议超过 5 年,我选择以这种方式结束这篇文章来回答许多读者会提出的问题:“为什么有人要花 5 年时间做这个?”。这是给加密空间中所有新加入者的信息。这适用于自 2020 年浪潮以来一直乘风破浪的每个人。如果您发现自己正在从贪婪和纷争中寻找避难所,那么它就存在,而且它一直都在这里。

本文作者:Habermeier「Polkadot founder」

查看更多

—-

编译者/作者:Polkadot 中文平台

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...