¿Cómo implementar un contrato inteligente en una cadena de bloques privada?

He usado geth para configurar una cadena de bloques privada local. Pude configurar dos cuentas y enviar ether de una a otra y extraer las transacciones. Ahora estoy tratando de implementar un contrato inteligente. Seguí estos pasos:

Usé solcjs para generar los archivos .abi y .bin

Iniciar el minero

Desbloqueó la cuenta utilizada para implementar el contrato.

Guardado en la consola geth bin y abi con:

var contract = web3.eth.contract(<CONTENTS_OF_ABI_FILE>)
var bytecode = '0x<CONTENTS_OF_BIN_FILE>'

Implemente el contrato inteligente con:

var deploy = {from:eth.accounts[0], data:bytecode, gas: 2000000}
var instance = contract.new(param1,param2,param3, deploy)

Entonces geth devuelve indefinido y si ejecuto `instance.address' todavía obtengo indefinido.

¿Por qué no se extrae mi contrato?

¿Está ejecutando sus pruebas desde la consola geth? ¿Falló la transacción o simplemente se ignoró (es decir, permanece en estado pendiente)? Primero probaría con un contrato simple para descartar problemas con el límite de gas.

Respuestas (1)

newno devolverá la dirección inmediatamente. Lo que tendrás inmediatamente es hash de transacción. A partir de ahí, tendrás que esperar a que se extraiga la transacción.

De https://github.com/ethereum/wiki/wiki/JavaScript-API :

// Deploy contract syncronous: The address will be added as soon as the contract is mined.
// Additionally you can watch the transaction by using the "transactionHash" property
var myContractInstance = MyContract.new(param1, param2, {data: myContractCode, gas: 300000, from: mySenderAddress});
myContractInstance.transactionHash // The hash of the transaction, which created the contract
myContractInstance.address // undefined at start, but will be auto-filled later

Sugeriría usar un marco como trufa. En trufa, una transacción será una promesa y puede awaitcompletarla.