查看原文
其他

一个 Polkadot 平行链区块的历程

Joe Petrowski PolkaWorld 2020-02-17

加入 www.polkaworld.org 社区,共建 Web 3.0!

波卡(Polkadot)保证其平行链的有效状态转换。在表面之下,存在着一个由节点组成的乐团 —— 从验证人、收集人、钓鱼人到全节点,发挥着它们的作用,将平行链区块传送到最终的中继链。


平行链是连接到波卡网络的主权区块链。与其他区块链一样,平行链是确定性状态机,这意味着每个平行链都有一个状态,执行一批状态转换就叫生产了一个区块,并达到一个新的状态。状态就像系统的配置。想想电灯开关。它可以是 “开” 或 “关”。计算机的状态就像几十亿个电灯的开关。在最基本的层次上,一批状态转换包含要切换的电灯开关列表。状态转换函数是决定是否应该切换开关的逻辑。


波卡中的每个平行链[1]都有自己的状态。中继链将所有这些连接成一个状态,即 “所有状态的状态”,采用一种称为 “分片” 的策略。每个平行链都是波卡的分片,具有唯一的状态转换规则。平行链有独立的经济模型、治理机制和用户。由于波卡提供的接口,中继链验证人可以保证每个平行链遵循其唯一的规则,并且可以在无信任环境中在分片之间传递消息。


本文将介绍平行链区块进入中继链所经历的一系列可用性和有效性检查,一旦最终确定,它们将从整个波卡网络的安全性中获益。



一、撮合


区块创建的过程是从平行链收集人(collators)开始的。收集人类似于其他区块链上的验证人,但它们不需要提供安全保证,因为波卡提供了这些保证。收集人只需要创建扩展其最终链的区块。


统一的安全保证确保连接到波卡的链可以以无信任的方式进行交互。平行链可以在没有信任界限的情况下交互,就像以太坊上的智能合约可以在没有信任界限的情况下交互一样 —— 它们与更大的网络共享状态和验证逻辑。


由于波卡提供安全性和有效性的保证,平行链不会受到像正常区块链的攻击,如 51% 的攻击。波卡验证人将拒绝无效的区块,因此平行链只需要一个诚实的收集人来提交区块。该模型开辟了密码经济学的一个新领域,可以包括无令牌平行链、使用原生代币或者 DOT 代币的 PoS 平行链,或其他收集人选择机制。区块作者的信息通常是区块头摘要的一部分,并且易于验证。


Polkadot 中的每个平行链(Parachain)都有一组中继链的验证人来接受和验证其平行链区块,并将它们最终确定。但是,这些验证人不会像其他分片系统(无限期地将验证人分配给单个分片)那样长时间地保持不变。Polkadot 验证人经常会在 “舞会” 中发现一个新的平行链,这个平行链会转向 Polkadot “节拍器” 的节拍:BABE 共识随机信标。


验证人使用 BABE 机制生成的随机输出(与分配生产区块卡槽的一样)来确定下一步要验证哪个平行链。一旦验证人知道它的新平行链,它就会从平行链中找到要建立连接的收集人。分配给平行链的每个验证人将导入正确的状态转换函数来验证该平行链。现在收集人和验证人共享一个连接和公共逻辑,验证人可以向其中一个验证人发送一个区块。


从单个平行链的角度概括第一阶段:

  • 平行链选择一个收集人将一个区块提交给中继链,

  • Polkadot 为这个平行链分配一组验证人,

  • 并且,收集人和验证人打开连接提交区块。



二、区块准备


当验证人接收到一个区块时,它将首先检查该区块是否遵循平行链的状态转换规则。


平行链的状态存储在 Merkle 树中。状态中的每个数据点都由一个密钥(key)和一个值(value)组成。例如,密钥可以是帐户 ID,值可以是它控制的代币数。每个密钥-值对都用 hash 表示,并成为树的叶子。为了生成分支,相邻的叶子被连接起来并再次 hash,将两个点变成一个点。这个过程继续,每次将元素总数减少一半,直到树有一个单个的散列值来表示整个数据库,即状态根。

