Cuando estoy implementando un contrato, aparece el mensaje "Error: no se pudo almacenar el código del contrato, verifique la cantidad de gas"

caso 1. Cuando el gas estimado de mi contrato es 72,75,790 por el método web3.eth.estimateGas en mi cadena de bloques privada. Funciona bien y se implementa el contrato.
caso 2. El gas estimado de mi contrato es 50 000 000 y la cantidad de gas aprobada es 50 000 000 + 300 000. pero no se puede almacenar el contrato en ethereum-blockchain usando web3 api en nodejs Error: el código del contrato no se pudo almacenar, verifique la cantidad de gas.
Nota: - Ya configuré gasLimit en 200 000 000 000 (es decir, más que el gas estimado) en el momento de la creación de la cadena de bloques privada.

proporcione su código de contrato
@BadrBellaj se trata de más de 350 líneas de código. ¿necesitas?
solo las funciones de pago
@BadrBellaj No he agregado ninguna función pagadera en mi contrato. porque no estoy enviando ether para contratar.
compartir el código del contrato en esencia
Enlace de código de contrato de @BadrBellaj Nota: - cuando comento la función getHash, funciona bien. De lo contrario, dará un error como "El contrato no se pudo almacenar, verifique la cantidad de gas".

Respuestas (1)

El contrato puede ser demasiado grande, punto.

En el hardfork más reciente, se implementó un tamaño máximo de contrato . Lo más probable es que su contrato, si usa 50,000,000 de gasolina, esté mucho más allá de eso. Si este es el caso, el contrato siempre fallará en ser creado.

Es posible que pueda configurar su cadena de bloques privada para que tenga un tamaño de código máximo más alto, suponiendo que solo esté usando Parity. (Vea el final de la discusión en el enlace). Pero si eso no es posible, o si desea usar la cadena pública, solo tendrá que reducir el contrato.

Aquí hay algunas sugerencias.

  1. Usa bibliotecas . Esto dividirá su contrato en varios subcontratos, pero lo que es más importante, puede hacer que su código sea mucho más elegante y fácil de leer.
  2. Mantente fuera de las cuerdas. A diferencia de casi cualquier otro idioma, las cadenas son costosas en solidez, y cuanto menos las use, mejor estará. Por ejemplo, devuelve cadenas de funciones y en registros. En lugar de eso, puede devolver un código de error (o diferentes tipos de eventos) y hacer que la interfaz lo muestre en forma legible por humanos.
  3. También veo lugares donde podría usar enumeraciones en lugar de cadenas de texto.
  4. Para cada evento, tienes nowcomo uno de los argumentos. Esto no es realmente necesario: si tiene acceso a un evento en web3.js, también puede saber de qué bloque es y luego a qué hora sucedió.

¡Espero que esto ayude!