Solidity

在專用網路(POA)上發送 ERC20 令牌的原始交易失敗

  • December 6, 2019

我正在嘗試在私有乙太坊網路(POA)上轉移 ERC20 代幣

交易流程:

  1. 在後端創建原始 tx 對象。
  {
       "gasLimit": 37000,
       "gasPrice": 4000000000,
       "to": <contract address>,
       "value": 0,
       "chainId": 15,
       "data": "0xa9059cbb000000000000000000000000ff70ccdc55a319428fd88809ce848a61087ab2ac0000000000000000000000000000000000000000000000003782dace9d900000"
   }
  1. 在前端簽署 tx。
{ messageHash:
  '0x4bbc38ad53cf154ca1445365c9007dfeca0c0cce251945feb2a8ff3bd6de8795',
 v: '0x42',
 r:
  '0xa664add8c614f05d52104a29b16312744cb8849bc5af5cb78a9ba7daf19e8a12',
 s:
  '0x38c055e9a7c1e5b0321f5d82d832d91da3a2207025756b84c44b8ca31cbbb4f2',
 rawTransaction:
  '0xf8a80884ee6b280082908894324e19e928239d0c7f8b93247d559b54a4e0d03080b844a9059cbb0000000000000000000000008d75f6db12c444e290db995f2650a68159364e2500000000000000000000000000000000000000000000000270801d946c94000042a0a664add8c614f05d52104a29b16312744cb8849bc5af5cb78a9ba7daf19e8a12a038c055e9a7c1e5b0321f5d82d832d91da3a2207025756b84c44b8ca31cbbb4f2' }
  1. 從後端數據送出 tx。
web3.eth.sendSignedTransaction(signedData)
       .on('receipt',function(receipt:any){
           if(receipt.status == false)
               throw new Error('transaction failed');
           sendSuccessResponse(res, {
               txId : receipt.transactionHash
           });
       })
       .catch(function(error:any){
           next(error);
       })

但是當我嘗試在android(使用web3j)上簽署交易並從後端(web3.js)送出時。它有時會失敗(對於隨機接收地址,例如 : 0xFF70ccDC55a319428FD88809cE848a61087Ab2aC)並出現錯誤: 事務已被 EVM 還原

   public String sign(RawTransaction rawTransaction, Credentials credentials) {
       byte[] signedMessage;
       signedMessage = TransactionEncoder.signMessage(rawTransaction, bigIntToByteArray(15), credentials);
       return Numeric.toHexString(signedMessage);
   }

版本:

Web3.js - 1.2.4

Web3j - org.web3j:core:4.2.0-android

Geth - Geth/v1.9.6-stable-bd059680/linux-amd64/go1.11.5

網路共識:POA

節點數:2

交易因固定而失敗gasLimit : 37000

氣體取決於函式在做什麼。

例如,將零值儲存值設置為非零比將非零儲存值設置為另一個非零儲存值更昂貴。

在我的情況下,這是因為SSTORE操作碼,20000當儲存值從零設置為非零並且5000儲存值保持不變或設置為零時。

所以改為37000並按52000預期工作。

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