如何解决调用Solidity函数时的「Uncaught Error: Invalid number of arguments」错误
解决Solidity函数调用时Uint8Array参数导致的「参数数量错误」问题
这问题我之前踩过坑,核心原因就是你用的旧版web3.js对Uint8Array类型的处理逻辑和普通数组不一样——它会把Uint8Array的每一个元素当成单独的参数传给Solidity函数,这就直接和你合约里函数定义的参数数量不匹配,自然触发了Uncaught Error: Invalid number of arguments to Solidity function错误。
快速解决方法:把Uint8Array转换成普通JavaScript数组
你只需要在传入参数前,把shoco.compress返回的Uint8Array转成普通数组就行,有两种简单的方式:
方式1:使用Array.from()转换
修改你的调用代码如下:
EthProj.setMessage.sendTransaction( Array.from(shoco.compress(document.getElementById("MessageBox").value)), {from: document.getElementById("add").value} )
方式2:使用扩展运算符[...]转换
这种写法更简洁:
EthProj.setMessage.sendTransaction( [...shoco.compress(document.getElementById("MessageBox").value)], {from: document.getElementById("add").value} )
为什么这样能解决问题?
你的Solidity函数应该是定义了类似bytes或者uint8[]的单个参数,普通JavaScript数组会被web3.js正确识别为一个完整的参数传递给合约;而Uint8Array作为TypedArray,旧版web3.js没有做特殊处理,会把它拆解成多个独立的数值参数,导致参数数量和函数定义不符,进而报错。
内容的提问来源于stack exchange,提问作者Cal W
相关产品推荐
相关产品推荐

