波卡发布包括多个阶段的平行链线路图
原文: https://github.com/paritytech/polkadot/blob/master/roadmap/parachains.md
翻译: PolkaWorld
本文是平行链底层核心技术的路线图 —— 内容关于需要哪些协议、API 和代码路径才能完全展示一个自给自足和安全的平行链。本文不会涵盖平行链工具包需要公开哪些 API 才能使用平行链功能 —— 而是仅仅介绍这些功能的实现方式,以及它们提供给验证功能的底层 API(如果有的话)。
类别
我们将使用以下类别来描述功能:
Runtime: 中继链的 runtime 代码,用于指定共识关键状态,并更新所有全节点必须维护或执行的状态。
网络(Networking) : 用于节点相互交流并在网络中传输信息的协议。
节点(Node) : 部分或所有链下节点必须维护或执行的状态或更新。通常与网络组件交互,并引用 runtime 状态。
子项目和功能:
本节包含了不同的子项目和构成这些子项目的功能。
基础架构/API
对等集管理
类别:网络
分配给平行链的验证者需要一种发现并连接到整理者的方法,以便获得新鲜的平行链块进行验证。
整理者需要发现并连接到验证者,以便提交平行链区块。
渔民需要与验证者和核对者交谈,以获取可用数据并分发报告。
有些连接是长期存在的,有些仅用于单个请求。
对等集管理
类别:网络
分配给平行链的验证人需要一种发现并连接到收集人的方法,以便获得新鲜的平行链区块进行验证。
收集人需要发现并连接到验证人,以便提交平行链区块。
钓鱼人需要和验证人和收集人交流,来获取可用数据并分发报告。
有些连接是长期存在的,有些仅用于单个请求。
自定义 libp2p 子协议
波卡平行链涉及许多不同的网络协议。理想情况下,我们可以将每个任务作为单独的未来任务产生,并根据需要来通过通道与其他协议或节点代码进行通信。这需要在 Substrate 和 libp2p 中进行更改。
分配
拍卖
类别: Runtime
平行链的拍卖和注册。此功能已经实现,并且遵循 Parachain Allocation — Research at W3F 文档。
平行链拍卖
类别: Runtime
平行线程(Parathreads)是即付即用的平行链。这包括一个链上机制,用于解决收集人的拍卖并确保他们生成一个区块。
平行线程的节点侧部分的作用,是让收集人实际投放出价,并被配置为在何种条件下投放出价。
验证人分配
类别: Runtime
将验证人分配给平行链。验证人仅在短时间内分配给平行链。可调整的参数包括分配给每个平行链的时间长度和网络知道验证人分配的提前时间。
协议
见证循环
类别: 网络
一种黑箱网络组件,用于在任意给定链的验证人之间循环发送证明消息(
Candidate
,
Valid
,
Invalid
),以创建可在其上包含区块的 quorum。
可用性纠删码
类别:节点/网络
对于每个潜在的、被视为平行链的区块,对区块的 PoV 和传出消息执行擦除编码。为中继链区块调用中继链上的区块数量,此平行链区块被考虑包含在
n
中。擦除码分为 n 个部分,其中任何
f + 1
都可以恢复(
f
是允许的最大故障节点数 = ~
n / 3
)。第
i
个验证人存储第
i
个编码并将其提供给任何询问者。
PoV 区块获取
类别:网络
一种黑箱网络组件,用于平行链上的验证人或钓鱼人,以获取证明中哈希所引用的 PoV 区块,以进行验证。当获取 “当前” PoV 区块(靠近链的开头,或与当前正在构建的区块有关)时,这应该很快。当获取 “旧的” PoV 区块时,应该有可能并且要借助于从可用性擦除编码中恢复。
平行线程拍卖投票
类别:节点/网络
配置收集人在平行线程拍卖中投票的方式和时间。
收集循环
类别:节点/网络
收集人节点的主要事件循环:
- 新的中继链区块 B
- 同步新的平行链头 P w.r.t. B
- 建立 P 的新子区块
- 提交给验证人
跨链消息传递
https://hackmd.io/ILoQltEISP697oMYe4HbrA?view https://github.com/paritytech/polkadot/issues/597
平行链路线图中最大的子项目 —— 平行链之间如何发送消息。这涉及传入消息的状态机排序、用于获取这些消息的协议以及用于持久保存消息的节点逻辑。
它的设计基于平行链之间由发送者和接收者组成的单向
通道
概念。在每个中继链区块,每条平行链有机会在其控制的每个通道上发送消息,它控制了发送部分的一半。它还将尝试
按顺序
在它控制的每个接收通道的一半上处理消息:在块高 “
b
” 发送的消息,必须先于在块高 “
b + 1
” 发送的消息处理。对于在相同块高发送的不同通道上的消息,将按照一些明确定义的顺序进行处理。
这意味着,对于最近处理的消息在其接收的所有通道上的发送高度,接收段的最大高度差为
1
。接收段的最小已处理发送高度叫作 “
水印 (watermark)
”。在水印之前或水印高度的所有通道上发送到此段的所有消息均已处理。
终结 CandidateReceipt 格式
类别:Runtime / 节点
CandidateReceipt
是对提交给 runtime 的 parablock 头的包装器。它包含对数据的加密承诺,这对于验证或解释 parablock 至关重要,包括见证数据和传出消息数据的哈希。
CandidateReceipt
格式应根据上面提到的 XCMP 来终结 —— 最重要的是,它应更改为保留以加密方式提交到每个开放通道状态的
bitfield
和
message_root
域。
终结 PovBlock 格式
类别:Runtime / 节点
PovBlock
或
Proof-of-Validity
区块包含验证 parablock 所需的所有数据。它将需要包含传入的消息队列以及潜在的传出消息队列。
CST 更新程序
类别:Runtime
基于中继链区块中提供的
CandidateReceipt
的通道状态表(CST)的存储定义和更新逻辑。
CST 准入证明的生成和检查
类别:节点
中继链的全节点在 CST 中生成项目证明的工具,轻客户端或被裁剪的节点检查这些证明的工具。
MQC 存储和分发协议
类别:节点
每个通道的状态都由消息队列链(MQC,Message Queue Chain)描述,该队列是一个哈希链,其中的链接由 “
(M, b, H)
” 定义:最近发送的消息、先前发送的消息所在的块高度、以及先前链接的哈希值。
sending
平行链的全节点有责任维护 MQC 的所有链接,直到并包括
b
小于
receiving
平行链的水印的链接。
该 para 的完整节点将知道其通道的所有 MQC 头,因为它们是通过执行该块产生的。这将需要与 Cumulus 团队(https://github.com/paritytech/cumulus)在 API 上进行协作。
我们将需要一个网络,平行链的收集人可以在该网络中发现并获取从所有通道传入的 MQC 的相关部分。
通道注册者和经济学
类别:Runtime
平行链通过存放一笔存款来打开或关闭通道的 runtime 逻辑。平行线程可以打开的通道数量将受到限制。
paras 用于 runtime 逻辑通过放下存款来打开和关闭通道。parathread可以打开的通道数量将受到限制。待关闭的通道应保持打开状态,直到接收者的水印达到关闭所要求的区块高度为止。
钓鱼/Slashing
有效性/可用性报告处理程序
类别:Runtime
在 Polkadot 中,恶意的平行链组可以强制包含无效或不可用的平行链区块。钓鱼人的工作是监测这些区块并将其报告给 runtime。此项与报告处理程序有关。
关于可用性/有效性的 W3F 研究文章提供了争议解决过程的整体视角:可用性和有效性 - W3F 研究。
未解决且需要采取的主要行为之一,是在争端解决流程断定出现错误时发生的 “ 回滚 ”。当我们将平行链区块标记为无效或不可用时,我们需要将所有平行链回滚到此状态之前的某个点。我们还需要回滚中继链的状态,因为可能已经有一条消息从平行链发送到中继链,现在需要回滚。最简单的方法是通过延迟向上消息来回避该问题,但这将极大地影响平行链参与插槽拍卖、理事会投票等的用户体验。假设我们无法回避这一点,我们将必须找到一种方法来回滚中继链的指定状态。
双重投票 Slash 处理程序
类别:Runtime
在见证过程中,验证人只能为给定的中继链区块提交一个“
候选
”消息。如果在平行链区块上发布“
候选
”消息,则不能在该平行链区块上发布 “
有效
” 或 “
无效
” 投票,因为 “
候选
” 消息是隐性有效性投票。否则,在给定的平行链区块上同时进行 “
有效
” 和 “
无效
” 投票是非法的。
Runtime 处理程序需要两个相互冲突的投票作为参数,并需要对违反者进行 slash。
有效性/可用性钓鱼
类别:节点
验证者也可以根据 VRF 可用性和有效性 - W3F 研究自行选择,并采用此代码路径。验证人和钓鱼人将选择平行链区块进行重新验证。在这些步骤中:
- 尝试恢复 PoV 区块,并退回到纠删码。如果不可用,则发布报告。
- 尝试验证 PoV 区块。如果无效,则发布报告。
双重投票钓鱼
类别:节点
在见证过程中观察到双重投票的节点应向链提交报告以触发 Slash。
阶段
该路线图分为多个阶段,相对于上一个阶段来说,每个阶段代表另一组的交付成果或黑箱组件上的迭代。
阶段 0: MVP
最初的阶段 —— 这是无 slashing(完全安全)或跨链消息传递的平行链。它根本上就是注册和验证正常运行的 PoC。
基础架构/API:
- 自定义 libp2p 子协议
- 对等集管理
任务:
- 拍卖
- 平行线程拍卖
- 验证人分配
协议:
- 证明流通(黑箱:八卦)
- 可用性纠删码(黑箱:八卦)
- PoV 区块获取(黑箱:八卦)
- 收集循环
跨链消息传递:
-
终结
CandidateReceipt
格式
阶段 1: 钓鱼和 Slashing
此阶段标志着平行链安全性的进步。一旦完成,平行链就是成熟的加密经济学上安全的汇总基元。此阶段还包括有关 XCMP 的实现工作,但还没有完全启用。
协议
- 可用性纠删码(黑箱:定向分发)
- PoV 区块获取(黑箱:定向分发和获取)
钓鱼/Slashing
- 有效性/可用性报告处理程序
- 双重投票 Slash 处理程序
- 有效性/可用性钓鱼
- 双重投票钓鱼
跨链消息传递:
-
终结
PoVBlock
格式。
阶段 2: 消息传递
此阶段标志着跨链消息传递的交付。
包括 XCMP 部分剩下的几乎所有内容。