使用Polkadot.js库执行转账操作时遭遇Struct解码错误
解决Polkadot.js转账操作中的Struct解码错误
我帮你排查了下代码里的问题,你遇到的createType(Call)解码错误,根源在于转账方法的参数传错了类型。
看你代码里的这段调用:
const txHash = await api.tx.balances.transfer(BOB, 12345).signAndSend(alice)
api.tx.balances.transfer的第一个参数需要的是接收方的地址字符串,但你直接传了BOB这个KeyringPair对象,Polkadot.js在解码这个对象的时候就会抛出value.substr is not a function的错误——因为它预期是字符串,却拿到了一个复杂对象。
修改后的正确代码
我把代码重新格式化并修正了参数问题,你可以直接运行:
const { ApiPromise, WsProvider, Keyring } = require("@polkadot/api"); (async () => { const wsprovider = new WsProvider("ws://127.0.0.1:9944"); const api = await ApiPromise.create({ provider: wsprovider, types: { DepartmentDetails: { name: "Text", location: "Text", details: "Text", departmentid: "u128", }, }, }); const keyring = new Keyring({ type: "sr25519" }); const alice = keyring.addFromUri("//Alice"); const BOB = keyring.addFromUri("//Bob"); try { // 核心修改:把BOB对象改成BOB.address,传入正确的地址字符串 const txHash = await api.tx.balances.transfer(BOB.address, 12345).signAndSend(alice); console.log(`Submitted with hash ${txHash}`); } catch (err) { console.error("转账出错:", err); } finally { // 把进程退出放在finally块,确保无论成功失败都能正常结束 process.exit(); } })();
额外的注意事项
- 所有涉及账户地址的Polkadot.js调用,几乎都要求传入地址字符串,而非KeyringPair对象,你可以通过对象的
.address属性获取正确的地址 - 如果不确定地址格式是否正确,可以先打印
console.log(BOB.address)验证 - 建议把
process.exit()放在finally块中,避免因错误导致进程无法正常终止
内容的提问来源于stack exchange,提问作者Amiya Behera
相关产品推荐
相关产品推荐