一棵小 Merkle 树。对每个存储项进行哈希散列以查找到叶子。然后,每对叶子形成下一个级别,直到有一个值保留:状态根。


Merkle 树有一个方便的特性:如果某些值发生更改,则可以通过查看新的值和树中受其影响的路径来验证更改。


基于此属性,验证人可以验证状态转换,而无需访问整个状态。它只需要:


  • 区块(状态转换列表),

  • 平行链数据库中区块修改的值,以及

  • Merkle 树中未受影响的散列。


这组信息构成了有效性的证明。散列有固定的长度。未修改的值有多大并不重要;散列足以表示它们。     

在这个例子中,Louise 给 Ben 发送了 50 个代币,有人发起了一个新的公投。Polkadot 可以用区块加上简化的 Merkle 树来验证状态转换。


现在是进行关键区别的恰当时机:Polkadot 不能保证有效的状态;但它保证有效的状态转换。Polkadot 验证人不会检查平行链状态中的每个值,只检查那些被修改的值,它确保修改是有效的。如果一条链以有效的状态加入 Polkadot 网络,并在 Polkadot 的安全保护伞下执行其所有转换,那么它将具有有效状态。[2]


一旦验证人有了有效性证明,它就会在分配给该平行链的其他验证人之间传播此信息。一旦超过一半的人同意这个区块代表有效的状态转换,它们就可以开始准备宣布它的有效性。验证人将构造一个 “候选回执”(candidate receip)(这是实际进入中继链区块的内容)和一个纠删码(erasure coding),它们将发送给网络中的所有验证人。


候选回执


在平行链验证过程中,验证人和收集人交换了大量信息。有效性证明包含整个平行链区块及其大部分的状态。为了将 Polkadot 扩展到数百个平行链,有效性证明需要一些更小的东西来在中继链上表示它们,那就是候选回执。


验证人通过签名为平行链区块构造候选回执:


  • 平行链 ID

  • 收集人的 ID 和签名

  • 父块候选回执的哈希值

  • 区块纠删码的 Merkle 根

  • 任何传出消息的 Merkle 根

  • 区块的哈希散列

  • 执行区块之前的平行链的状态根

  • 执行区块之后的平行链的状态根


虽然这看起来像一个长长的信息列表,但实际上它比有效性证明小得多,因为每一项都是固定的长度。平行链和收集人 ID 只是数字,其他的都是哈希散列(Merkle 根是哈希散列的哈希散列...)。在计算机科学中,任何以恒定大小表示任意数量信息的方法都具有可伸缩性优势。该系统通过将越来越多的信息推送到边缘,而仅通过中继链推送恒定大小的信息,从而实现系统的规模化。


父块回执的哈希确保当前回执建立在正确的链上。同样,平行链的状态根和区块的哈希散列允许任何人通过获得有效性证明来验证这种状态转换 —— 区块本身加上状态树中的更新。



纠删码


对于纠删码。在将候选回执发送到中继链事务队列之前,构造该候选回执的验证人还必须构造平行链区块的纠删码。


纠删码接受一条消息(在本例中,消息是平行链区块和有效性证明),并创建一组较小的消息,以便您可以通过获取较小消息的一小部分来重建原始消息。在 Polkadot 的情况下,较小消息的数量等于验证人的总数,分数是三分之一。例如,如果 Polkadot 有 1000 个验证人,并且每个验证人都得到一个块(chunks)(这些小的片段称为 “块”),那么它们可以用其中任何 334 个重构一个区块。


因此,验证人创建所有这些纠删码块,将这些块放入它们自己的 Merkle 树中,并将每个块发送给相应的验证人。除了这些块之外,验证人还包括候选回执,它实际上进入了中继链的一个区块中。


收到候选回执和纠删码块的验证人将候选回执包含在中继链事务队列中,其中作者也可以包含在区块中。


一个很酷的故事

 

尽管纠删码可能有点枯燥,但为什么我们要执行纠删码远比它如何运行有趣。

 

