合约错误:org.web3j.protocol.exceptions.TransactionException:Error processi...
在执行一个 ERC20 智能合约的transfer调用时发生的org.web3j的一个交易错误: org.web3j.protocol.exceptions.TransactionException: Error processing request: unknown transaction
。
Credentials credentials = null; try { this.initWeb3Client(); credentials = WalletUtils.loadCredentials(pwd, path); MyToken mt = MyToken.load(ADDRESS,web3j, credentials, BigInteger.valueOf(20_000_000_000L),BigInteger.valueOf(4_300_000L)); TransactionReceipt tr = oso.transfer(address,value).send(); System.out.println("hash:"+tr.getTransactionHash()); } catch (IOException e) { e.printStackTrace(); } catch (CipherException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }
交易被成功的提交到了Rinkeby测试链上,但是抛出了这个错误信息:
org.web3j.protocol.exceptions.TransactionException: Error processing request: unknown transaction at org.web3j.tx.response.TransactionReceiptProcessor.sendTransactionReceiptRequest(TransactionReceiptProcessor.java:32) at org.web3j.tx.response.PollingTransactionReceiptProcessor.getTransactionReceipt(PollingTransactionReceiptProcessor.java:37) at org.web3j.tx.response.PollingTransactionReceiptProcessor.waitForTransactionReceipt(PollingTransactionReceiptProcessor.java:29) at org.web3j.tx.TransactionManager.processResponse(TransactionManager.java:72) at org.web3j.tx.TransactionManager.executeTransaction(TransactionManager.java:51) at org.web3j.tx.ManagedTransaction.send(ManagedTransaction.java:70) at org.web3j.tx.Contract.executeTransaction(Contract.java:223) at org.web3j.tx.Contract.executeTransaction(Contract.java:207) at org.web3j.tx.Contract.executeTransaction(Contract.java:201) at org.web3j.tx.Contract.lambda$executeRemoteCallTransaction$3(Contract.java:240) at org.web3j.protocol.core.RemoteCall.send(RemoteCall.java:30) at com.novel.balbit.ports.contract.MyTokenTest.transfer(MyTokenTest.java:358) at com.novel.balbit.ports.contract.MyTokenTest.main(MyTokenTest.java:396)
问题可能解决方法
这个问题应该发生在TransactionReceiptProcessor
内部。
当调用web3j.ethGetTransactionReceipt(transactionHash).send()
时内部会执行waitForTransactionReceipt
。
你的节点可能还没有彻底准备好,无法给你提供一个有效的TransactionReceipt
。
你可以通过手动构建交易来解决这个问题:
Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/ Credentials credentials = WalletUtils.loadCredentials("password", "/path/to/walletfile"); // get the next available nonce EthGetTransactionCount ethGetTransactionCount = web3j.ethGetTransactionCount( address, DefaultBlockParameterName.LATEST).sendAsync().get(); BigInteger nonce = ethGetTransactionCount.getTransactionCount(); // create our transaction RawTransaction rawTransaction = RawTransaction.createEtherTransaction( nonce, <gas price>, <gas limit>, <toAddress>, <value>); // sign & send our transaction byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials); String hexValue = Hex.toHexString(signedMessage); // FROM here you can get the tx hash. EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).send();
虽然可以使用自定义的交易管理器,但尽量尝试更改轮询的次数来增加获得txhash
的概率。
public static final int DEFAULT_POLLING_ATTEMPTS_PER_TX_HASH = 40; public static final long DEFAULT_POLLING_FREQUENCY = 1000 * 15;
例如:
new Transfer(client, new ClientTransactionManager(client ,fromAddress, 100))
另外一个明确的方法:
val txManager = new RawTransactionManager(client,credentials,100,1000 * 15) val transfer = new Transfer(client,txManager) transfer.sendFunds( walletAddress, amount, currency.convert)
原文《以太坊常见问题和错误》中的:
http://cw.hubwiz.com/card/c/ethereum-FAQ/1/1/5/
另外推荐一些之前的教程:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Web3j error:error Intrinsic gas too low
我是一个以太坊区块链ethereum blockchain开发新手,我一直尝试执行智能合约使用MetaMask和Remix在Chrome浏览器上。 我现在正在尝试使用web3j开发并通过Java部署相同的以太坊智能合约。 但是当我尝试执行我的智能合约时,得到以下错误:error Intrinsic gas too low Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.RuntimeException: Error processing transaction request: Intrinsic gas too low at java.util.concurrent.CompletableFuture.reportGet(Unknown Source) at java.util.concurrent.CompletableFuture.get(Unknown Source) at com.solartis.bc.Sample.main(Sample.java:44) Cause...
- 下一篇
web3j获得的sha3值和solidity为什么会不同?
我正在尝试使用web3j来监控我的智能合约事件。我发现主题的第一个参数是事件名称的哈希值。因此,我想用web3j将事件名称哈希然后就可以映射得到我想要的事件。但是,我发现它的价值是不同的。不知道是什么情况。 代码如下: // my smart contract event EVWithdraw(address user ,uint256 amount ,bytes32 ticketID); 我在智能合约中调用EVWithdraw(address,uint256,bytes32): function getsha3(string func) public constant returns(bytes32) { return sha3("EVWithdraw(address,uint256,bytes32)"); } // returns 0x953d0c27f84a9649b0e121099ffa9aeb7ed83e65eaed41d3627f895790c72d41 我的java代码: String hashed = Hash.sha3("EVWithdraw(address,uint...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2全家桶,快速入门学习开发网站教程
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2整合Thymeleaf,官方推荐html解决方案