¿Cómo compilar contratos de Solidity con Geth v1.6?

Traté de compilar el siguiente contrato dentro de geth:

pragma solidity ^0.4.8;

contract Test {
    uint256 public value;

    function Test() {
        value = 123;    
    }
}

usando los siguientes comandos en la fuente aplanada:

> var testSource = "pragma solidity ^0.4.8; contract Test { uint256 public value; function Test() { value = 123; } }";
undefined
> var testCompiled = web3.eth.compile.solidity(testSource);
Error: The method eth_compileSolidity does not exist/is not available
    at web3.js:3104:20
    at web3.js:6191:15
    at web3.js:5004:36
    at <anonymous>:1:20

Como se describe en eth_compilers, eth_compileSolidity desaparecieron en go-ethereum 1.6.0 #3793 , la capacidad de compilar la fuente de Solidity se eliminó desde dentro geth.

¿Cómo puedo compilar mi código fuente de Solidity?

cómo compilar monedas del sistema de fichas guíame cualquiera
Consulte github.com/bokkypoobah/Tokens#seantest-token-on-ropsten para conocer el método de uso de Remix y MyEtherWallet para implementar contratos de token

Respuestas (6)

Alternativa 1: use Remix para compilar, luego copie y pegue para implementar

Use Remix de https://ethereum.github.io/browser-solidity :

ingrese la descripción de la imagen aquí

Copie las instrucciones de implementación de Web3 de la página de Remix:

