ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PoV有效性证明完整指南:Cumulus如何用见证数据重建部分Merkle树

PoV有效性证明完整指南:Cumulus如何用见证数据重建部分Merkle树 PoV有效性证明完整指南Cumulus如何用见证数据重建部分Merkle树【免费下载链接】cumulusWrite Parachains on Substrate项目地址: https://gitcode.com/gh_mirrors/cum/cumulus在 Polkadot 的 Parachain平行链生态中PoVProof of Validity有效性证明是验证一条平行链新区块是否合法的“通行证”。Cumulus 作为在 Substrate 上构建平行链的核心框架完整实现了 PoV 的生成与验证协作者Collator把区块与存储证明打包成 PoV 发给中继链验证器Validator则利用其中的见证数据在内存中重建部分 Merkle 树逐笔重放交易以确认新区块合法。本文带你快速看懂这套机制的设计思路与关键代码位置。什么是 PoV平行链区块的“自证清白”包 PoV 本质上是一个自包含的数据包验证器只需它无需事先掌握平行链的完整状态就能独立复核一个区块。一个 PoV 包含三部分内容组成部分内容作用Header区块头区块编号、父哈希、状态根等声明区块身份与预期最终状态Extrinsics外派区块内的全部交易供验证器逐笔重放执行Storage Proof存储证明部分 Merkle 树的节点与键值即“见证数据”用于重建最小可用状态理解 PoV 的关键在于验证器手里没有平行链的完整状态数据库。存储证明Witness恰恰补上了这一缺口——它只携带验证该区块实际读写过的状态键及其 Merkle 路径验证器据此拼出一棵“部分 Merkle 树”树根必须与父区块头里的状态根完全一致才算过关。此外PoV 在中继链上会被**纠删编码erasure coding**后分片每片由一名验证器持有。这也意味着单个验证器拿到的只是片段但任意足够多的片段都能还原完整 PoV。PoV 的诞生协作者如何打包见证数据 协作者出块时Cumulus 的协作服务会在client/collator/src/service.rs的build_collation中完成打包构造紧凑证明调用into_compact_proof把执行区块过程中记录的存储证明压缩成紧凑格式并绑定父区块的状态根组装 ParachainBlockData把区块头、外派与紧凑证明封装在一起压缩成 PoV通过maybe_compress_pov压缩后封装为PoV { block_data }随候选一并提交给中继链。一个值得注意的安全细节存储证明刻意不包含:code运行时字节码。相关测试见client/collator/src/lib.rs中的collates_produces_a_block_and_storage_proof_does_not_contains_code它断言验证端从证明中读取:code会失败——防止恶意协作者通过膨胀的 PoV 浪费验证资源。重建部分 Merkle 树验证器的六步流程 验证逻辑的核心在pallets/parachain-system/src/validate_block/implementation.rs的validate_block函数流程如下第一步解码与身份核验解码ParachainBlockData断言块头的parent_hash与参数中parent_head的哈希一致确保“子区块确实接在声称的父区块后面”。第二步校验验证数据validate_validation_data检查块内set_validation_data内禀交易中的中继父块号、存储根与外部参数是否一致防止验证数据被篡改。第三步重建稀疏内存数据库关键storage_proof.to_memory_db(Some(parent_header.state_root()))这是“见证数据 → 部分 Merkle 树”的转换点把存储证明还原为一棵只含被访问键的稀疏内存数据库同时验证其根哈希与父区块头状态根匹配。这一步失败整个验证立即终止。第四步接管存储接口通过一系列replace_implementation如host_storage_get、host_storage_root等把 WASM 运行时原本指向宿主机的存储调用重定向到内存数据库。验证器从此完全在自包含的环境中运行不依赖任何外部状态。第五步内禀检查check_inherents验证时间戳等内禀数据与真实世界及中继链状态相符例如通过RelayChainStateProof核验关联的中继链数据。第六步执行区块并比对状态根E::execute_block(block)逐笔重放全部交易执行完毕后取最终存储根必须与块头声明的状态根一致最后返回ValidationResult新头数据、上/下/水平消息等。✅ 至此一个仅含部分见证数据的 PoV 就完成了“自证”任何伪造的交易或状态都会被状态根比对戳穿。内存优化Trie 缓存让验证又快又省 重放区块会频繁读取树节点若每次都从证明中解码开销巨大。Cumulus 在pallets/parachain-system/src/validate_block/trie_cache.rs中实现了专用的TrieCache无上限节点缓存以哈希为键缓存已解码的NodeOwned重复访问零开销键值缓存缓存lookup_value_for_key结果加速高频键读取根计算时禁用值缓存as_trie_db_mut_cache在计算存储根时只保留节点缓存简化并发语义WASM 单线程下安全。配合参数结构MemoryOptimizedValidationParams见validate_block/mod.rsblock_data直接复用输入内存进一步降低验证器的内存峰值。当 PoV 丢失时PoV 恢复机制 中继链每个区块只挑选一条 PoV 纳入落选的 PoV 对应区块可能在平行链网络中“失传”协作者故障或作恶时。Cumulus 在client/pov-recovery/src/lib.rs实现了恢复流程监听每个被支持的中继链区块若对应 PoV 的区块本地未知则启动随机延迟计时器避免恢复请求同时涌入造成拥塞若计时期间区块经正常同步导入则跳过恢复计时器触发后通过中继链的可用性恢复协议AvailabilityRecoveryMessage收集足够片段还原完整 PoV还原出区块后按正确顺序导入并继续处理队列中的后续候选。该服务在节点启动时于client/service/src/lib.rs中创建并以后台任务cumulus-pov-recovery运行。关键源码路径速查 ⚡PoV 打包与压缩client/collator/src/service.rsbuild_collationPoV 大小日志与解压缩client/collator/src/lib.rs验证器侧六步验证pallets/parachain-system/src/validate_block/implementation.rs验证参数定义pallets/parachain-system/src/validate_block/mod.rsMerkle 树节点缓存pallets/parachain-system/src/validate_block/trie_cache.rs存储证明验证测试client/collator/src/lib.rs:code排除测试PoV 恢复协议客户端client/pov-recovery/src/lib.rs、client/pov-recovery/src/active_candidate_recovery.rs节点服务装配恢复任务注册client/service/src/lib.rs小结为什么这套设计如此优雅 ✨Cumulus 的 PoV 验证机制体现了一个核心思想——用密码学承诺替代完整状态协作者只需提交“被用到的那部分状态”见证数据而非全量数据库验证器通过重建部分 Merkle 树并比对状态根以极小成本完成完整性校验纠删编码 PoV 恢复协议保证了即使在作恶或故障场景下被中继链接纳的区块也能在平行链网络中“失而复得”。理解了 PoV 如何从见证数据重建部分 Merkle 树你就掌握了 Cumulus 安全模型中最精巧的一环。想要动手实践可以基于parachain-template/目录搭建一个平行链模板在本地网络中观察区块的协作与验证全过程。【免费下载链接】cumulusWrite Parachains on Substrate项目地址: https://gitcode.com/gh_mirrors/cum/cumulus创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表