风险提示:请理性看待区块链,树立正确的货币观念和投资理念,不要盲目跟风投资,本站内容不构成投资建议,请谨慎对待。 免责声明:本站所发布文章仅代表个人观点,与CoinVoice官方立场无关

Polkadot 丨平行链系统架构一览

加密谷Live
2020年12月22日

本文作者为 Jenner @ Patract Labs 。

这篇文章基于 Polkadot 的 6be14014 提交(2020/12),目的是介绍 Polkadot 在平行链角度上的系统架构。

角色

Polkadot 丨平行链系统架构一览

架构图

  • Relay chain:中继链,负责平台安全性。

  • Parachain:平行链,拥有自己独立的状态与业务逻辑,共享中继链提供的安全性。

节点

  • validator:验证人,负责中继链的出块,同时验证来自收集者的证明,与其他验证人进行共识投票。中继链全节点,需要抵押 DOT。

  • collator:收集者,为验证人收集平行链的交易和状态转移证明(collation)。平行链全节点,同时内嵌中继链全节点服务,不一定需要抵押 DOT,可以由平行链自行激励。注意,平行线程的 collator 需要持有 DOT,以便参与出块资格的拍卖。

  • fishermen:渔民,监控验证人和收集者,检查无效的候选收据。collator 或者 validator 都可以作为 fishermen,需要抵押 DOT。

平行链节点结构

平行链节点主要有以下两点变动。

共识

collator 在平行链上的角色类似于以往的独立链上的 validator。但是 collator 只提供候选区块,然后交由中继链上的 validator 进行共识。所以,平行链不再需要自己的共识机制。当然,可以保留对 collator 的选择机制。

双服务

平行链节点与以往单链节点的不同在于:需要启动一个中继链全节点服务。内嵌的中继链全节点服务中,包含了 overseer (关于 overseer 在“中继链节点结构”部分介绍)与子系统服务,并且将 overseer_handle 共享给 collator,在 collator_protocol 上注册为 collator_side。因此,collator 能与 validator 通过 overseer 进行消息交互,例如传递候选区块相关消息。另外,平行链全节点还需要通过内嵌的中继链节点来“跟随”中继链的出块。所谓“跟随”,指的是平行链全节点的最佳区块为中继链上最佳区块包含的相应平行链区块,终结区块亦如此。

中继链节点结构

Polkadot 丨平行链系统架构一览relay_chain

中继链上除了必须的基础组件外,比较重要的就是 overseer 与子系统。

overseer

Polkadot 丨平行链系统架构一览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 个未完全实现。

Collator 相关

  • collation_generation_subsystem:collator 在块更新时生成 collation

  • collator_protocol_subsystem:collation 的请求与回应,根据 validator/collator 的角色执行对应的任务

候选区块共识

  • candidate_selection_subsystem:触发对 collation 的请求,收到 collation 后请求投票

  • candidate_backing_subsystem:对 collation 投票,签署 statement

  • statement_distribution_subsystem:广播 statement

  • pov_distribution_subsystem:广播 PoV

  • apporoval_subsystems(TODO):在 finalize 前对候选区块的再次检查

可用性相关

  • availability_distribution_subsystem

  • bitfield_signing_subsystem

  • bitfield_distribution_subsystem

  • availability_recovery(TODO)

工具类子系统

  • candidate_validation_subsystem:验证候选区块

  • provisioner_subsystem:提供平行链相关的出块打包数据

  • runtime_api_subsystem:调用 runtime api

  • availability_store_subsystem:存储可用性数据

  • network_bridge_subsystem:与 collation 相关数据在节点间传递的网桥协议

  • chain_api_subsystem

  • misbehavior_arbitration(TODO)

Collator

以平行链上的 Collator 为例,介绍节点如何与子系统协作。

启动

  • 平行链启动时,build_polkadot_full_node 启动一个中继链全节点,包含 overseer 和子系统,并且在 collator_protocol_subsystem 注册为 collator_side。如果要以 collator 的身份启动节点,启动时需要设定 --collator,类似于以往独立链设定 --validator 启动验证人节点。

    • follow_polkadot:根据中继链的出块来更新平行链

    • 初始化 collation_generation_subsystem,在此时注册 collator.produce_candidate,用来生成 collation

    • 在 collator_protocol_subsystem 上注册 Collator 所在的 para_id。

    • start_collatorpolkadot_full_node.client.execute_with(StartCollator},collator 和 polkadot_full_node 共享一个 overseer_handler

准备候选区块

  • collation_generation_subsystem 启动后会循环 handle_incoming。接受到 ActiveLeavesUpdatehandle_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_rootCandidateCommitments 的 hash),发送 CollatorProtocolMessage::DistributeCollation 给 collator_protocol_subsystem。

通知 validator

  • collator_protocol_subsystem 监听 Communication(CollatorProtocolMessage),process_msg 处理消息。收到 DistributeCollation 后,检查 para_id,然后 distribute_collation 向 validator 广播。

    • determine_core:计算当前平行链分配到的 core

    • determine_our_validators:计算分配到该平行链的 validator 集合,包括当前集合和下一次分配的集合

    • connect_to_validators:同时连接当前 validator 集合和下一组 validator

    • distribute_collation:检查 collation 在 active-leaves 上,collation 没有在该 relay parent 上出现

  • 连接上新的 validator 后,在 collator protocol 子系统中 handle_validator_connected

    • 发送一个 CollatorProtocolMessage::Declare 给 validator,注册 collator

    • 如果 validator 是属于该平行链的验证人集合,那么 advertise_collation,向 validator 发送 CollatorProtocolMessage::AdvertiseCollation ,通知 validator 准备发送 collation 了。

回应请求

  • 收到 validator 消息 CollatorProtocolMessage::RequestCollation

    • send_collation:回应 validtor。回应的 message 中包含 CandidateReceiptPoV,发送 CollatorProtocolMessage::Collation(request_id,receipt,pov) 给 validator。由于这是节点间通信,overseer 的中继只能作用于节点内的子系统之间,所以这个消息是被封装在 NetworkBridgeMessage::SendCollationMessage 中的,通过 network_bridge_subsystem 向 validator 转发消息。

出块

  • 当中继链上 statement 被 checked 后(状态为 seconded),collator 在平行链上 announce_block,此时为暂时同步。

  • 最佳区块和终结区块跟随中继链的出块。

More

实际上,以上所描述的 Collator 与子系统的交互也可以说是以 Collator 角度的平行链出块流程。关于以 Validator 角度的平行链出块流程将在《平行链节点的出块流程》中介绍。

Polkadot 丨平行链系统架构一览

Polkadot 丨平行链系统架构一览

Polkadot 丨平行链系统架构一览


声明:本内容为作者独立观点,不代表 CoinVoice 立场,且不构成投资建议,请谨慎对待,如需报道或加入交流群,请联系微信:VOICE-V。

评论0条

加密谷Live

简介:分享区块链领域专业、前沿、有趣的内容

专栏

更多>>