ARTICLE DETAIL

资讯详情

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

Quip Protocol运行时升级最佳实践:spec_version管理、存储迁移与签名Fixture同步

Quip Protocol运行时升级最佳实践:spec_version管理、存储迁移与签名Fixture同步 Quip Protocol运行时升级最佳实践spec_version管理、存储迁移与签名Fixture同步【免费下载链接】quip-protocol-rsA rust implementation of the Quip Protocol forked from Substrate项目地址: https://gitcode.com/gh_mirrors/qu/quip-protocol-rsQuip Protocol 是一个用 Rust 实现、从 Substrate 分叉而来的区块链节点项目。这篇文章面向初次参与运行时升级的开发者系统讲解三件事spec_version 版本号如何管理、链上存储迁移Storage Migration怎么写才安全以及签名 Fixture 如何与运行时保持同步。掌握这三点你就能独立完成一次不出事故的 Quip 运行时升级。为什么运行时升级最容易翻车 Substrate 系链的运行时升级有三个环环相扣的约束节点靠spec_version判断链上 Wasm 与本地原生运行时是否一致——版本号没对上节点会拒绝使用更快的原生运行时客户端如 Polkadot.js Apps、钱包靠transaction_version和扩展列表构造签名载荷——编码格式变了却不升号旧客户端签出的交易会被节点拒收链上已存储的数据可能有旧布局——不写迁移代码新运行时直接解码旧数据就会 panic。Quip Protocol 在这三个环节上都留下了清晰的样板代码值得逐段研读。三个版本号一张表看懂 版本号作用对象什么时候必须递增spec_version节点判断 Wasm/原生运行时一致性任何运行时改动新增 pallet、改 API、改权重都算transaction_version客户端构造签名载荷仅当交易线格式/调用参数编码变化时pallet 存储版本链上数据布局仅当存储条目的编码结构变化时经验法则拿不准就升spec_versiontransaction_version宁缺毋滥——它一升所有前端钱包和签名工具都受影响。spec_version 管理把升级原因写进注释Quip 的运行时版本集中在 runtime/src/lib.rs 的VERSION常量中当前为spec_version: 115、transaction_version: 6。最值得学习的不是数字本身而是 第 74–153 行 的版本史注释从 101 到 115每次递增都记录了三类信息改了什么例如 102 新增pallet_faucet_ops与pallet_session111 让QBlock追加了topology_hash字段transaction_version是否跟着动例如 103 因register_job_spec参数编码变化升到 3而 105 只是新增只读 API编码不变就保持 3存储版本是否升级例如 108 将全局Difficulty改为按拓扑哈希的Difficulties映射存储版本 2 → 3 并带迁移。这种版本考古学注释让后来的开发者能瞬间判断某次前端不兼容是编码变化还是权重变化也避免了误升transaction_version这种高危操作。存储迁移版本门控 try-runtime 双重保险以 pallets/miner-registry/src/migrations.rs 的 v1 → v2 迁移为例这是仓库里一个完整的迁移样板值得记住四个关键点版本门控用VersionedMigration1, 2, ...包装迁移逻辑只有链上存储版本恰好是 1时才执行避免升级重放时重复跑见 第 63–72 行数据处理的取舍要有业务依据描述符是自愈型数据矿工重启会重新上报所以迁移直接清空记录而不是逐条翻译——但清空前必须把每笔押金unreserve归还否则会造成余额双重锁定见 第 28–45 行try-runtime 前后校验pre_upgrade快照、post_upgrade断言迁移后NodeDescriptors为空升级流程中先跑校验再上主网评估数据规模注释中明确说明单块排水drain只适用于小规模数据若未来记录量达数万条必须改为多块SteppedMigration。另一个典型案例在 runtime/src/lib.rs 的 111/112 版本注释QuantumPow存储版本 3 → 4 → 5用回填默认值 逐条重编码的方式把旧布局的QBlocks平滑升级到新布局且保持只读 API 兼容。签名 Fixture 同步升级后必跑的一道题 Quip 使用混合签名方案详见 docs/polkadotjs/README.md前端签名依赖一个 JSON 基准文件 docs/polkadotjs/fixtures/hybrid-signing.json。这个文件里嵌入了三个极易漂移的运行时值specVersion与transactionVersion来自VERSION常量signedExtensions扩展列表如新增EthSetOrigin后会变化任何一项变了Fixture 就失效。仓库为此设计了生成—校验闭环第一步重新生成 Fixture。运行示例程序 runtime/examples/generate_polkadotjs_signing_fixture.rs加--write参数覆盖 JSON 文件cargo run -p quip-protocol-runtime --example generate_polkadotjs_signing_fixture -- --write生成逻辑在 runtime/tests/support/signing_fixture.rs用固定种子构造一笔真实交易同时用两条签名路径运行时原生路径与transaction-crypto-core独立实现各签一次并断言信封逐字节一致还附带 255/256/257 字节三个哈希边界用例——这正是载荷超过 256 字节要取 blake2_256这一签名规则的回放测试。第二步跑两侧测试确认同步。Rust 侧 runtime/tests/signing_fixture.rs 包含三个关键用例仓库中检入的 Fixture 必须与生成器输出逐字段相等防手工漏更新、Fixture 里的已签交易必须能解码并验证通过、篡改签名或被改地址后必须精确报BadProofJS 侧js/quip-signer的测试同样消费该 Fixture保证浏览器签名路径与 Rust 对齐。cargo test全绿就意味着版本号、扩展列表、编码格式三者在链上运行时、Rust 签名器、JS 签名器之间完全一致——这是运行时升级收尾的黄金标准。发布前检查清单 ✅升级合入后打 tag 前对照 docs/release.md 的清单执行cargo check/clippy/cargo test --workspace全部通过含上面的 Fixture 测试用export-chain-spec --raw导出测试网链规格供节点做冒烟测试--version输出与目标 tag 一致镜像按 tag 发布后拉取新镜像对已发布的链规格做一次 60 秒内发现 bootnode 的冒烟验证。总结升级三板斧spec_version每次运行时改动必升且把升级原因写成注释存进版本史见 runtime/src/lib.rs存储迁移用VersionedMigration版本门控 try-runtime 前后校验数据量大就改多块迁移Fixture 同步改完运行时立刻重新生成签名 Fixture 并跑通 Rust/JS 双侧测试流程见 docs/polkadotjs/README.md。三步走完你的 Quip Protocol 运行时升级就具备了可验证、可回放、可回滚的工程级可靠性。【免费下载链接】quip-protocol-rsA rust implementation of the Quip Protocol forked from Substrate项目地址: https://gitcode.com/gh_mirrors/qu/quip-protocol-rs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表