Web3js
在需要少量氣體的交易中獲得“基本費用超過氣體限制”
我有以下契約:
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 獲取最新的原始碼並針對它進行測試可能是值得的。