Contract-Development
如何從使用 Web3j 的合約呼叫中估算 GAS
我正在嘗試估算合約呼叫的 gas 成本,我需要向合約發送一個字元串,但我需要查看我是否超過了 GAS 限制。
我正在嘗試這樣:
Transaction t = Transaction.createContractTransaction(myAddress, BigInteger.valueOf(100), gasPrice, gasLimit, null, "0123456789"); EthEstimateGas eg = web3j.ethEstimateGas(t).send(); System.out.println("EstimateGas: " + eg.getAmountUsed().toByteArray());
但我收到錯誤:
錯誤:org.web3j.exceptions.MessageDecodingException:值必須採用 0x 格式
$$ 1-9 $$+$$ 0-9 $$* 或 0x0
您正在做的是向契約發送消息(需要進行十六進制編碼)。在這種情況下,您希望消息顯示“使用以下參數執行函式”。
看看
FunctionEncoder.encode
那應該給你你需要的東西。
- 您需要使用編碼數據
FunctionEncoder.encode
- 在檢查結果之前,您需要檢查錯誤。如果返回錯誤(例如合約錯誤),則結果將為 null,您將收到您描述的錯誤。
做這樣的事情:
Function function = new Function("nameOfFunction", ...) Transaction tx = Transaction.createFunctionCallTransaction(..., FunctionEncoder.encode(function)); EthEstimateGas gasEstimate = client.ethEstimateGas(tx).send(); if (gasEstimate.hasError()) { logger.info("Contract error: {}", gasEstimate.getError().getMessage()); } else { logger.info("Gas estimate: {}", gasEstimate.getAmountUsed()); // will throw in case of error }