Web3js

在需要少量氣體的交易中獲得“基本費用超過氣體限制”

  • August 16, 2018

我有以下契約:

pragma solidity ^0.4.24;

contract MyContract {
   address public owner;
   bool public unlocked;

   constructor() public {
       owner = msg.sender;
       unlocked = true;
   }

   function lock() external {
       require(owner == msg.sender);
       unlocked = false;
   }
}

我執行配置了--gasLimit=0xfffffffffff和.的 Ganache v6.1.0 --port=8545

然後,我上傳了這個合約並嘗試lock通過 web3 v1.0.0-beta.34 呼叫該方法:

let fs = require("fs");
let Web3 = require("web3");

let web3 = new Web3("http://localhost:8545");

async function deploy(contractName) {
   let abi = fs.readFileSync(contractName + ".abi").toString();
   let bin = fs.readFileSync(contractName + ".bin").toString();
   let contract = new web3.eth.Contract(JSON.parse(abi));
   let handle = await send(contract.deploy({data: "0x" + bin}));
   return new web3.eth.Contract(JSON.parse(abi), handle.contractAddress);
}

async function send(transaction) {
   let gas = await transaction.estimateGas({from: PUBLIC_KEY});
   let options = {
       to  : transaction._parent._address,
       data: transaction.encodeABI(),
       gas : gas
   };
   let signedTransaction = await web3.eth.accounts.signTransaction(options, PRIVATE_KEY);
   let receipt = await web3.eth.sendSignedTransaction(signedTransaction.rawTransaction);
   return receipt;
}

async function execute() {
   let myContract = await deploy("MyContract");
   let transaction = myContract.methods.lock();
   await send(transaction);
}

execute();

呼叫execute()–> send(transaction)–>web3.eth.sendSignedTransaction(...)產生:

基本費用超過 gas 限制

知道是什麼原因造成的嗎?

到目前為止,我發現唯一有用的觀察結果是,與在我的腳本中執行的任何其他交易相比,此特定交易需要非常少量的 gas(大約 13000)。

順便說一句,當我使用 Parity 而不是 Ganache 時,不會出現這個問題。

也許這是另一個暗示。

謝謝!

我相信這是一個與如何計算汽油退款有關的ganache錯誤。eth_estimateGas(13000 小於 21000 的最低交易成本。)

順便說一句,看起來這個錯誤可能剛剛修復?請參閱https://github.com/trufflesuite/ganache-core/issues/26

從 GitHub 獲取最新的原始碼並針對它進行測試可能是值得的。

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