web3调用合约方法报地址大小写校验和测试失败错误该如何解决
问题根因
报错的核心原因是send方法的from参数传入了完整的账户对象,而接口要求传入的是账户地址字符串。web3.eth.accounts.privateKeyToAccount返回的是包含地址、私钥、签名方法等属性的完整对象,直接传入该对象会被识别为[object Object],无法通过地址格式校验。
报错原文:Provided address [object Object] is invalid, the capitalization checksum test failed, or it's an indirect IBAN address which can't be converted.
修复方案
1. 核心代码修正
首先调整from字段的取值,从账户对象中提取address属性传入,同时修正歧义变量名:
const web3 = new Web3( new Web3.providers.WebsocketProvider( 'wss://rinkeby.infura.io/ws/v3/<api>' ) ); // 注意:示例私钥包含h、s等非十六进制字符,实际使用请替换为合法的以太坊私钥 const dummyPrivateKey = '0x38544e1555a3553829219281253d2400fa20ebbd922fdh3918a7s2b53b9e1358'; // privateKeyToAccount返回单个账户对象,变量名调整为account避免歧义 const account = web3.eth.accounts.privateKeyToAccount(dummyPrivateKey); await contract.methods.addMessage(_username, _message) // 传入地址字符串而非完整账户对象 .send({ from: account.address });
2. 远程节点额外配置
如果你使用Infura这类不托管账户的远程节点,需要将生成的账户添加到web3本地钱包,才能正常签名交易:
// 将账户添加到web3本地钱包 web3.eth.accounts.wallet.add(account); // 调用send时可补充gas参数避免预估失败 await contract.methods.addMessage(_username, _message) .send({ from: account.address, gas: 200000 });
内容的提问来源于stack exchange,提问作者Andrei Florian
相关产品推荐
相关产品推荐

