Bei einer Transaktion, für die eine kleine Menge Gas erforderlich ist, die „Grundgebühr überschreitet das Gaslimit“ zu erhalten

Ich habe folgenden Vertrag:

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;
    }
}

Ich verwende Ganache v6.1.0 konfiguriert mit --gasLimit=0xfffffffffffund --port=8545.

Dann lade ich diesen Vertrag hoch und versuche, die lockMethode über web3 v1.0.0-beta.34 aufzurufen:

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();

Aufruf execute()--> send(transaction)--> web3.eth.sendSignedTransaction(...)ergibt:

Grundgebühr übersteigt Gaslimit

Irgendeine Idee, was das verursacht?

Die einzige Beobachtung, die ich bisher als nützlich empfunden habe, ist, dass diese spezielle Transaktion eine sehr kleine Menge an Gas benötigt (etwa 13000) im Vergleich zu mindestens zweimal für jede andere Transaktion, die in meinem Skript ausgeführt wird.

Dieses Problem tritt übrigens nicht auf, wenn ich Parity anstelle von Ganache verwende.

Vielleicht ist das ein weiterer Hinweis.

Danke schön!

Randnotiz für zukünftige Leser: Das Problem scheint bei der Verwendung von gelöst zu sein "ganache-cli": "6.1.8".

Antworten (1)

Ich glaube, das ist ein ganacheFehler in eth_estimateGasBezug auf die Berechnung der Gasrückerstattung. (13000 ist weniger als die Mindesttransaktionskosten von 21000.)

Übrigens sieht es so aus, als ob der Fehler vielleicht gerade behoben wurde? Siehe https://github.com/trufflesuite/ganache-core/issues/26 .

Es könnte sich lohnen, die neueste Quelle von GitHub zu holen und damit zu testen.

Danke schön. Ich verwende Ganache CLI, also gehe ich davon aus, dass ich eine JS-Quelldatei aus diesem Repository holen und in meinen /node_modules/ganache-cliOrdner kopieren sollte. Habe ich recht? Können Sie mir sagen, welche Quelldatei ich aus diesem Repository nehmen soll?
Randnotiz für zukünftige Leser: Das Problem scheint bei der Verwendung von gelöst zu sein "ganache-cli": "6.1.8".