Solidity
在專用網路(POA)上發送 ERC20 令牌的原始交易失敗
我正在嘗試在私有乙太坊網路(POA)上轉移 ERC20 代幣
交易流程:
- 在後端創建原始 tx 對象。
{ "gasLimit": 37000, "gasPrice": 4000000000, "to": <contract address>, "value": 0, "chainId": 15, "data": "0xa9059cbb000000000000000000000000ff70ccdc55a319428fd88809ce848a61087ab2ac0000000000000000000000000000000000000000000000003782dace9d900000" }
- 在前端簽署 tx。
{ messageHash: '0x4bbc38ad53cf154ca1445365c9007dfeca0c0cce251945feb2a8ff3bd6de8795', v: '0x42', r: '0xa664add8c614f05d52104a29b16312744cb8849bc5af5cb78a9ba7daf19e8a12', s: '0x38c055e9a7c1e5b0321f5d82d832d91da3a2207025756b84c44b8ca31cbbb4f2', rawTransaction: '0xf8a80884ee6b280082908894324e19e928239d0c7f8b93247d559b54a4e0d03080b844a9059cbb0000000000000000000000008d75f6db12c444e290db995f2650a68159364e2500000000000000000000000000000000000000000000000270801d946c94000042a0a664add8c614f05d52104a29b16312744cb8849bc5af5cb78a9ba7daf19e8a12a038c055e9a7c1e5b0321f5d82d832d91da3a2207025756b84c44b8ca31cbbb4f2' }
- 從後端數據送出 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
預期工作。