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
相关产品推荐
相关产品推荐

