Substrate自定义carpooling pallet方法通过Polkadot JS调用报错如何解决
报错原因
- 调度函数命名不匹配:Polkadot JS API会自动将Substrate Runtime中定义的snake_case格式调度函数转换为驼峰式命名,如果你调用时的函数名和实际定义的名称不匹配,就会触发该报错。
- Pallet未正确注册到Runtime:你虽然编写了carpooling Pallet,但没有在Runtime的
construct_runtime!宏中完成注册,或者注册时未正确暴露调度函数,导致链上元数据没有包含对应方法。 - 自定义类型定义错误:你代码中定义的元组类型
('u32', 'u32')不符合Polkadot JS的类型写法规则,会导致元数据解析失败,进而无法识别Pallet下的方法。 - 元数据未完全加载:部分场景下本地节点同步异常或元数据拉取延迟,会导致API初始化完成后还没有加载到完整的链上方法列表。
解决方案
步骤1:校验Runtime配置
首先检查Runtime的construct_runtime!宏中是否已经注册carpooling Pallet:
construct_runtime!( pub enum Runtime where Block = Block, NodeBlock = opaque::Block, UncheckedExtrinsic = UncheckedExtrinsic { // 其他系统Pallet Carpooling: pallet_carpooling, } );
再确认Pallet的#[pallet::call]块中定义的调度函数名称确实为book_ride,参数数量和类型和你传入的两个u32参数匹配。
步骤2:修正自定义类型定义
将代码中location字段的圆括号改为方括号,符合元组类型的定义规则:
types: { DriverOf: { id: 'u32', car_no: 'Hash', location: ['u32', 'u32'], price: 'u32', }, CustomerOf: { id: 'u32', name: 'Hash', location: ['u32', 'u32'], }, }
步骤3:确认可调用方法列表
在调用方法前打印carpooling Pallet下的所有可用方法,确认函数存在且命名正确:
console.log("可用调度方法:", Object.keys(api.tx.carpooling));
如果打印结果中存在驼峰格式的bookRide,就将调用代码改为api.tx.carpooling.bookRide(12,45)即可。
步骤4:补全交易签名逻辑
你当前的代码没有对交易进行签名就直接发送,是无法正常执行的,参考如下代码补全签名逻辑:
// 顶部导入依赖 const { Keyring } = require('@polkadot/keyring'); // main函数内部替换原有调用逻辑 const keyring = new Keyring({ type: 'sr25519' }); // 用开发节点默认的Alice账户签名,可替换为你自己的账户 const signer = keyring.addFromUri('//Alice'); await api.tx.carpooling.bookRide(12,45) .signAndSend(signer, (res) => { if (res.status.isInBlock) { console.log(`交易已打包,区块哈希:${res.status.asInBlock}`); } else if (res.status.isFinalized) { console.log(`交易已最终确认,区块哈希:${res.status.asFinalized}`); process.exit(0); } });
内容的提问来源于stack exchange,提问作者Aman Verma
相关产品推荐
相关产品推荐

