En web3.js, ¿cómo encuentro con precisión el costo total del gas para implementar un nuevo contrato (incluido el constructor)?

Estoy usando un nodo público como mi privado web3, por lo que debo firmar todas las transacciones manualmente. Esto incluye transacciones que crean contratos.

Actualmente, uso el siguiente método para implementar contratos.

/* I create the contract first. */
var contractAbi = ... (I load this from a file.)
var contractBytecode = ... (I load this from another file.)
var contract = new web3.eth.Contract(contractAbi);

/* Then I get the data encoded with constructor parameters. */
var contractDeployInfo = contract.deploy({
  data: contractBytecode,
  arguments: [constructorParam1, constructorParam2]
});

/* Data field of the transaction. */
var transactionData = contractDeployInfo.encodeABI();

/* Then I estimate the gas, using the provided method. */
contractDeployInfo.estimateGas().then(gas => {
    // Use this gas estimate to create raw transaction, 
    // sign it, send it, and so on.
})

La transacción se realiza y el contrato se implementa.

Sin embargo, la estimación de gas devuelta por contract.deploy().estimateGas() solo devuelve el gas que es suficiente para enviar el contrato a los mineros, pero no lo suficiente para ejecutar realmente al constructor del contrato.

Como resultado, me quedo con un contrato en blanco sin datos en la dirección del contrato que se especifica en el recibo de la transacción.

¿Debo calcular el presupuesto de gas del constructor del contrato y agregarlo al límite de gas en mis transacciones?

Esta pregunta "duplicada" ( Cómo estimar el gas en la creación/implementación del contrato en la cadena de bloques privada de ethereum ) utiliza una versión anterior de la biblioteca Web3. También me refería a la función de implementación recién introducida.

¿Puede dar más detalles sobre "var contractBytecode = ... (Cargué esto desde otro archivo)". Además, ¿puede mostrar en Etherscan la transacción que "falló"?
Solo para aclarar algunas cosas. Realmente no puede quedarse con un contrato en blanco que no puede ejecutar el constructor, toda la transacción de implementar y ejecutar el constructor ha fallado. Todas las transacciones que se pueden enviar con éxito a la red devolverán un recibo, esto no significa que tendrán éxito cuando se ejecuten. Estas transacciones fallidas también se extraen, por lo que el gas utilizado para demostrarlo se perderá. Parece que el contrato tiene un error, lo que provoca una mala estimación y una implementación fallida final.

Respuestas (1)

Puede implementar el contrato en su developmenttestrpc y verificar el gas para esa transacción.

const tx = await MyContract.new();
const gasUsed = tx.receipt.gasUsed;

Espero que esto ayude.