Release v469
Runtime 469 (proposed)
Published
2026-09-22 09:35:55
Generated
2026-09-22 10:04:29
总 PR
2
HIGH
1
MEDIUM
0
Stage2
0
官方 Release Notes 总结
- 本版为 **spec 469** 运行时升级提案,等待 2-of-2 多签(triumvirate)最终批准后部署于 finney 网络。
- **无安全修复**、**无资金/共识/账户相关变更**,此次升级纯为代码部署流程,未在说明中提及任何 advisory 或严重性问题。
- 提供独立的 `btcli upgrade sign` 与 `btcli upgrade check` 验证流程,推荐用 srtool 本地构建匹配 wasm 字节,确保部署代码与链上一致。
- **breaking change** 未在文档中列出,spec_version 由上一版本升至 **469**,具体变更需参考代码 diff(commit `370bac...`)。
TL;DR(PR 分析)
本版核心是失败调用手续费退款机制,按实际工作量计费并调整共享池算术,变更所有重型extrinsic的dispatch返回签名,属资金与共识安全的高影响变更;同时新增本地预检脚本优化开发流程。
HIGH 重要更新 (1)
spec 469:修复 v468 两个缺陷 + 失败调用手续费退款机制——使每条重型调用在失败时按实际工作量计费,含 Alpha 付款人的退款和 Basket 调用手续费补贴
判级:触及交易手续费退款、共享池算术(潜在资金差异 1 rao)、所有 heavy extrinsic 的 dispatch 返回签名变更、spec_version 升级——high 影响
关键改动
- primitives/share-pool/src/lib.rs:新增 `withdrawal_drains_member` 方法,完全退出时清除因截断产生的 1 rao 残余份额;修正 `current_share` 克隆以避免借用冲突;新增池截断边界测试
- pallets/subtensor/src/staking/move_stake.rs:`AlphaBalance::MAX`(全量取出哨兵)扩展到 `transfer_stake`、`transfer_stake_and_hotkey`、`swap_stake`、`swap_stake_limit`,使客户端回放 `StakeAdded` 事件中的 alpha 值不再因 1 rao 截断失败
- pallets/subtensor/src/staking/stake_utils.rs:新增 `with_actual_weight` 辅助函数,失败时也返回实际重量而非声明包络;补充 `fail_with_weight` 文档
- pallets/subtensor/src/macros/dispatches.rs:将所有 stake 退出类 extrinsic(remove_stake、move_stake、transfer_stake、swap_stake、unstake_all 等)改为返回 `DispatchResultWithPostInfo`,失败时携带实际工作量;`swap_coldkey`、`swap_coldkey_announced` 同理
- pallets/subtensor/src/staking/remove_stake.rs:拆分 `do_unstake_all` 为跟踪版(`_tracked`/`_into`),失败时返回已完成的扫描工作量
- pallets/subtensor/src/staking/basket_trade.rs:拆分 `do_swap_basket` 为跟踪版,含预检重量函数 `swap_basket_precheck_weight`;失败时按实际 fund row 数计费
- pallets/subtensor/src/staking/claim_root.rs:拆分 `do_stake_into_basket` 为跟踪版,含预检重量 `stake_into_basket_precheck_weight`;失败时按已执行工作计费
- pallets/subtensor/src/subnets/registration.rs:新增 `do_register_with_post_info`,预检失败按 `registration_precheck_weight` 计费,prune 搜索后失败保持声明重量;`do_register_limit` 同理
- pallets/subtensor/src/swap/swap_coldkey.rs:新增 `do_swap_coldkey_tracked`,按拒绝阶段(预检/扫描/执行)分级返回实际重量
- pallets/subtensor/src/swap/swap_hotkey.rs:拆分预检与执行(`check_swap_hotkey`+`execute_swap_hotkey`),单子网拒绝按 `swap_hotkey_precheck_weight` 计费,全子网拒绝保持声明
- pallets/subtensor/src/subnets/leasing.rs:`terminate_lease` 预检失败按三次读取计费
- pallets/transaction-fee/src/lib.rs:新增 `AlphaFeeHandler` 的 `refund_alpha_payer` 方法,通过 `mint_tao`+`spend_tao` 向 Alpha 付款人退还未使用 TAO;`withdraw_in_alpha` 和 `can_withdraw_in_alpha` 检查代币禁用和 Root 锁定;实际退款在 `on_withdraw_fees` 中执行
- runtime/src/staking_fee.rs:新增第 3 条手续费补贴——basket 调用(`stake_into_basket`/`swap_basket`)按 `BASKET_FEE_ALLOWANCE`(4 行)计价;`basket_discount` 在 `leaf_fee_weight` 中应用
- runtime/src/lib.rs:`spec_version` 从 468 升至 469
- pallets/subtensor/src/macros/events.rs:`TransactionFeePaidWithAlpha` 事件字段文档更新,说明 `tao_amount` 已是退款净值
- pallets/transaction-fee/src/tests/mod.rs:新增 `test_failed_alpha_fee_is_refunded_to_actual_weight` 验证 Alpha 退款;`test_alpha_fee_sale_obeys_root_hold_and_subtoken` 验证代币禁用和 Root 锁定门控
- pallets/subtensor/src/tests/failed_call_refunds.rs:新增 600 行测试覆盖所有失败路径的实际重量报告
- pallets/subtensor/src/tests/move_stake.rs:新增 `inexact_pool_position` 夹具和 MAX 哨兵测试
- scripts/preflight.sh:修复 worktree 构建环境,清理 wbuild 锁文件避免包冲突
LOW (1)
添加本地预检脚本和 git pre-push hook,在推送前运行 fmt/clippy 等检查,避免 CI 资源浪费。
判级:新增本地 preflight 脚本和 pre-push hook,仅影响开发流程,不涉及运行时或链上状态