Web3j

無法使用 Java api ethSendRawTransaction 與數據進行交易

  • April 7, 2019

我正在嘗試使用 Java 在兩個不同的帳戶之間進行交易。只要我不使用“數據”參數,它就可以正常工作。

我的意圖不是呼叫智能合約,而是在兩方之間進行價值交換,我將在每筆交易中儲存小的 ascii(十六進制轉換)數據作為註釋。

如果我不使用“數據”參數 api,例如

RawTransaction.createEtherTransaction

然後它工作正常並成功返回我交易雜湊。

但我會使用 API

RawTransaction.createTransaction

然後我面臨一個 JSON 錯誤,比如

java.util.concurrent.ExecutionException: com.fasterxml.jackson.databind.JsonMappingException: 無法從 START_OBJECT 令牌中反序列化 java.lang.String 的實例

$$ Source: buffer(okhttp3.internal.http1.Http1Codec$ChunkedSource@7905a0b8).inputStream(); line: 1, column: 81 $$(通過參考鏈:org.web3j.protocol.core.methods.response.EthSendTransaction$$ “error” $$->org.web3j.protocol.core.Response$Error$$ “data” $$)

無論是我以錯誤的方式呼叫還是 API 有任何問題,我希望有人幫助了解如何在沒有上述問題的情況下進行價值交換交易。

這是我的程式碼

//create raw transaction

           //import the address from Ganache's account by using its private key
           String strPrivateKey = "0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3";
           Credentials senderCredentials = Credentials.create(ECKeyPair.create(hexStringToByteArray(strPrivateKey)));
           System.out.println(senderCredentials.getAddress());


           BigInteger amountWei = Convert.toWei("1.789", Convert.Unit.ETHER).toBigInteger();

//Data I am trying to send with transaction to be recorded in DATA part of ethereum transaction
           String Data = Numeric.toHexString("Hey this is me".getBytes());


           EthGetTransactionCount ethGetTransactionCount = web3a.ethGetTransactionCount(
                   senderCredentials.getAddress(), DefaultBlockParameterName.LATEST).sendAsync().get();

           BigInteger nonce = ethGetTransactionCount.getTransactionCount();

           //When I create transaction using below API then it crash at the time of send ethSendRawTransaction
           RawTransaction rawTransaction = RawTransaction.createTransaction(
                   nonce,Transfer.GAS_PRICE,Transfer.GAS_LIMIT, RecieverAddress,amountWei,Data);

           // When I create transaction using this API then it sucessfully work at the time of send call ethSendRawTransaction
          /* RawTransaction rawTransaction = RawTransaction.createEtherTransaction(
                  nonce, Transfer.GAS_PRICE, Transfer.GAS_LIMIT, RecieverAddress, amountWei);*/

           byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, senderCredentials);
           String hexValue = Numeric.toHexString(signedMessage);

//this is the place where I get error 
               EthSendTransaction ethSendTransaction =  web3a.ethSendRawTransaction(hexValue).sendAsync().get();


           String transactionHash = ethSendTransaction.getTransactionHash();

           System.out.println(transactionHash);

這是使用預設 GAS 限制的問題。一旦我嘗試了 Logback,我就得到了這個資訊。因此,我通過將預設 Transfer.Gast_LIMIT 替換為 210000L 來更改氣體限制。

RawTransaction rawTransaction = RawTransaction.createTransaction(
                   nonce, Transfer.GAS_PRICE, BigInteger.valueOf(210000L), RecieverAddress, amountWei, Data);

之後,我的數據工作並成功儲存。

注意:-確保打開日誌記錄機制以了解正確的錯誤,否則像我一樣你會得到

java.util.concurrent.ExecutionException: com.fasterxml.jackson.databind.JsonMappingException: 無法反序列化 java.lang.String 的實例

這並沒有詳細說明 JSON 通信失敗的原因。

來自 web3j 文件:/

RawTransaction.createTransaction(
       <nonce>, GAS_PRICE, GAS_LIMIT, "0x<address>", <amount>, "0x<hex encoded text>");

byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, ALICE);
String hexValue = Numeric.toHexString(signedMessage);

EthSendTransaction ethSendTransaction =
       web3j.ethSendRawTransaction(hexValue).send();
String transactionHash = ethSendTransaction.getTransactionHash();

引用自:https://ethereum.stackexchange.com/questions/68711