El despliegue de trufas en la red de prueba dice: Error: excede el límite de gas del bloque

Estoy tratando de implementar un contrato de muestra (siguiendo esta guía ), pero recibo un error que indica que no hay suficiente gasolina. Cambié un poco los números pero no pude arreglarlo. Vi esta pregunta en el intercambio de pila, pero hay algunas cosas que no entiendo en la respuesta sugerida allí:

  • ¿Qué significa modificar el bloque de génesis de la siguiente manera?

    "Puede modificar su bloque de génesis para tener un límite de gas de 0x2fefd8, que es el mismo que el de la red principal (3 141 592 de gas). También deberá restablecer esa cadena de prueba, ya que cambiará el bloque de génesis".

  • En los archivos js que imprimo a continuación, hay dos parámetros de "gas": uno en 2_deploy_contracts.jsy el otro en truffle.js. ¿Qué significa cada uno de ellos (cómo afectan el despliegue de un contrato)? ¿Hay otros lugares relacionados con la cantidad de problemas de gas?

Mi error y el contenido del archivo:

~/voting$ truffle deploy
Using network 'development'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
Error encountered, bailing. Network state unknown. Review successful transactions manually.
Error: exceeds block gas limit
    at Object.InvalidResponse (/usr/lib/node_modules/truffle/build/cli.bundled.js:37022:16)
    at /usr/lib/node_modules/truffle/build/cli.bundled.js:209743:36
    at XMLHttpRequest.request.onreadystatechange (/usr/lib/node_modules/truffle/build/cli.bundled.js:208522:13)
    at XMLHttpRequestEventTarget.dispatchEvent (/usr/lib/node_modules/truffle/build/cli.bundled.js:210395:18)
    at XMLHttpRequest._setReadyState (/usr/lib/node_modules/truffle/build/cli.bundled.js:210685:12)
    at XMLHttpRequest._onHttpResponseEnd (/usr/lib/node_modules/truffle/build/cli.bundled.js:210840:12)
    at IncomingMessage.<anonymous> (/usr/lib/node_modules/truffle/build/cli.bundled.js:210800:24)
    at emitNone (events.js:91:20)
    at IncomingMessage.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:974:12)

migraciones/1_migración_inicial.js

var Migrations = artifacts.require("./Migrations.sol");
module.exports = function(deployer) {
  deployer.deploy(Migrations);
};

migraciones/2_deploy_contratos.js

var Voting = artifacts.require("./Voting.sol");
module.exports = function(deployer) {
  deployer.deploy(Voting, ['Rama', 'Nick', 'Jose'], {gas: 5000000});
};

trufa.js require('registro de babel')

module.exports = {
  networks: {
    development: {
      host: 'localhost',
      port: 8545,
      network_id: '*', // Match any network id
      // gas:400000000000,
      gas:1000258612000000000,
      from: "0xf212bb926f7a831ff745e4236fc704a9947de77c"
    }
  }
}

Respuestas (6)

Dentro de truffle.js, agregue

,gas: 4600000

No olvides el pequeño "," para que parezca

  networks: {
    development: {
      host: "localhost",
      port: 8545,
      network_id: "*",
      gas: 4600000
    }
Esto debe ser aceptado como respuesta correcta.

O su contrato es demasiado grande o su configuración de trufa es una litera.

gas:1000258612000000000

y

{gas: 5000000}

Estos son valores de gas no válidos. El máximo es de alrededor de 4 m, por lo que no hay forma de que sea un valor válido.

Regrese a su comentario y, si aún ve el error, es probable que su contrato sea demasiado grande y probablemente deba dividirse en bibliotecas. Una buena manera de verificar es mirar el costo del gas de "creación" con solc --gas path/to/contract.sol.

¿Qué significa modificar el bloque de génesis de la siguiente manera?

Eso es solo si está ejecutando una red de prueba, así que ignórelo a menos que su proyecto exista únicamente en una cadena privada.

En los archivos js que imprimo a continuación, hay dos parámetros de "gas": uno en 2_deploy_contracts.js y el otro en truffle.js. ¿Qué significa cada uno de ellos (cómo afectan el despliegue de un contrato)? ¿Hay otros lugares relacionados con la cantidad de problemas de gas?

El primero deployer.deployes solo el valor máximo de gas que está permitiendo para la transacción. Esto también está por encima del límite de bloque de 4 m, así que arréglalo también.

El segundo, parece una descripción de la red (no estoy completamente seguro con trufa). Esto le dice a trufa cuál es el valor máximo de gas de la red. No estoy seguro de dónde encontrar el límite más actual, pero he estado ejecutando mis pruebas con un límite de 4 000 000. Según ethstats.net, eso podría ser hasta unos 6 millones ahora.

En mi caso utilicé un bloque de génesis con un límite de gas muy bajo:

"gasLimit": "2100000"

Al especificar una cantidad de gas ligeramente por debajo de esta cantidad en truffle.js, me resolvió el problema. Aquí está mi definición de red en truffle.js:

"private": {
    network_id: 15,
    host: "localhost",
    port: 8545,
    gas: 2000000
},

También enfrenté el problema similar. La versión de truffle que estaba usando era Truffle v4.0.1 (núcleo: 4.0.1). Si baja a la versión beta, todo funcionará bien. 1. npm uninstall -g truffle 2. versión truffle (para verificar si está desinstalado) 3. npm install -g truffle@beta

Tú eres bueno para irte. Esto debería solucionar el problema.

Acabo de bajar de categoría y todavía no puedo hacer que Truffle escuche mi campo "gasPrice". ¿Hay algo más que simplemente cambiar ese campo y ejecutar la compilación de truffle que debería estar haciendo?
Espero que esté ejecutando truffle migrate después de ejecutar truffle compile. También puede intentar poner el valor del gas como valor máximo, que es de 4 millones.
Resultó que esto era solo un problema con --dry-run

También estoy siguiendo la misma guía y tuve el mismo problema. En truffle.js, di 4700000 para el gas. También en el archivo de migración (el segundo archivo), cambié el gas a 4700000 así:

var Voting = artifacts.require("./Voting.sol");
module.exports = function(deployer) {
  deployer.deploy(Voting, ['Rama', 'Nick', 'Jose'], {gas: 4700000});
};

Ejecuto con truffle migrate --reset y mi problema se resolvió.

Para aquellos de ustedes que ninguno de estos ayudó, eliminé todo y lo configuré nuevamente (siguiendo la guía mencionada), configuré el gas en la configuración de trufa y funcionó. Usé tres nodos.

El problema es que mi gasLimit se atascó en 5003 (independientemente de iniciar el nodo con --targetgaslimit después de eliminar los datos de la cadena completa) y supongo que se debe al cálculo dinámico del límite de gas que usan los nodos, por lo que disminuyó debido a la inactividad de la red. No tiene sentido porque una vez que se elimina toda la cadena de bloques, esto debería reiniciarse. Pero por alguna razón se quedó atascado en ese valor.

Después de esto, solo necesita verificar el límite de gas actual

geth attach <path_to_node_dir>/geth.ipc

y, una vez conectado, compruébelo a través de

web3.eth.getBlock("pending").gasLimit

y luego asegúrese de configurar el parámetro de gas en su archivo de configuración de trufa. Después de esto, la migración funcionó.