当前位置:   article > 正文

合约错误:org.web3j.protocol.exceptions.TransactionException:Error processing request:unknown transaction...

org.web3j.protocol.core.filters.filterexception: error sending request

在执行一个 ERC20 智能合约的transfer调用时发生的org.web3j的一个交易错误:
org.web3j.protocol.exceptions.TransactionException: Error processing request: unknown transaction

  1. Credentials credentials = null;
  2. try {
  3. this.initWeb3Client();
  4. credentials = WalletUtils.loadCredentials(pwd, path);
  5. MyToken mt = MyToken.load(ADDRESS,web3j,
  6. credentials, BigInteger.valueOf(20_000_000_000L),BigInteger.valueOf(4_300_000L));
  7. TransactionReceipt tr = oso.transfer(address,value).send();
  8. System.out.println("hash:"+tr.getTransactionHash());
  9. } catch (IOException e) {
  10. e.printStackTrace();
  11. } catch (CipherException e) {
  12. e.printStackTrace();
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

交易被成功的提交到了Rinkeby测试链上,但是抛出了这个错误信息:

  1. org.web3j.protocol.exceptions.TransactionException: Error processing request: unknown transaction
  2. at org.web3j.tx.response.TransactionReceiptProcessor.sendTransactionReceiptRequest(TransactionReceiptProcessor.java:32)
  3. at org.web3j.tx.response.PollingTransactionReceiptProcessor.getTransactionReceipt(PollingTransactionReceiptProcessor.java:37)
  4. at org.web3j.tx.response.PollingTransactionReceiptProcessor.waitForTransactionReceipt(PollingTransactionReceiptProcessor.java:29)
  5. at org.web3j.tx.TransactionManager.processResponse(TransactionManager.java:72)
  6. at org.web3j.tx.TransactionManager.executeTransaction(TransactionManager.java:51)
  7. at org.web3j.tx.ManagedTransaction.send(ManagedTransaction.java:70)
  8. at org.web3j.tx.Contract.executeTransaction(Contract.java:223)
  9. at org.web3j.tx.Contract.executeTransaction(Contract.java:207)
  10. at org.web3j.tx.Contract.executeTransaction(Contract.java:201)
  11. at org.web3j.tx.Contract.lambda$executeRemoteCallTransaction$3(Contract.java:240)
  12. at org.web3j.protocol.core.RemoteCall.send(RemoteCall.java:30)
  13. at com.novel.balbit.ports.contract.MyTokenTest.transfer(MyTokenTest.java:358)
  14. at com.novel.balbit.ports.contract.MyTokenTest.main(MyTokenTest.java:396)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

问题可能解决方法

这个问题应该发生在TransactionReceiptProcessor内部。

当调用web3j.ethGetTransactionReceipt(transactionHash).send()时内部会执行waitForTransactionReceipt

你的节点可能还没有彻底准备好,无法给你提供一个有效的TransactionReceipt

你可以通过手动构建交易来解决这个问题:

  1. Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/
  2. Credentials credentials = WalletUtils.loadCredentials("password", "/path/to/walletfile");
  3. // get the next available nonce
  4. EthGetTransactionCount ethGetTransactionCount = web3j.ethGetTransactionCount(
  5. address, DefaultBlockParameterName.LATEST).sendAsync().get();
  6. BigInteger nonce = ethGetTransactionCount.getTransactionCount();
  7. // create our transaction
  8. RawTransaction rawTransaction = RawTransaction.createEtherTransaction(
  9. nonce, <gas price>, <gas limit>, <toAddress>, <value>);
  10. // sign & send our transaction
  11. byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
  12. String hexValue = Hex.toHexString(signedMessage);
  13. // FROM here you can get the tx hash.
  14. EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).send();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

虽然可以使用自定义的交易管理器,但尽量尝试更改轮询的次数来增加获得txhash的概率。

  1. public static final int DEFAULT_POLLING_ATTEMPTS_PER_TX_HASH = 40;
  2. public static final long DEFAULT_POLLING_FREQUENCY = 1000 * 15;
  • 1
  • 2

例如:

new Transfer(client, new ClientTransactionManager(client ,fromAddress, 100))
  • 1
  • 2

另外一个明确的方法

  1. val txManager = new RawTransactionManager(client,credentials,100,1000 * 15)
  2. val transfer = new Transfer(client,txManager)
  3. transfer.sendFunds(
  4. walletAddress,
  5. amount,
  6. currency.convert)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

原文《以太坊常见问题和错误》中的:
http://cw.hubwiz.com/card/c/ethereum-FAQ/1/1/5/

另外推荐一些之前的教程:

  • python以太坊,主要是针对python围绕web3.py进行区块链以太坊应用开发的讲解。
  • web3j,主要是针对java和android程序员围绕web3j库进行区块链以太坊开发的讲解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。
  • 以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • 以太坊教程,主要介绍智能合约与dapp应用开发,适合入门。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/574642
推荐阅读
相关标签
  

闽ICP备14008679号