Substrate pallet-assets调用create外禀报Call解码错误如何解决
问题根因
该解码错误由以下三个常见原因导致:
- 常量定义冲突与类型不匹配:你在
parameter_types!中重复定义了AssetDepositPerZombie,且部分常量类型未与Balance类型对齐,会导致Runtime元数据生成异常,外禀参数结构识别错误。 - 缺失
AssetId类型注册:你的Runtime配置中将AssetId设为u32,但polkadot.js默认对pallet-assets的AssetId类型推断为u64,序列化时按8字节长度编码,Runtime侧按4字节解码,会直接导致参数长度不匹配,对应报错中的Not enough data to fill buffer。 - Config关联类型缺失:pallet-assets 3.0.0版本要求必须配置
AssetAccountDeposit、RemoveItemsLimit两个关联类型,你现有配置中遗漏,会导致外禀参数结构和前端识别的结构不一致。
解决方案
按以下步骤操作即可解决:
- 清理并补全常量定义,修正类型不匹配问题:
parameter_types! { // 修正类型为Balance,删除重复定义的AssetDepositPerZombie pub const AssetDepositBase: Balance = 1; pub const AssetDepositPerZombie: Balance = 2 * 7; pub const StringLimit: u32 = 50; pub const MetadataDepositBase: Balance = 1; pub const MetadataDepositPerByte: Balance = 1; pub const AssetDeposit: Balance = 2 * 7 ; pub const ApprovalDeposit: Balance = 2 * 7 ; // 新增缺失的常量配置 pub const AssetAccountDeposit: Balance = 2 * 7; pub const RemoveItemsLimit: u32 = 1000; }
- 补全pallet-assets的Config关联类型:
impl pallet_assets::pallet::Config for Runtime { type Event= Event; type Balance= Balance; type AssetId= u32; type Currency = Balances; type ForceOrigin = frame_system::EnsureRoot<AccountId>; type StringLimit = StringLimit; type AssetDepositBase=AssetDepositBase; type AssetDepositPerZombie= AssetDepositPerZombie; type MetadataDepositBase = MetadataDepositBase; type MetadataDepositPerByte = MetadataDepositPerByte; type WeightInfo = pallet_assets::weights::SubstrateWeight<Runtime>; // 新增缺失的关联类型 type AssetAccountDeposit = AssetAccountDeposit; type RemoveItemsLimit = RemoveItemsLimit; }
- 更新polkadot.js的自定义类型配置,新增
AssetId声明:
{ "Address": "MultiAddress", "LookupSource": "MultiAddress", "AssetId": "u32" }
- 重新编译节点,执行
./target/release/node-template purge-chain --dev清空本地链数据后重启节点,重新连接polkadot.js再调用assets.create外禀即可。
内容的提问来源于stack exchange,提问作者Harshit Srivastav
相关产品推荐
相关产品推荐

