Llamar a una función para poner a cero los datos de estructura en un mapeo que cuesta más gas que otras llamadas, lo que provoca un error de falta de gas

Estoy trabajando con la siguiente función y vars de estado:

struct TimeRestriction {
   uint256 fromTime;
   uint256 toTime;
}

mapping (address => TimeRestriction) public whitelist;

function modifyWhitelist(address _investor, uint256 _fromTime, uint256 _toTime) public withPerm(WHITELIST) {

    //Passing a _time == 0 into this function, is equivalent to removing the _investor from the whitelist

    whitelist[_investor] = TimeRestriction(_fromTime, _toTime);
    emit LogModifyWhitelist(_investor, now, msg.sender, _fromTime, _toTime);
}

Actualmente puedo llamar a esta función con éxito y escribir en la cadena de bloques. Incluso puedo llamarlo y actualizar los valores a cualquier marca de tiempo. Pero por alguna extraña razón, cuando trato de pasar 0 valores a esta función, fallará. Obtuve el siguiente error:

Error: Transaction dry run failed: Invalid JSON RPC response: {"id":470,"jsonrpc":"2.0"}.

Luego, cuando investigué un poco más, obtuve este error:

Error:Returned error: base fee exceeds gas limit.

Luego, al aumentar la cantidad de gas tx en un 25%, veo:

Error:Returned error: VM Exception while processing transaction: out of gas

Y luego, cuando aumento la cantidad de gas tx en un 100 %, realmente funciona. (tenga en cuenta que estoy usando la función de estimación de gas web3 de web3 1.0.0-beta.30)

¿Alguien sabe qué está pasando aquí? Me parece que establecer estos valores en cero cuesta significativamente más gasolina, pero al leer parece que se supone que establecer en cero reembolsa la gasolina y le cuesta menos.

¿Tiene algo que ver con que sea una estructura dentro de un mapeo? He llegado a un callejón sin salida aquí

Aquí está mi entorno: Ganache CLI v6.1.0 (ganache-core: 2.1.0) Chrome Versión 65.0.3325.181 Truffle versión 4.1.3^

Respuestas (1)

Lo rastreé, vea una lista detallada de problemas de ganache, geth y metamask aquí: https://github.com/PolymathNetwork/polymath.js/issues/6

Pero básicamente, ganache no usa la búsqueda binaria de estimación de gas que hacen geth y metamask. La estimación de gasolina devuelve la estimación de gasolina real, que es más baja, debido al reembolso. Sin embargo, EVM requiere que aún envíes gasEstimated + gasRefunded con la transacción, y luego obtienes el reembolso cuando se completa.

Entonces ganache termina estimando un valor correcto con el reembolso implementado, pero el EVM no lo acepta.