假设一个恶意的收集人向验证人提交一个有效的块,然后立即离线。这里的攻击不是要创建一个无效的事务,而是要完全关闭平行链,广义上讲,这会让大家都惨。

 

如果验证人只检查此区块的有效性,然后在中继链中完成它,那么收集人将保留其前一个状态和当前状态根,而不知道要进行什么更改来创建当前状态根。因为它们将不再拥有自己的状态,它们不能再创造新的区块。

 

因此,收集人必须能够检索并重建其平行链区块,然后才能成为最终区块。



三、中继链区块构建


为了到达这一步,收集人和验证人已经做了很多工作。每个平行链都有一小组验证人,随机分配给一个区块。这些验证人必须连接到平行链收集人,计算状态根,查找父块,创建纠删码块并将其分配给网络中的每个其他验证人。它们把这些工作都安排在候选回执中,候选回执就代表了以上所有东西。


候选回执进入中继链事务队列,验证人将它们的消息散布开来,就像对其他事务做的那样。当某个验证人赢得 BABE 插槽的领导权,它将选择候选回执来构建中继链区块。


事务队列可能有数百个平行链候选回执。区块作者如何确定要在区块中包含哪些区块?


首先,区块作者将只在先前的中继链区块中包含具有父候选回执的候选回执。此检查可确保平行链遵循有效链。


其次,区块作者仅包括作者具有纠删码块的候选回执。区块链验证人将其块发送到网络中的所有其他验证人,因此每个验证人应具有来自每个平行链的块。通过只容纳那些作者有纠删码块的候选回执,作者能确保系统可以执行下一轮可用性和有效性检查。


隐继链

 

我之前已经提到过,一种可扩展性策略是将信息推送到系统边缘。我们对 Polkadot 的想法之一是使 Polkadot 本身成为平行链。与之类似,所有代币转让、抵押、管理等事务将在 Polkadot 平行链中进行,其候选回执由中继链完成。在这种情况下,中继链区块将仅包含候选回执。



四、结尾


大多数分片的区块链协议,在每个分片上都需要大量的验证人。Polkadot 的纠删码功能,以及接下来要进行的额外检查,就是保证它在每个分片上提供相同的验证性的诀窍。而且每个分片的验证人低至 10 个。


区块作者进行的可用性检查,可确保 Polkadot 仅包含验证人为其分配块的区块,但不能保证其有效性。由于每个平行链上验证人的数量非常少,因此合谋是一个合理的问题。通过将出块(BABE)与最终确定(GRANDPA)分开,Polkadot 可以在生产区块之后但最终确定之前,执行额外的有效性检查。[3] Polkadot 有一类特殊的参与者 —— 钓鱼人(Fishermen),它们在中继链区块中巡逻,缉拿那些无效的候选人回执。


钓鱼人本质上是抵押了一些 DOT token 的平行链全节点。虽然平行链收集人不需要任何 DOT token[4],但它们只需要来自自家平行链的激励来创建区块,而钓鱼人则确实需要抵押 DOT token 作为反欺诈机制。如果没有任何价值物作为抵押,钓鱼人可能提出虚假的无效声明。


当区块被添加到中继链后,它将进入验证阶段。在该阶段中,随机选择的验证人必须执行二次检查,来测试内部候选回执的可用性和有效性。二次检查包括了请求足够的纠删码块以重建编码块,以及有效性证明以验证状态转换。


验证人创建新区块时,会将区块发送到其与网络的连接处,网络再将区块转发到连接处。验证人导入一个块时,它将检查该块中每个候选回执是否具有纠删码块。如果缺少任何块,则验证人将警告其他块。如果超过三分之一的验证人,在设定的时间段内发送了丢失块的警报,则该区块将被丢弃。


一旦该区块通过宽限期,便开始进行二次检查。Polkadot 要求的二次检查的数量取决于收集人和钓鱼人,它们分别测试候选人回执的可用性和有效性。如果钓鱼人检测到一个认为无效的块,则它会提交无效声明同时抵押一些 DOT token。同样,收集人提交不可用性声明。具有更多无效性或不可用性声明的区块,需要验证人进行更多的二次检查,一直到要求三分之一以上的验证人证明区块的有效性或无效性。像不可用宽限期一样,如果超过三分之一的验证人报告一个块为无效,则该块将被丢弃。[5]


