平行链协议深度拆解 | 一个区块如何穿越六道关卡获得最终确认
原文作者PaperMoon 团队一个平行链区块要想获得 Polkadot 网络的最终安全背书需要经历候选、附议、可背书、已背书、待可用、已包含六个状态——任何一步失败都会被丢弃。这套机制的名字听起来很学术但它解决的问题极其现实几百个验证人怎么在不运行所有平行链全节点的情况下保证每一条链上的每一个区块都是合法的答案藏在一个关键的设计哲学里Polkadot 不验证状态只验证状态转换。理解了这一点你就理解了整套协议为什么可以做到少数人验证所有人安全。一、三类参与者谁来做什么验证人Validator验证人负责验证区块、维护网络安全的节点需要质押 DOT 作为抵押。验证人的核心职责是检查**平行链**Parachain连接到中继链的独立区块链共享中继链的安全性提交的区块候选的有效性证明Proof-of-Validity, PoV并确保 PoV 在指定时间内保持可用。他们持有的保证金可在发现不当行为时被罚没。在平行链协议中部分验证人会被分配为平行链验证人para-validator专门负责特定平行链的验证工作。收集人Collator收集人Collator平行链节点负责收集用户交易、打包区块候选然后提交给中继链验证人审核。收集人需要熟悉特定平行链的交易格式和出块规则并拥有该链的完整状态访问权限。他们构建出 PoV交由验证人进行验证。渔夫Fishermen——已废弃渔夫最初被设想为平行链的全节点角色用于发现作弊行为但该概念已不再计划正式实现。当前协议中的二次背书检查者secondary backing checkers承担了类似功能。二、包含管道从候选到包含的六步跃迁包含管道Inclusion Pipeline是平行链区块从创建到被纳入中继链尚未最终确认的路径。一个区块在这条管道中经历六个状态序号状态含义1候选Candidate收集人将区块及其 PoV 提交给平行链验证人2附议Seconded平行链验证人 V1 将区块转发给其他平行链验证人3可背书Backable超过半数平行链验证人签署了有效性声明4已背书Backed区块被中继链出块者记录在中继链的某个分叉上5待可用Pending Availability区块已背书但尚未被认定为可用6已包含Included区块已背书且被认定为可用正式成为平行链的一部分关键时间参数在标准流程下背书和包含需要 12 秒完成——背书占一个中继链区块6 秒包含占另一个中继链区块额外 6 秒。引入**异步背书Async Backing**后背书和包含可以在一个中继链区块内完成。异步背书Async BackingPolkadot 2.0 引入的出块机制改进允许平行链在上一个区块还未被中继链最终确认时就开始打包下一个区块形成流水线大幅提升出块效率。平行链阶段平行链验证人由验证人分配程序Validator Assignment Routine指定到各平行链。他们通过收集人分发子系统Collator Distribution Subsystem与收集人建立连接接收候选区块和 PoV。验证过程需要三样东西1. 区块候选状态转换列表2. 区块修改的平行链数据库中的值3. Merkle 树中未受影响节点的哈希收集超过半数签名有效性声明的候选被视为可背书其背书就是这组签名声明的集合。这里有一个关键设计理念Polkadot 保证的是有效的状态转换而不是有效的状态。验证人不检查平行链状态中的每一个值只检查被修改的值。这是整个协议能够扩展到数百条平行链的根本原因。中继链提交阶段可背书区块的收据被添加到中继链的交易队列中。**中继链**Relay ChainPolkadot 的核心链负责协调各平行链之间的共识与通信的出块者每个区块最多可以为每条平行链记录 1 个可背书候选。一旦被记录在中继链的某个分叉上候选状态变为已背书进入待可用状态。它只有在被证明可用之后才能被视为平行链的一部分。数据可用性阶段此阶段中验证人通过可用性分发子系统Availability Distribution Subsystem确保候选数据的可用性。他们在网络中传播擦除编码的数据片段。**至少 ⅓ 1 的验证人必须报告拥有自己的编码片段**候选才会被视为可用。出块者的可用性检查确保中继链只包含已分发擦除编码片段的区块但不保证其有效性——有效性由后续的审批流程负责。数据存储细节重建平行链区块及其 PoV 所需的擦除编码片段存储在中继链验证人的本地硬盘上保持可用时间最长 **24 小时**。这些数据既不存储在中继链区块中也不存储在链上状态中——只有这些片段的 Merkle 根被嵌入候选收据并存储在中继链区块中。包含失败的四种情况一个候选可能在以下任何环节失败1. 收集人无法将区块传播给任何指定的验证人2. 候选未获得候选背书子系统中验证人的背书3. 中继链出块者未选择该候选4. 候选的 PoV 在超时时间内未被认定为可用区块被从中继链丢弃三、审批流程随机抽检的二次防线为什么需要审批区块被包含后状态变为待审批pending approval。此时区块已暂时成为平行链的一部分但仍需进一步确认。这里的设计逻辑很精妙平行链验证人是从整个验证人集合中抽样的而协议假设最坏情况下有 ⅓ 的验证人是不诚实的。如果恰好被分配的验证人中恶意节点占多数仅靠背书阶段的检查是不够的。审批流程通过事后检测机制弥补这一风险而不是增加平行链验证人数量那会降低系统吞吐量。**重要**一个平行链区块在可用之后可以接受子区块。如果该区块在审批流程中失败它和所有后代区块都将被作废。但只有背书该区块的验证人会被**惩罚slash**——惩罚是指当验证人出现恶意行为或严重失误时其**质押**锁定在网络中以参与共识的代币会被没收一部分——而背书后代区块的验证人不受影响。审批的五个步骤1. 被包含管道纳入的区块在二次检查窗口secondary checking window期间处于待审批状态2. 在此窗口内验证人二次检查者通过 VRF 彩票机制随机自选对每个平行链区块执行二次检查3. 二次检查者获取带有 PoV 的平行链区块通过擦除编码重建 PoV重新执行验证函数4. 二次检查者传播检查结果。如果出现矛盾结果会触发升级——所有验证人必须检查该区块输的一方将被罚没5. 流程结束后区块要么被批准要么被拒绝两类密钥审批消息使用专门的审批密钥签署这些密钥是验证人会话密钥的一部分- **审批分配密钥**sr25519 密钥仅用于分配标准的 VRF 计算- **审批投票密钥**ed25519 密钥仅用于签署候选区块的有效性投票链选择与最终确认当一个区块内的所有候选收据都通过了足够的二次检查后验证人可以在 **GRANDPA**Polkadot 的**最终确认**机制——区块被永久写入链上、不可逆转的状态中为该区块投票。获得超过 **⅔ 的正面投票**后区块在链上被最终确认。链选择需要在所有节点间保持一致并能抵御最大比例的恶意节点。Polkadot 主机使用区块生产系统BABE和最终确认工具GRANDPA协同工作。四、候选收据常量大小的区块摘要PoV 的大小通常在 **1 MB 到 10 MB** 之间不可能直接放入中继链区块。为了让 Polkadot 扩展到数百条平行链PoV 需要在中继链上用更小的东西来表示——这就是候选收据。平行链验证人通过签署以下信息构建收据1. 平行链 ID2. 收集人的 ID 和签名3. 父区块候选收据的哈希4. 区块擦除编码片段的 Merkle 根5. 所有出站消息的 Merkle 根6. 区块哈希7. 区块执行前的平行链状态根8. 区块执行后的平行链状态根这些信息的大小是常量级的而平行链的实际 PoV 区块是变长的。任何人只要获得完整的 PoV 区块就可以通过这些信息验证其中包含的状态转换。五、擦除码⅓ 1 的可用性保障工作原理平行链验证人在将候选收据发送到中继链交易队列之前必须先对平行链区块构建擦除编码。擦除编码的原理是将一条消息这里是平行链区块和 PoV分割成一组更小的消息只需获得其中一部分就能重建原始消息。在 Polkadot 中**小消息的总数等于验证人总数重建所需的最小比例为 ⅓**。具体流程平行链验证人创建擦除编码片段将它们构建为 Merkle 树然后将每个片段连同候选收据发送给中继链上对应的验证人。Reed-Solomon 编码Polkadot 使用的擦除码类型是 **Reed-Solomon 编码**——一种在区块链之外已经久经考验的技术。最典型的例子是光盘CD行业CD 使用 Reed-Solomon 编码来纠正因盘面灰尘或划痕造成的数据缺失。在 Polkadot 中擦除码的作用是让平行链状态对整个系统保持可用而不需要所有验证人都跟踪所有平行链。验证人只需各自保存一小块数据在需要时只要 **⅓ 1** 的验证人能提供自己的片段就可以重建完整数据。**⅓ 1 的阈值直接对应 Polkadot 对拜占庭节点的安全假设**——即假设最多 ⅓ 的验证人可能是恶意的只要超过 ⅓ 的诚实验证人能响应数据就可以被恢复。六、争议机制最后的安全兜底什么时候会触发争议所有在已最终确认的中继链上的平行链区块都应该是有效的。为确保没有无效区块进入最终确认状态除了上述审批检查外还有**争议**Disputes机制作为兜底。争议源于两个或更多验证人之间的分歧。要触发争议需要一个恶意行为者将无效区块分发给诚实验证人。按重要性排序的三种场景1. 中继链某分支上已包含的平行链区块是无效的2. 中继链某分支上已背书的平行链区块是无效的3. 一个被附议但未在任何分支上被背书的平行链区块是无效的争议的三个阶段**争议发起**任何发现自己对某平行链区块的有效性判断与其他已发布声明相矛盾的验证人都可以发起争议。发起过程在链下开始由感知到区块有问题的节点触发。**争议参与**一旦获知争议的存在所有验证人必须参与。**争议结论**当任一方获得 **⅔ 超级多数**时争议结束。如果多数验证人由于某种原因无法投票争议也可能在超时后结束。链上与链下组件争议同时具有链下和链上组件。**惩罚slash** 在链上处理因此双方验证人的投票必须上链。此外某条分支上的争议必须被转置到所有活跃分支以确保不当行为在所有可能的历史中都受到惩罚。链上组件通过提供任意两张矛盾投票来发起同样等待 ⅔ 超级多数。该组件还跟踪哪些平行链区块已经被争议过确保同一区块在中继链的任何分支上只能被争议一次。**在争议解决之前该平行链的包含流程将被暂停。****关于区块的一个重要区分**中继链区块不包含平行链区块本身只包含平行链区块头。平行链区块存在于平行链自己的网络中。七、网络异步性现实世界的复杂性上述流程在理想情况下是线性的但现实中网络是异步的。中继链的出块者由 BABE 算法选择而 BABE 是一个允许分叉的算法——这意味着不同的出块者可能在同一时刻被选中且它们可能基于不同的父区块构建。这导致了一个关键现象部分验证人收到了区块 C而另一部分没有收到他们可能在区块 B 之上构建另一个区块 C。之后一些验证人可能同时知道 C 和 C需要在两个链头上都参与工作。两个分叉可能因网络异步性而并行增长一段时间但最终 GRANDPA 会选择其中一个分叉进行最终确认。在没有对抗性网络的情况下两个分叉长期共存的可能性很低因为总会有验证人同时知道两个链头的存在。小结- **六步状态跃迁**平行链区块从候选到包含经历六个精确定义的状态任何一步失败都会被丢弃确保只有合格区块进入中继链- **验证状态转换而非状态**验证人只检查被修改的值这是协议能扩展到数百条平行链的根本原因- **⅓ 1 擦除码**Reed-Solomon 编码让数据可用性不依赖所有验证人在线只需超过 ⅓ 响应即可重建完整数据- **VRF 随机抽检**审批流程通过事后随机检测而非增加验证人数量来保证安全在安全性和吞吐量之间取得平衡- **三阶段争议兜底**争议机制作为最终安全网确保已最终确认的区块一定是有效的作恶者无处遁逃整套协议的精髓在于一个反直觉的洞察安全不需要每个人都验证每一笔交易而是需要一套机制确保任何人的作恶都会被发现并惩罚。Polkadot 用概率抽检替代全量验证用经济惩罚替代信任假设——这不只是一个工程方案而是对去中心化系统如何在有限资源下实现无限安全覆盖这个根本问题的一次范式回答。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2412534.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!