¿Se está quedando sin gasolina durante una implementación debido a una gran cantidad de declaraciones require ()?

Tengo un contrato inteligente que tiene una buena cantidad de funciones, pero una gran cantidad de instrucciones require() porque verifico cuidadosamente todos los parámetros entrantes y también algunos resultados de cálculos intermedios. He estado luchando contra un error de falta de combustible durante mis migraciones beta de Truffle 5.0 durante mucho tiempo con este contrato.

Por una corazonada, hice una búsqueda y reemplazo a lo largo del contrato que comentaba cada instrucción require() . El error de falta de gas desapareció y pude implementar con éxito.

Si uso el optimizador de solc , puedo implementarlo con éxito con las instrucciones require() intactas. Pero entonces no puedo usar el depurador Truffle ya que actualmente no puede coexistir con el código optimizado, y realmente necesito el depurador.

Pensé que podría deberse a las cadenas largas que estaba usando como mis "mensajes de reversión" para las instrucciones require() , por lo que reduje radicalmente su tamaño, pero el error seguía ocurriendo. Luego traté de cambiarlos todos a cadenas vacías pero aún recibí el error. Realmente parece ser la gran cantidad de declaraciones require() lo que está causando el error de falta de gas , pero solo cuando no uso el optimizador.

¿Alguien ha experimentado esto y puede sugerir una técnica para bajar el gas lo suficiente como para poder desplegarlo? Tenga en cuenta que estoy enviando una cantidad extremadamente alta de gas con mi migración, justo por debajo del límite de bloque para el cliente de Ganache.

2_deploy_ebb.js
===============

   Replacing 'EtherBandBattlesManager'
   -----------------------------------
Error:  *** Deployment Failed ***

"EtherBandBattlesManager" ran out of gas (using a value you set in your network config or deployment parameters.)
   * Block limit:  100000000
   * Gas sent:     99999999

    at ./.nvm/versions/node/v8.11.1/lib/node_modules/truffle/build/webpack:/packages/truffle-deployer/src/deployment.js:364:1
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
Truffle v5.0.0-beta.2 (core: 5.0.0-beta.2)
Solidity v0.5.0 (solc-js)
Node v8.11.1

Respuestas (1)

Me informaron de una marca en el cliente de línea de comandos de Ganache que permite tamaños de contrato ilimitados durante el desarrollo. Al usar este indicador, ahora puedo implementar/migrar a Ganache sin obtener un error de falta de gas (gracias al canal Jerry on Loom Network Telegram por informarme sobre este indicador).

Aquí está la línea de comando que uso para iniciar el cliente CLI de Ganache:

ganache-cli -d 100000000 --allowUnlimitedContractSize

Tenga en cuenta el indicador -d adicional que le permite especificar un límite máximo de gas de bloque más alto que el valor predeterminado. Puede ver la lista completa de indicadores de la CLI de Ganache en la página Léame del repositorio de GitHub para ese proyecto:

https://github.com/trufflesuite/ganache-core

Entonces, cuando desarrollo, uso el cliente CLI de Ganache con el indicador --allowUnlimitedContractSize y sin usar el optimizador solc . Cuando implemento en Rinkeby o Main Net (o cualquier otra red no local), para evitar errores de falta de gas, habilito el optimizador solc agregando la siguiente sección de nivel superior a mi archivo de configuración truffle.js :

solc: { optimizer: { enabled: true, runs: 200 } }