Obtener 'la tarifa base excede el límite de gasolina' en una transacción que requiere una pequeña cantidad de gasolina

Tengo el siguiente contrato:

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

Ejecuto Ganache v6.1.0 configurado con --gasLimit=0xfffffffffffy --port=8545.

Luego, cargo este contrato e intento invocar el lockmétodo a través de 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();

Llamar execute()--> send(transaction)--> web3.eth.sendSignedTransaction(...)produce:

la tarifa base excede el límite de gasolina

¿Alguna idea de qué está causando esto?

La única observación que he encontrado útil hasta ahora es que esta transacción específica requiere una cantidad muy pequeña de gas (alrededor de 13000) en comparación con al menos el doble para cualquier otra transacción ejecutada en mi script.

Por cierto, este problema no ocurre cuando uso Parity en lugar de Ganache.

Quizás esta sea otra pista.

¡Gracias!

Nota al margen para futuros lectores: el problema parece resolverse al usar "ganache-cli": "6.1.8".

Respuestas (1)

Creo que esto es un ganacheerror eth_estimateGasrelacionado con la forma en que se calculan los reembolsos de gasolina. (13000 es menos que el costo de transacción mínimo de 21000).

Por cierto, ¿parece que tal vez el error se solucionó? Consulte https://github.com/trufflesuite/ganache-core/issues/26 .

Puede valer la pena obtener la fuente más reciente de GitHub y probarla.

Gracias. Estoy usando Ganache CLI, por lo que supongo que debo tomar algún archivo fuente JS de este repositorio y copiarlo en mi /node_modules/ganache-clicarpeta. ¿Tengo razón? ¿Serías capaz de guiarme sobre qué archivo fuente tomar de este repositorio?
Nota al margen para futuros lectores: el problema parece resolverse al usar "ganache-cli": "6.1.8".