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 implementar el contrato en su development
testrpc y verificar el gas para esa transacción.
const tx = await MyContract.new();
const gasUsed = tx.receipt.gasUsed;
Espero que esto ayude.
Xavier Leprêtre B9lab
blackops