收集人和钓鱼人执行额外的可用性和有效性检查的角色,进一步将可伸缩性推到了边缘,并远离了中继链验证人。随着平行链数量的增加,相应的执行这些检验的收集人和钓鱼人的数量也随之增加,而不会给验证人增加新的负担。额外检查让验证人的工作量保持低水平,这些检查主要是为了解决不协调的问题。


在对一个区块中的所有候选回执执行了足够的二次检查之后,验证人终于可以在 GRANDPA 中对该区块(并扩展为所有先前的区块)进行投票。一旦它拥有超过三分之二的预先提交,该区块就在最终链中。

验证人必须执行足够的二次检查,才能对区块进行投票。此功能为中继链提供了三个区域:最终链、具有有效最终确定候选人的 GRANDPA 投票区域,以及区块需要进行可用性和有效性检查的钓鱼区域。


Polkadot 中的所有平行链都遵循中继链的最终确定性。未来的平行链区块必须始终以最终中继链中的候选回执为基础。从一个区块的编写块到最终确定,所有可用性和有效性检查应在不到一分钟的时间内完成。


一旦完成,该区块将从共享安全环境中受益,该安全环境允许链以无信任的方式彼此交互,而还原该块将需要还原整个 Polkadot。恢复整个网络是一项艰巨的任务,应予以避免,这就是为什么验证人、收集人和钓鱼人必须确保以 Mozartesque 精度进行有效状态转换的原因。纠删码框架和我们的 BABE / GRANDPA 共识使 Polkadot 能够以比其他任何区块链网络更快、更可扩展的方式提供这些保证。



后记


本文仅讨论了对平行链区块的验证,但暗示了在平行链之间进行无信任消息传递的环境。因为相同的验证人保护所有平行链,所以跨链消息与单个链中的跨帐户消息具有相同的完整性,例如以太坊上的合同间通信。


在 Polkadot 的跨链消息传递协议(XCMP)中,平行链之间建立了直接通道。共享全节点的平行链可以直接散播消息,而不共享全节点的平行链可以向验证人请求消息。仅频道操作,例如打开和关闭,以及交付证明进入中继链。XCMP 只是 Polkadot 通过将信息推送到边缘进行扩展的另一种方式,同时仍然为无信任的交互提供了必要的保证。


有关跨链通信的更多信息,请参阅 Polkadot 的消息传递方案。


要了解有关 BABE 和 GRANDPA 的更多信息,请参见 Polkadot 共识系列。



注释

  1. 本文中始终使用 “平行链”,但是除非特别说明,这些内容也适用于平行线程(parathreads)。

  2. 当然,用户得知道 “验证” 是什么意思。

  3. 步骤的分离是双重欺诈预防机制。验证人仅检查区块中的候选回执,而不检查平行链提交的每个回执。

  4. 虽然对于平行链收集人而言是正确的,但平行线程收集人将需要持有 DOT token 才能参与区块拍卖以安排其区块执行。但是,由于平行链收集人处于担任钓鱼人的良好位置,因此它们可以轻松担当这两个角色。

  5. 当某个集合中的两个子集不存在交集时,超过三分之一的阈值足以接受或拒绝一个区块。这一点听起来可能有点奇怪,然而,拜占庭容错系统要求验证人的故障少于三分之一。如果超过三分之一的人说某个区块是有效的,而另外超过三分之一的人说这个区块是无效的,那么该系统的假设就被打破了。


原文:https://polkadot.network/the-path-of-a-parachain-block/amp/

翻译:PolkaWorld


更多内容:


波卡周报 | Web 3 基金会发布有关 KSM / DOT 辟谣声明

加入 Kusama 的千人节点计划!

Parity 招聘 Runtime 工程师和开发推广,可远程办公!


扫码关注公众号,回复 “1” 加入波卡群

关注 PolkaWorld

发现 Web 3.0 时代新机遇


点个 “在看” 再走吧!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存