You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Frame v1存储宏迁移至Frame v2后创世最小余额设置异常问题咨询

Substrate Frame v1到v2创世初始化逻辑迁移问题修复方案

核心问题排查

你转换后的代码存在以下几个典型问题导致创世逻辑未生效:

  • Frame v2环境下,decl_storage!宏生成的Module结构体已被弃用,pallet宏默认生成的结构体名为Pallet,原有代码中<Module<T>>::account_id()无法获取到正确的Pallet专属账户ID
  • 若Pallet未定义任何自定义存储项,未添加#[pallet::without_storage_info]属性会导致宏编译阶段跳过部分逻辑,创世构建代码不会被正确注入
  • 若未在Runtime的创世配置中引入当前Pallet的GenesisConfig实例,创世阶段根本不会执行对应Pallet的build逻辑

修正后的代码示例

1. 首先确保Config trait包含必要的关联类型

#[pallet::config]
pub trait Config: frame_system::Config {
    /// 用于生成Pallet专属账户的固定ID
    #[pallet::constant]
    type PalletId: Get<frame_support::PalletId>;
    /// 货币操作接口
    type Currency: Currency<Self::AccountId>;
}

2. Pallet模块添加无存储信息标记

#[frame_support::pallet]
pub mod pallet {
    use super::*;
    use frame_support::pallet_prelude::*;
    use frame_system::pallet_prelude::*;

    // 无自定义存储项必须添加该属性
    #[pallet::without_storage_info]
    #[pallet::pallet]
    #[pallet::generate_store(pub(super) trait Store)]
    pub struct Pallet<T>(_);

    // 后续Config、创世配置等逻辑放在该模块内
}

3. 修正后的创世配置代码

#[pallet::genesis_config]
#[derive(Default)]
pub struct GenesisConfig {}

#[pallet::genesis_build]
impl<T: Config> GenesisBuild<T> for GenesisConfig {
    fn build(&self) {
        // 将Module替换为Pallet获取正确的账户ID
        let _ = T::Currency::make_free_balance_be(
            &Pallet::<T>::account_id(),
            T::Currency::minimum_balance(),
        );
    }
}

4. Runtime侧配置检查

确保在Runtime的construct_runtime!宏中正确注册Pallet,同时在链规范的创世配置中添加该Pallet的配置项,即使是空的默认配置:

// chain_spec.rs 创世配置构造部分
GenesisConfig {
    // 其他系统Pallet的配置
    your_charity_pallet_name: Default::default(),
    // 其余自定义Pallet配置
}

内容的提问来源于stack exchange,提问作者P.E

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 05:18:02