Substrate pallet开发decl_module宏本地解析歧义错误求助
错误原因说明
这个编译错误的核心原因是混用了两代不兼容的Substrate pallet编写语法:
- 你当前用的
decl_module!是Substrate pallet v1版本的声明宏语法,这套语法下为可调用方法指定权重的写法是#[weight = 权重值],不识别带pallet前缀的属性。 - 你写的
#[pallet::weight(T::WeightInfo::deposit())]是Substrate pallet v2/v3版本属性宏体系下的语法,只能在#[pallet::call]修饰的impl块里使用,不能放在decl_module!的内部作用域。
编译器在解析decl_module!内部的代码时,无法匹配新的#[pallet::weight]语法规则,所以针对上方的文档注释抛出了语法歧义的报错。
修复方案
你可以二选一:
方案1:继续使用旧版decl_module!语法
直接把权重声明的代码改成旧版写法即可:
/// Deposit funds #[weight = T::WeightInfo::deposit()] pub fn deposit(origin: OriginFor<T>, amount: BalanceOf<T>) -> DispatchResult { // 原有逻辑不变 }
方案2:升级为新版pallet属性宏语法
弃用decl_module!、decl_storage、decl_event这套旧声明宏,改用官方现在推荐的#[pallet]属性宏体系编写pallet,示例结构参考:
#[pallet::pallet] #[pallet::generate_store(pub(super) trait Store)] pub struct Pallet<T>(_); #[pallet::call] impl<T: Config> Pallet<T> { /// Deposit funds #[pallet::weight(T::WeightInfo::deposit())] pub fn deposit(origin: OriginFor<T>, amount: BalanceOf<T>) -> DispatchResult { // 原有逻辑不变 } }
内容的提问来源于stack exchange,提问作者jvn
相关产品推荐
相关产品推荐

