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
相关产品推荐
相关产品推荐

