Implementar contratos inteligentes usando nodejs

Estoy tratando de seguir el siguiente ejemplo.

http://hypernephelist.com/2016/12/13/compile-deploy-ethereum-smart-contract-web3-solc.html

Pero me sale el siguiente error. ¿Alguien puede mostrarme qué está mal en mi código? Gracias.

$ cat contracts/HelloWorld.sol 
pragma solidity ^0.4.16;
contract HelloWorld {
  function get() public pure returns (string retVal) {
    return "HelloWorld!!";
  }
}

$ cat test.js 
const fs = require('fs')
const input = fs.readFileSync('contracts/HelloWorld.sol', 'utf8');

const solc = require('solc')
const output = solc.compile(input, 1);
const bytecode = output.contracts[':HelloWorld'].bytecode;
const abi = JSON.parse(output.contracts[':HelloWorld'].interface);

const Web3 = require('web3')
const web3 = new Web3('ws://localhost:8546');

web3.eth.getAccounts().then((accounts) => { 
  const testContract = new web3.eth.Contract(abi);
  testContract.deploy({
    data: "0x" + bytecode,
  })
    .send({from: accounts[0], gas: 4700000})
    .then((instance) => {
      console.log(`Address: ${instance.options.address}`);
    })
    .catch(console.log);
});
$ node  test.js 
connection not open on send()
(node:11309) UnhandledPromiseRejectionWarning: Error: connection not open
    at WebsocketProvider.send (/Users/pengy/linux/test/gnu/geth/bin/Hello-Ethereum/node_modules/web3-providers-ws/src/index.js:211:18)
    at Timeout._onTimeout (/Users/pengy/linux/test/gnu/geth/bin/Hello-Ethereum/node_modules/web3-providers-ws/src/index.js:196:19)
    at ontimeout (timers.js:466:11)
    at tryOnTimeout (timers.js:304:5)
    at Timer.listOnTimeout (timers.js:267:5)
(node:11309) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:11309) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
¡Estás analizando abi dos veces!

Respuestas (1)

Estás analizando el ABI dos veces.

const abi = JSON.parse(output.contracts[':HelloWorld'].interface);

y aquí

const testContract = web3.eth.contract(JSON.parse(abi));

simplemente cambie la segunda línea y elimine JSON.parseel error que se resolverá.

Pero considere que si está usando web3 1.0 (que viene por defecto si instala el paquete ahora) ese código no funcionará correctamente. La sintaxis es diferente y es posible que deba cambiarla correctamente:

const Web3 = require('web3')
const web3 = nuevo Web3("http://localhost:8545");

web3.eth.getAccounts().then((cuentas) => {
  const testContract = new web3.eth.Contract(abi);
  pruebaContract.deploy({
    datos: "0x" + código de bytes,
  })
  .send({de: cuentas[0], gasolina: 4700000})
  .then((instancia) => {
    console.log(`Dirección: ${instancia.opciones.dirección}`);
  })
  .catch(consola.log);
});
Todavía veo errores. Ver la nueva edición. ¿Sabes lo que está mal? Gracias.
es bastante obvio el error. la conexión no está abierta. ¿Está seguro de que 'ws://localhost:8546'es la dirección/puerto correcto y está escuchando en websocket? Si no, no funcionará. Si usa ganache-cli, la dirección predeterminada es la mencionada en mi publicación
DE ACUERDO. Cambié 8546 a 8545. Entonces, parece funcionar $ node test.js Address: 0x4F5818ffD21b1eb122Fb1517117bC15a5c4F5EC8. ¿Por qué el programa no termina? ¿Qué debo esperar de este programa?
La expectativa es la dirección del contrato, y la está obteniendo. Por lo tanto, significa que se ha implementado correctamente y que recibió la dirección de vuelta. que puede utilizar web3para invocar su contrato.
Si quiero ejecutar ejecutar el contrato, ¿cómo hacerlo?
Ya te lo dije, puedes usar la leva web3para invocar el contrato. Lea la documentación web3js.readthedocs.io/en/1.0/web3-eth-contract.html y si tiene un problema específico, haga otra pregunta.
La documentación allí está desactualizada (dice This documentation is work in progress and web3.js 1.0 is not yet released!). No sé qué aprender y qué no aprender.
no esta desactualizado! La web3 1.0 es la versión beta y es la que se instalará por defecto en este momento y es a la que se refiere la publicación. Si desea utilizar la versión anterior (0.2xx), vaya aquí: github.com/ethereum/wiki/wiki/JavaScript-API