背景
笔者在日常开发中,会碰到一些编程语言调用智能合约到报错,也会在微信群回答一些开发者调用合约问题,遂整理出来,仅供参详;
问题
1.java 调用智能合约 参数为集合
2.SetFail: dot unauthorized: signature verification failed: deprecated support for homestead Signer(oec不再支持homestead Signer签名,需要传入chain id)
3.签名交易返回hash 为空
4.交易已经上链,但是提示错误 execution reverted: failed to execute message; message index: 0
5.关于nonce,强烈建议在代码中手动传入,nonce有问题,会导致交易失败,无法上链等问题
6.构建了web3对象,但是链接公链失败
7.web3 操作批量转账,部分账户收到转账,部分账户没有收到转账;如果nonce没有在下一步交易的时候更新,就会转账失败
解决方法
java采用动态数组的写法传入 Arrays.asList(new DynamicArray(list))
java :txManager = new RawTransactionManager(web3j, credentials, Byte.valueOf("66"));//注意传入 chain-id
python :rawTx = {
'from': fromAddr,
'nonce': nonce,
'gasPrice': gasPrice,
'chainId':66, //这里加入chainId
'gas': 300000,
'value': web3.toWei(0,'ether'),
'data': ''
}
js:Web3.eth.accounts.signTransaction({
to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55',
value: '1000000000',
gas: 2000000,
gasPrice: '234567897654321',
nonce: 100,
chainId: 66 //这里加入chainId
}, 'your-private-key')
.then(console.log);
检查私钥对应的账户是否在链上可以查到;检查请求链的id是否是准确的;生产链为66;测试链为65;用命令行请求已签名的hash,看是否可以返回交易hash;
查看代码里面调用的合约方法名 是不是存在的 是不是准确的;提高gaslimit数值
java 封装nonce示例:BigInteger nonce = web3j.ethGetTransactionCount(credentials.getAddress(), DefaultBlockParameterName.PENDING).send().getTransactionCount();
RawTransaction rawTransaction = RawTransaction.createTransaction(
nonce,
gasPrice,
new BigInteger("100000"),
"0xE7E1fA1f902cD401E81714758bdB136cC7173245",
txData);
byte[]signedMessage = TransactionEncoder.signMessage(rawTransaction,Byte.valueOf("65"),credentials);
String hash =
web3j.ethSendRawTransaction(Numeric.toHexString(signedMessage)).sendAsync().get().getTransactionHash();
网络问题,看看是否开了代理,是否开了vpn;ping rpc地址进行检查
简单解决:让程序休眠,等待nonce自己更新;完美解决:写一个智能合约进行批量转账;