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

web3前端调用智能合约传递数组参数报错问题

Web3前端向智能合约传递数组参数调用失败问题解决方案

问题成因

核心原因是参数传递时错误地给数组多嵌套了一层方括号,导致传入参数类型和合约定义的参数类型不匹配:

  • 你预先声明的names本身就是存储整数元素的一维数组,结构和测试时手动传入的静态字面量[0,1,5]完全一致,符合合约方法vote第一个参数uint[] memory candID的类型要求。
  • 错误调用代码中写的[names],会把整个names数组作为单个元素,包装生成一个新的外层数组,最终实际传入的是结构为[[元素1,元素2,...]]的二维数组,和合约要求的一维uint数组类型完全不符,参数ABI编码阶段就会触发错误,导致调用失败。
  • 手动传入静态数组字面量[0,1,5]时,参数本身就是符合要求的一维数组结构,类型匹配因此可以调用成功。

修复方案

移除包裹在names外层的多余方括号,直接将names变量作为第一个参数传入即可,修正后的调用代码如下:

await contract.methods.vote(
  names,
  BigInt(election),
  BigInt(electClickedID)
).send({ from: accounts[0], gas: 3000000 });

额外校验提示

调用前可以先打印names确认内容结构,确保数组内所有元素均为可被编码为uint类型的数值(普通整数、BigInt均可),不要混入字符串、空值、undefined等异常类型,避免出现额外的参数编码错误。


内容的提问来源于stack exchange,提问作者John Carlo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 05:06:48