Contract-Development

如何從使用 Web3j 的合約呼叫中估算 GAS

  • September 19, 2021

我正在嘗試估算合約呼叫的 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那應該給你你需要的東西。

  1. 您需要使用編碼數據FunctionEncoder.encode
  2. 在檢查結果之前,您需要檢查錯誤。如果返回錯誤(例如合約錯誤),則結果將為 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
}

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