Release v473
Runtime 473 (proposed)
Published
2026-10-05 13:52:31
Generated
2026-10-05 14:06:13
总 PR
7
HIGH
2
MEDIUM
3
Stage2
0
官方 Release Notes 总结
本次发布宣布运行环境升级至 **spec_version 473**,目前 CI 已提交部署多签的一半,等待委员会(triumvirate)的第二签名才能执行。
建议通过本地 srtool 构建该标签的 WASM 并逐字节比对,或使用 `btcli upgrade check` 独立验证发布工件与链上状态的一致性。
升级详细参数包括 commit `f87cada631f81d11683e715a9f059f693992e64a`、部署时间点 `9217147:25`、部署多签地址等,未涉及安全修复、资金/共识/账户变更或 breaking change。
TL;DR(PR 分析)
本版核心为Alpha存储格式从V1迁移至V2(多区块有限迁移),直接影响链上资金和存储结构;同时引入委托Alpha热键移动冷却期以防御griefing攻击,并新增BLS12-381预编译支持EVM链上签名验证。其他为测试网常量调整和CI优化,不涉及共识或安全核心。
HIGH 重要更新 (2)
废弃旧的 Alpha/TotalHotkeyShares 存储格式的第一阶段——添加多区块有限迁移,将遗留 V1 数据转换为 V2 格式并清理微尘(dust)仓位
判级:该 PR 移除核心存储类型(Alpha/TotalHotkeyShares)、新增处理真实用户仓位和 TAO 余额的多区块迁移、修改运行时升级迁移元组和 on_idle 执行逻辑,属于直接影响链上资金和存储结构的高风险变更
关键改动
- pallets/subtensor/src/migrations/migrate_alpha_v2.rs(新增 1203 行):核心迁移模块。定义 retired 存储别名指向已退役的 Alpha/TotalHotkeyShares;通过 on_idle 分批执行三阶段迁移(阶段0转遗留行→阶段1转遗留分母→阶段2扫 V2 微尘);对每个仓位先估值,符合条件的自动解质押退款或删除销毁;使用 with_storage_layer 保证单行原子性、游标保存跨块进度、Progress 结构体记录审计计数器
- pallets/subtensor/src/lib.rs(-31 行):从 pallet 存储定义中移除 Alpha、TotalHotkeyShares、AlphaMapLastKey 三个 V1 存储项(V1 数据仍通过 retired 存储别名访问,直到迁移完成)
- pallets/subtensor/src/staking/helpers.rs(-50 行):删除已废弃的 populate_root_coldkey_staking_maps() 函数(V1 版),保留 V2 版 populate_root_coldkey_staking_maps_v2()
- pallets/subtensor/src/staking/stake_utils.rs(+27 行):重构 unstake_from_subnet 为内部函数,新增返回 BasketFlushWork 信息的版本供迁移使用
- pallets/subtensor/src/macros/hooks.rs(+11 行):on_idle 中增加 alpha_in_progress 检查,暂停网络解散清理直到迁移完成;加入 continue_migration 调用;并在解散/膨胀清理判断条件中增加 alpha_in_progress 门控
- runtime/src/lib.rs(+2 行):在运行时 Migrations 元组中注册 migrate_alpha_v2::Migration<Runtime>,使其在每次运行时升级时调度迁移
- precompiles/src/staking.rs(+24 行):V1 预编译中读取仓位时从 pallet_subtensor::Alpha 改为 pallet_subtensor::migrations::migrate_alpha_v2::retired::Alpha
- 多个测试文件:更新引用指向 retired::Alpha/TotalHotkeyShares,新增迁移的完整测试覆盖(边界条件、回滚、锁定仓位保护、跨子网聚合销毁等)
发布473版本:合并Alpha存储迁移、委托alpha热键交换恢复保护、测试网root-claim限额提升、BLS12-381预编译及CI改进
判级:该发布PR包含Alpha V1→V2存储迁移、委托alpha回收保护和BLS12-381预编译等核心运行时变更,且已合并至主分支,属于已生效的重大更新
MEDIUM 更新 (3)
为委托 Alpha 的 hotkey 交换引入目的地位置冷却期(StakeMoveCooldownUntil),防止验证人注销后重复 hotkey 交换的 griefing 攻击。
判级:新增安全加固逻辑(冷却期),但不涉及资金/共识核心路径,未改变现有存储结构,属于 bug 修复而非规则破坏,影响范围限于 hotkey 交换频率,故定为 medium。
关键改动
- pallets/subtensor/src/lib.rs:新增存储双映射 `StakeMoveCooldownUntil<(netuid, hotkey) -> block>`,与 owner 解耦,coldkey 变更不能重置;使用 `DefaultZeroU64` 默认值。
- pallets/subtensor/src/macros/hooks.rs:在 `clean_up_hotkey_swap_records` 中按 netuid 清理过期的 `StakeMoveCooldownUntil` 条目(`cooldown_until <= block` 时移除)。
- pallets/subtensor/src/subnets/dissolution.rs:子网解散清理时同时清除 `StakeMoveCooldownUntil` 的前缀。
- pallets/subtensor/src/swap/swap_hotkey.rs:- 在 `prepare_hotkey_stake` 中记录实际移动非零 alpha 的 netuid(`moved_netuids` BTreeSet)。 - 新增 `moved_stake_netuids` 辅助函数,过滤出待检查的 netuid(全子网时仅保留活跃子网)。 - 交换前检查目标 `(netuid, new_hotkey)` 的冷却:若未过期则拒绝,返回 `HotKeySwapOnSubnetIntervalNotPassed`;对单子网路径给予 weight 处理,全子网路径直接返回错误。 - 交换成功后,为移动过的 netuid 写入冷却期:`block + HotkeySwapOnSubnetInterval`(默认7200块)。 - 单子网路径 `swap_hotkey_on_subnet` 末尾同样写入冷却期记录。
- pallets/subtensor/src/tests/swap_hotkey.rs:新增测试 `delegated_alpha_destination_has_recovery_window_after_deregistration`,覆盖:注册、质押、注销后全子网交换记录冷却、立即再次交换被拒、委托人提款不受限、冷key更换不影响冷却、到期后可继续交换。
- pallets/subtensor/src/tests/remove_data_tests.rs:扩展测试验证子网解散时清除冷却记录、过期清理逻辑。
- sdk/python/bittensor/_generated/storage.py:新增 `StakeMoveCooldownUntil` 存储绑定,供 SDK 查询。
在 Bittensor EVM 中实现 EIP-2537 规定的七个 BLS12-381 预编译合约(地址 0x0b–0x11),支持链上 BLS 签名验证
判级:纯功能新增(EVM 预编译),未触及资金、共识、emission、存储迁移或 spec_version。根据重要性校准规则,无 HIGH 触发条件,但改动较大且影响 EVM 合约开发者,故评 MEDIUM
关键改动
- Cargo.toml:添加 pallet-evm-precompile-bls12381 依赖及注释更新
- precompiles/src/lib.rs:导入七个 BLS12-381 预编译,在 used_addresses() 中添加地址 0x0b–0x11,在 is_precompile() 中识别,在 execute() 中映射到对应执行
- precompiles/src/mock.rs:将 PrecompilesType/PrecompilesValue 从空类型改为真实的 Precompiles<Runtime>
- precompiles/src/bls12381_tests.rs:新增 290 行单元测试,包括 Geth 一致性向量、Solidity 端到端签名验证、四种 EVM 调用模式及异常 gas 测试
- runtime/tests/precompiles.rs:新增集成测试确认生产运行时中所有七个预编译已注册且可调用
- vendor/frontier/frame/evm/precompile/bls12381/src/lib.rs:更新 gas 成本为最终 EIP-2537 值(如 G1Add 600→375、G2Add 4500→600、MapG2 110000→23800),使用独立 G1/G2 MSM 折扣表,添加 MSM 子群检查,优化 k==1 时直接标量乘法
- vendor/frontier/frame/evm/precompile/bls12381/src/tests.rs:更新测试数据路径并适配新的修复测试结构
- docs/guides/evm/precompiles/bls12-381.mdx:新增完整的使用文档,包含编码、gas、签名验证示例
- precompiles/tests/fixtures/Bls12381Example.sol:新增 Solidity 合约示例演示 BLS 验证及四种调用模式测试
- precompiles/tests/fixtures/generate-bls12381.mjs:新增签名生成脚本
- vendor/frontier/frame/evm/precompile/bls12381/testdata/:新增 Geth 一致性测试向量 JSON 文件(成功与失败用例)
统一热键清理逻辑,确保最后一个 Alpha 键删除时连带移除 StakingHotkeys 索引。
判级:属于存储清理和索引一致性的改进,未触及资金/共识/emission 核心逻辑,未新增 DispatchExtension 或直接操作锁定质押的 extrinsic,重要性上限为 medium。
关键改动
- stake_utils.rs: 新增 `staking_hotkey_must_remain` 函数,统一检查 Alpha、AlphaV2 前缀和 BasketClaimed 水印,替代分散的手动迭代。
- migrate_cleanup_staking_hotkeys.rs: 迁移标记从 v2 改为 v3 以重新执行;`relationship_must_remain` 改调用统一谓词;权重估值从 2 reads 增加到 3 reads。
- migrate_storage_bloat_v2.rs: 新增 `alpha_relationship` 函数从编码键中提取热键/冷键对;在删除 Alpha/AlphaV2 键后调用 `maybe_remove_staking_hotkey` 同步清理索引;增加权重预留。
- migrate_alpha_v2.rs: 在结算 Alpha 行前增加 4 reads+1 write 的权重预留,以覆盖 StakingHotkeys 可能的读写;增加测试断言确保清理后索引消失。
- 测试文件: 新增两个集成测试,分别验证 `maybe_remove_staking_hotkey` 在逐步删除时保留/移除索引,以及 `storage_bloat_cleanup` 流式删除后索引是正确的子集。
LOW (2)
在 Finney testnet 上将 claim_root_with_hotkey 的工作上限从 129 提高到 1,025,主网保持不变
判级:仅修改了 testnet 上的常量限制,不涉及资金、共识、emission 或运行时迁移,且 fail-closed 设计保证了主网不受影响
关键改动
- pallets/subtensor/src/lib.rs:新增常量 MAX_ROOT_CLAIM_HOTKEY_WORK_TESTNET = 1_025
- pallets/subtensor/src/staking/claim_root.rs:root_claim_hotkey_declared_work() 函数增加创建哈希检查——仅 Finney testnet 创建哈希返回 1,025,其余链返回原 129
- pallets/subtensor/src/tests/claim_root.rs:新增 test_claim_root_hotkey_work_limit_is_raised_only_on_finney_testnet 测试,覆盖 testnet、默认和未知创建哈希三种路径
- runtime/src/staking_fee.rs:微调测试代码将 claim_cases() 包装在 new_test_ext().execute_with() 中,确保测试上下文正确
优化主网发布流程,移除二次批准并改进Docker镜像发布
判级:仅修改CI/CD发布流程(移除二次批准、优化Docker推送),不涉及任何链上状态、共识、资金或runtime逻辑