本文作者为 Jenner @ Patract Labs 。
这篇文章基于 Polkadot 的 6be14014 提交(2020/12),目的是介绍 Polkadot 在平行链角度上的系统架构。
架构图
平行链节点主要有以下两点变动。
collator 在平行链上的角色类似于以往的独立链上的 validator。但是 collator 只提供候选区块,然后交由中继链上的 validator 进行共识。所以,平行链不再需要自己的共识机制。当然,可以保留对 collator 的选择机制。
平行链节点与以往单链节点的不同在于:需要启动一个中继链全节点服务。内嵌的中继链全节点服务中,包含了 overseer (关于 overseer 在“中继链节点结构”部分介绍)与子系统服务,并且将 overseer_handle 共享给 collator,在 collator_protocol
上注册为 collator_side
。因此,collator 能与 validator 通过 overseer 进行消息交互,例如传递候选区块相关消息。另外,平行链全节点还需要通过内嵌的中继链节点来“跟随”中继链的出块。所谓“跟随”,指的是平行链全节点的最佳区块为中继链上最佳区块包含的相应平行链区块,终结区块亦如此。
relay_chain
中继链上除了必须的基础组件外,比较重要的就是 overseer
与子系统。
overseer
Overseer 主要有以下功能:
overseer 向子系统发送两种类型的消息:Communication
, Signal
。
Communication
:子系统之间交互的消息被封装在 Communication
类型中,根据被封装的消息类型传递到指定的子系统。例如子系统 A 向子系统 B 发送一个消息 M:1. A 向 overseer 发送 AllMessages::B{M}
;2. overseer 收到后,向 B 发送 FromOverseer::Communication{M}
。Signal
:系统消息,例如块导入、块终结、关闭子系统,被封装在 Signal
中。系统消息会被广播到所有子系统。目前设计上共有 18 个子系统,其中 3 个未完全实现。
statement
statement
PoV
以平行链上的 Collator 为例,介绍节点如何与子系统协作。
build_polkadot_full_node
启动一个中继链全节点,包含 overseer 和子系统,并且在 collator_protocol_subsystem 注册为 collator_side
。如果要以 collator 的身份启动节点,启动时需要设定 --collator
,类似于以往独立链设定 --validator
启动验证人节点。follow_polkadot
:根据中继链的出块来更新平行链collator.produce_candidate
,用来生成 collation
。start_collator
:polkadot_full_node.client.execute_with(StartCollator}
,collator 和 polkadot_full_node 共享一个 overseer_handler
。handle_incoming
。接受到 ActiveLeavesUpdate
后 handle_new_activations
。propose
一个候选区块build_collation
:构建候选区块的 Collation
wait_to_announce
任务,注册成为 StatementListener
。当收到 validator 发来的 Statement::Seconded
就广播当前候选区块request_full_validation_data_ctx
在中继链上获取辅助验证的数据 ValidationData
。task_config.collator
-> produce_candidate
collator_signature_payload
签名CandidateReceipt
(包含 erasure_root
和 CandidateCommitments
的 hash),发送 CollatorProtocolMessage::DistributeCollation
给 collator_protocol_subsystem。process_msg
处理消息。收到 DistributeCollation
后,检查 para_id,然后 distribute_collation
向 validator 广播。determine_core
:计算当前平行链分配到的 coredetermine_our_validators
:计算分配到该平行链的 validator 集合,包括当前集合和下一次分配的集合connect_to_validators
:同时连接当前 validator 集合和下一组 validatordistribute_collation
:检查 collation 在 active-leaves 上,collation 没有在该 relay parent 上出现handle_validator_connected
CollatorProtocolMessage::Declare
给 validator,注册 collatoradvertise_collation
,向 validator 发送 CollatorProtocolMessage::AdvertiseCollation
,通知 validator 准备发送 collation 了。CollatorProtocolMessage::RequestCollation
send_collation
:回应 validtor。回应的 message 中包含 CandidateReceipt
和 PoV
,发送 CollatorProtocolMessage::Collation(request_id,receipt,pov)
给 validator。由于这是节点间通信,overseer 的中继只能作用于节点内的子系统之间,所以这个消息是被封装在 NetworkBridgeMessage::SendCollationMessage
中的,通过 network_bridge_subsystem 向 validator 转发消息。announce_block
,此时为暂时同步。实际上,以上所描述的 Collator 与子系统的交互也可以说是以 Collator 角度的平行链出块流程。关于以 Validator 角度的平行链出块流程将在《平行链节点的出块流程》中介绍。
想要在波卡生态中开发新项目吗?想要获得 Gavin 等重量级导师的亲自指导吗?由 PolkaWorld 社区、数秦科技、巴比特、Nano MG 创新空间、imToken、SimpleChain、Hypersphere Ventures、IOSG、Acala Network、Digital Renaissance Foundation、Patract Labs、Polkadot 生态研究院、白话区块链、Dorahacks 联合发起等发起的「Substrate 创业营」 正在招募中,助力 Web3.0 生态创新产品的诞生和成长!点此了解详情和报名。
https://github.com/paritytech/substrate
https://github.com/paritytech/polkadot
声明:本内容为作者独立观点,不代表 CoinVoice 立场,且不构成投资建议,请谨慎对待,如需报道或加入交流群,请联系微信:VOICE-V。
简介:波卡(Polkadot)第一中文社区,带你寻找 Web 3.0 时代新机遇!
评论0条