var untitled_testContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"value","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"}]);
var untitled_test = untitled_testContract.new(
   {
     from: web3.eth.accounts[0], 
     data: '0x60606040523415600b57fe5b5b607b6000819055505b5b608f806100246000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514603a575bfe5b3415604157fe5b6047605d565b6040518082815260200191505060405180910390f35b600054815600a165627a7a72305820a4fac284b98d43538f802082b0db8c67ddd6d72df4e8d9fbccb4cec0e52ea0df0029', 
     gas: '4700000'
   }, function (e, contract){
    console.log(e, contract);
    if (typeof contract.address !== 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
 })

Y pégalo en el geth consolecon una cuenta desbloqueada:

> personal.unlockAccount(eth.accounts[0], "{top secret password}");
true
> var untitled_testContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"value","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"}]);
"0xe22dc29e3e05d3206d9636ae7cba87a2827e7b3ef28c6e8e6d2ad49a14ba3ce9"
var untitled_test = untitled_testContract.new(
   {
     from: web3.eth.accounts[0],
     data: '0x60606040523415600b57fe5b5b607b6000819055505b5b608f806100246000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514603a575bfe5b3415604157fe5b6047605d565b6040518082815260200191505060405180910390f35b600054815600a165627a7a72305820a4fac284b98d43538f802082b0db8c67ddd6d72df4e8d9fbccb4cec0e52ea0df0029',
     gas: '4700000'
   }, function (e, contract){
    console.log(e, contract);
    if (typeof contract.address !== 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
 })



Alternativa 2: use Solidity Compiler (Linux y OS/X, tal vez Windows con Cygwin)

$ more Test.sol 
pragma solidity ^0.4.8;

contract Test {
    uint256 public value;

    function Test() {
        value = 123;    
    }
}

Compile Test.sol en formato .json, asigne los datos a una variable de JavaScript y envíe el resultado a un archivo:

$ echo "var testOutput=`solc --optimize --combined-json abi,bin,interface Test.sol`" > test.js
$ cat test.js
var testOutput={"contracts":{"Test.sol:Test":{"abi":"[{\"constant\":true,\"inputs\":[],\"name\":\"value\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"type\":\"constructor\"}]","bin":"60606040523415600b57fe5b5b607b6000819055505b5b608f806100246000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514603a575bfe5b3415604157fe5b6047605d565b6040518082815260200191505060405180910390f35b600054815600a165627a7a72305820d0e71d151634ac6ae7626860a17881104022e5cd6d3a088eb8f941d9aa8e3bd20029"}},"version":"0.4.9+commit.364da425.Darwin.appleclang"}

En geth, cargue el contenido de test.js:

$ geth console
...
> loadScript("test.js")
true
> testOutput
{
  contracts: {
    Test.sol:Test: {
      abi: "[{\"constant\":true,\"inputs\":[],\"name\":\"value\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"type\":\"constructor\"}]",
      bin: "60606040523415600b57fe5b5b607b6000819055505b5b608f806100246000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514603a575bfe5b3415604157fe5b6047605d565b6040518082815260200191505060405180910390f35b600054815600a165627a7a72305820d0e71d151634ac6ae7626860a17881104022e5cd6d3a088eb8f941d9aa8e3bd20029"
    }
  },
  version: "0.4.9+commit.364da425.Darwin.appleclang"
}

> testOutput.contracts
{
  abi: "[{\"constant\":true,\"inputs\":[],\"name\":\"value\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"type\":\"constructor\"}]",
...
> var testContract = web3.eth.contract(JSON.parse(testOutput.contracts["Test.sol:Test"].abi));
undefined
> personal.unlockAccount(eth.accounts[0], "{top secret password}");
true
> var test = testContract.new({ from: eth.accounts[0], data: "0x" + testOutput.contracts["Test.sol:Test"].bin, gas: 4700000},
  function (e, contract) {
    console.log(e, contract);
    if (typeof contract.address !== 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
  }
);
...
Si sigo sus instrucciones de la Alternativa 1, aparece el error: "err: Error: argumento no válido 0: hexadecimal no válido". Descubrí que el código de bytes (bin) causa este error. También probé la Alternativa 2 pero obtengo el mismo error.
La alternativa 2 funcionó y fue la única instrucción de trabajo que pude encontrar hasta ahora. ¡Muchas gracias!
Pude compilar el contrato con ethereum.github.io/browser-solidity pero cuando obtuve el código del campo WEB3DEPLOY y lo pegué en myetherwallet.com/#contracts El contrato de implementación archivó un error (bordes rojos)
En una versión más nueva de remix, haga clic en el botón "Detalles" de la sección "Compilar" y busque la WEB3DEPLOYsección

Me he encontrado con el mismo problema recientemente. Hay una variedad de soluciones, pero este es el método que he empleado. Este no es necesariamente el mejor enfoque.

Para generar código de bytes:

> solc --bin soliditySource.sol

Para generar ABI:

> solc --abi soliditySource.sol

Luego, con su recién generado bytecodey abi, en geth 1.6:

 var abi = <abi from solc>;
 var myContract = eth.contract(abi); 
 var bytecode = '0x' + <bytecode from solc>;
 var txDeploy = {from:eth.coinbase, data: bytecode, gas: 1000000}; 
 var myContractPartialInstance = myContract.new(txDeploy); 

 // Mine block containing transaction...

 var myContractInstance = myContract.at(myContractPartialInstance.address);
El abi debe ser un objeto JSON, así que conviértalo con JSON.parse. Además, es posible que la cuenta deba desbloquearse primero con, por ejemplo. personal.unlockAccount(eth.accounts[0]).

Tal vez considere descargar el trufflemarco en su lugar. Con el framework truffle, puedo compilar pero también almacenar mis archivos fácilmente (lo hace por mí).

Una vez que haya descargado trufflecon el comando

npm i -g truffle

puede compilar fácilmente usando el comando truffle compile.

Después de golpearme la cabeza con documentos desactualizados durante unos días, hice una versión súper simple aquí que podría ayudar: https://alanbuxton.wordpress.com/2017/07/19/first-steps-with-ethereum -redes-privadas-y-contratos-inteligentes-en-ubuntu-16-04/

He publicado su enlace en reddit.com/r/ethdev/comments/6ouis7/…
Gracias @BokkyPooBah, espero que ayude a la gente. Los documentos oficiales son bastante terribles.

Debido a que geth desaprobó la interfaz del compilador de línea de comandos después de la versión 1.6, estuve desconcertado durante mucho tiempo. Escribí un tutorial simple para describir cómo compilar e implementar un contrato después de geth1.6. Espero que este tutorial te ayude. Contrato de depoly en la cadena privada

Construyendo un contrato inteligente usando la línea de comando https://www.ethereum.org/greeter

Hola y bienvenido a Ethereum StackExchange. Por favor, no publique preguntas como respuestas a otras preguntas. Si necesita ayuda con un problema, publique una nueva pregunta y esperamos que alguien la responda.