Se excedió el límite de gas del bloque al compilar el contrato Navegador Solidity

El uso de Solidity Browser ( https://ethereum.github.io/browser-solidity/ ) para extraer un contrato en testnet con web3 inyectado y cuenta metamask arroja este error:

callback contain no result Gas required exceeds limit: 3000000

Se espera que la implementación de este contrato (código fuente => https://gist.github.com/computerphysicslab/f362383f9d3fed26becba48b934bbcfc ) cueste alrededor de 6 millones de gas (según el entorno JS VM). Sin embargo al intentar aumentar el límite de gas se arrojan estos errores:

callback contain no result Gas required exceeds limit: 4000000
callback contain no result Gas required exceeds block gas limit: 5000000
callback contain no result Gas required exceeds block gas limit: 6000000
callback contain no result Gas required exceeds block gas limit: 10000000
...

Entonces, parece que no es posible explotar el contrato porque hay un límite de gas de bloque de alrededor de 5 millones de gas. ¿Es posible superar este límite de alguna manera?

Referencias:

El compilador del navegador Solidity falla

¿Por qué el compilador de solidez basado en el navegador falla cuando el código es demasiado largo?

Excede el error de límite de bloque de gas cuando se implementa cerca del contrato de límite de gas de bloque

Respuestas (3)

A menos que los mineros aumenten el límite de gas del bloque, su única opción es dividir el contrato en varios contratos.

Por lo tanto, cada contrato tiene su propia dirección y puede realizar llamadas entre ellos. Por ejemplo, una ICO Crowdsale se puede dividir en:

  • Venta colectiva: administre la venta colectiva, cómo se asignan los tokens, recompensas, apertura, cierre
  • Token: implementa ERC20, puede crear tokens, aprobar transferencias
  • Monedero: administre los fondos recibidos durante el crowdsale

También la división ayuda a una auditoría de seguridad ya que cada contrato tiene un alcance limitado.

Cada contrato se puede implementar de forma independiente y, a través de un método de configuración, completa la configuración.

Lo probé, pero dividir el contrato usando comandos de inclusión no reduce el costo total de gas de la implementación.
El uso de include no divide el contrato. Esa es solo una instrucción para el compilador para juntar todas esas cosas en un contrato.
@JuanIgnacioPérezSacristán He actualizado con un ejemplo
¿Cómo se vinculan estos contratos? como bibliotecas? ¿O por herencia? Mi código también usa la herencia y requiere demasiado gas, por lo que es imposible implementarlo.
@JuanIgnacioPérezSacristán Inheritance juntará todo el código. Debe dividirse en contratos separados para que cada uno pueda implementarse de forma independiente. Mire status ico github.com/status-im/status-network-token , tienen contratos separados y un script que los implementará y establecerá la configuración inicial. Usan trufas, que hacen que sea muy fácil implementar varios contratos y configurarlos.
A veces tiene sentido usar bibliotecas si el código se puede reutilizar, como en SafeMath, por ejemplo. Porque las bibliotecas usan los mismos datos compartidos. Si los contratos están separados, solo pueden acceder a los datos a través de los métodos públicos.

En realidad, el gas máximo por transacción está dado por eth.getBlock('latest').gasLimit4,7 millones en la actualidad.

Editar: el límite de gas está aumentando y parece que el objetivo es alcanzar un límite de 6,7 millones, por lo que sin hacer nada, pronto podrá implementar su contrato. Fuente: Reddit

Para implementar su contrato, debe reducir el costo de implementación.

Hay formas de reducir el costo del gas:

  1. Simplificar el contrato. (especialmente constructores)
  2. Usa el optimizador
  3. Dividirlo en múltiples contratos.
  4. Refactorizar para usar bibliotecas

Por ejemplo, puede intentar usar SafeMath en lugar de su propia implementación.

O incluso aunque lo haya hecho, pero puede eliminar la parte utilizada para depurar como

// @notice For debugging purposes when using solidity online browser
function whoAmI() constant returns (address) {
    return msg.sender;
}

Por cierto, la discusión para aumentar el límite de gas está en camino, algunos grupos de mineros ya lo aumentaron, pero algunos grandes todavía usan este límite "antiguo" para prevenir ataques DDOS. Este hilo en Reddit explica un poco el problema actual con el límite de gas.

Consejos muy útiles. Mi código ya está dividido en varios contratos, pero aún requiere demasiado gas para implementarse.
Edité mi respuesta. El límite de gas está aumentando y parece que el objetivo es llegar a 6,7M. Suficiente para implementar su contrato. Espero que en unas horas/días puedas hacerlo sin tocar tu contrato.
Hola de nuevo :) Llegamos a más de 6M para el límite de gas, ¿puedes intentar implementar el contrato nuevamente?

Deberá poner algunas de las cosas, como SafeMath, en un contrato de biblioteca , que puede implementar como contratos separados. De lo contrario, no hay forma de reducir los costos del gas.