Implementación de contratos inteligentes programáticamente desde web3 / nodejs

Estoy creando una Dapp donde, cada vez que un usuario crea una cuenta, crea automáticamente una dirección de Ethereum para el usuario (estoy exponiendo el módulo personal sobre RPC por ahora, pero es solo para jugar). Ahora quiero implementar automáticamente un contrato cuando un usuario crea una cuenta, idealmente para que ese usuario sea la única dirección capaz de interactuar con ese contrato.

Siguiendo algunos tutoriales ( este ), instalé solc y cambié mi código a

var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
const solc = require('solc');
var fs = require('fs');
const input = fs.readFileSync('contracts/helloWorld.sol');
const output = solc.compile(input.toString(), 1);
const bytecode = output.contracts['helloWorld'].bytecode;
const abi = JSON.parse(output.contracts[':helloWorld'].interface);

Sin embargo, esto arroja un error TypeError: Cannot read property ':helloWorld' of undefined. Después de investigar un poco, me di cuenta de que la salida está regresando.{ errors: [ ':1:1: Error: Expected import directive or contract definition.\npragma solidity ^0.4.11;\n^\n' ] }

Finalmente, incluso después de ver esta respuesta, todavía no puedo entender por qué. Pego mi código de contrato en Remix IDE y no arroja ningún error.

Mi código de contrato (el de prueba que estoy usando ahora) es

pragma solidity ^0.4.11;

contract helloWorld {
    /* Constructor */
    address owner;

    function helloWorld() {
        owner = msg.sender;    
    }

    function remove() {
        if (msg.sender == owner) {
            // Suicide and send funds to owner
            selfdestruct(owner);
        }
    }

    function greet() constant returns (bytes32, address) {
        if (msg.sender == owner) {
            bytes32 hello = "hello";
            return (hello, msg.sender);
        }
    }

}

Cualquier ayuda sería muy apreciada, he estado atascado por un tiempo :)

Verifique los resultados de la compilación en busca de errores si (salida ['errores']) { console.log (JSON.stringify (salida ['errores']))}
¿Es necesario leer el contrato de un archivo? si el contrato no cambia, puede evitar la compilación onfly.
Sería más conveniente porque de esa manera podría tener un directorio de contratos como parte de la aplicación del nodo con todos los contratos en él. Pero, ¿cuál propondría usted como alternativa?

Respuestas (3)

Intente simplemente cortar y pegar su código en la terminal nodejs (tenga en cuenta las garrapatas graves), así que...

var source = `pragma solidity ^0.4.11;

contract helloWorld {
    /* Constructor */
    address owner;

    function helloWorld() {
        owner = msg.sender;    
    }

    function remove() {
        if (msg.sender == owner) {
            // Suicide and send funds to owner
            selfdestruct(owner);
        }
    }

    function greet() constant returns (bytes32, address) {
        if (msg.sender == owner) {
            bytes32 hello = "hello";
            return (hello, msg.sender);
        }
    }

}`

var output = solc.compile(source);

Las cosas de importación son todo tipo de cosas raras para mí también.

Esto no pareció funcionar para mí, arroja el mismo error.

Creo que es un problema de codificación. https://github.com/ethereum/solc-js/issues/90

Su mensaje de error proviene de esta línea:\npragma solidity ^0.4.11;\n^\n'

Cuando lo ejecuté en mi consola, toString resultó en \npragma solidity ^0.4.11;\n\n, así que creo que el \n^literal está causando que solc se equivoque.

El error proviene de esa línea, pero no entendí cómo resolverlo a partir de su respuesta, ¿podría aclararlo, por favor?
Además, intenté usar el paquete npm utf8 para convertir a UTF-8, pero también devolvió un error.
La persona en el enlace que envié arregló su problema ajustando la codificación en el propio editor, ya que la importación con codificación utf8 usando fs no funcionó. Creo que el problema podría ser con su editor, porque su código funcionó perfectamente para mí.
Estoy usando Sublime 2 y probé Archivo> Guardar con codificación> UTF-8 y todavía me da el mismo error. ¿Alguna otra idea? Gracias por la ayuda.
La respuesta de @ thefett también funcionó para mí ... ¿tal vez actualizar solc?
Estoy en la versión 0.4.13+commit.0fb4cb1a.Emscripten.clang¿cuál estás usando?
0.4.4+commit.4633f3de.Darwin.appleclang
Resulta que estaba cometiendo un error estúpido. Estaba probando solc en una ventana de Terminal diferente y no en mi aplicación de nodo. Resulta que el módulo solc no estaba instalado en la aplicación del nodo (demasiadas horas con esto). Ahora está funcionando, muchas gracias por la ayuda y lo siento!

usando la versión 0.4.19 de solc, se puede acceder al objeto del contrato agregando un :prefijo al nombre del contrato,

const output = solc.compile(input.toString(), 1); const bytecode = '0x' + output.contracts[':helloWorld'].bytecode; const abi = JSON.parse(output.contracts[':helloWorld'].interface);