You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:07:50