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 :)
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.
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.
0.4.13+commit.0fb4cb1a.Emscripten.clang
¿cuál estás usando?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);
Alexei Barsuk
Midhun Mohán
mcansado