web3.eth.compile.solidity no compila

Estoy tratando de implementar un contrato a través de mi front-end a través de la API web3. Sin embargo, nada parece compilarse y no hay una dirección de contrato o ABI para interactuar con el contrato implementado (si está implementado) y recuperar información (es decir, la cadena "petros"). También probé el código fuente como una cadena de una línea. A continuación se muestra mi código:

  var source = "" + 
    "contract demo {\n" +
    "   string public name = 'Petros';\n" +
    "   function changeName(string _newName){\n" +
    "     name = _newName;\n" +
    "   }\n" +
    "}\n"; 

var compiled = web3.eth.compile.solidity(source,
    function(err,res){ //necessary callback function
      console.log(JSON.stringify(res));
});
Ahora web3.eth.compile.solidity está en desuso, ¡no funcionará!
Funciona hasta go-ethereum v1.5.9. Para versiones más nuevas, debe compilar el código de solidez fuera de geth

Respuestas (4)

Primero verifique si ha instalado Solc: solc --versionluego, si su código no funciona, intente usar el siguiente en su lugar:

 var source = 'contract demo {string public name = "Petros"; function changeName(string _newName){name = _newName; } }'; 

  var compiled = web3.eth.compile.solidity(source);

   console.log(compiled);
Gracias por tu aporte, tengo solc instalado. El código que proporcionó no se ejecutará ya que no hay una función de devolución de llamada en web3.eth.compile.solidity(). El objeto MetaMask Web3 no admite métodos sincrónicos. Sin embargo, en lugar de eso, mi código var compiled = web3.eth.compile.solidity(source,function(err,res){console.log(res)}); compila correctamente a pesar de que no obtengo un retorno de la consola. log (compilado); dominio. Tal vez estoy en el camino equivocado, pero quiero implementar un contrato y poder interactuar con él. por ejemplo recuperar la cadena "petros"
Edité la pregunta para hacerme más claro y correcto.

Ahora el web3.eth.compile.solidityha sido eliminado. No funciona. Hay un error si lo llamas.

Error: The method eth_compileSolidity does not exist/is not available

Por favor revise la página. https://github.com/ethereum/web3.js/issues/1000 Y puede usar Remix, o solcjs en nodejs, o solc binary. Consulte el documento, http://solidity.readthedocs.io/en/develop/installing-solidity.html

RESPONDER:

var Web3 = require('web3');
var web3 = new Web3();
web3.setProvider(new web3.providers.HttpProvider("http://localhost:8545"));
var source = 'contract demo {string public name = "Petros"; function changeName(string _newName){name = _newName; } }'; 
var compiled = web3.eth.compile.solidity(source);
var abi = compiled['<stdin>:demo'].info.abiDefinition;
¿Cuál fue el problema y cómo lo solucionó su respuesta? ¡Gracias!
@Laxmana, no recuerdo exactamente cuál era el problema desde hace muchos meses y terminé ese proyecto, pero creo que no estaba conectado a un nodo Ethereum, por lo que no pudo implementar el contrato. así que al configurar el proveedor web3 funcionó. Tenga en cuenta que en la versión más nueva de geth, el compilador solc no está incluido en geth, por lo que probablemente este código no funcione de todos modos.

Dado que web3.eth.compile.solidity ha quedado obsoleto, necesitamos implementar nuestros contratos inteligentes fuera de geth. Esto se puede lograr mediante el uso de solc.

Desplegando contrato usando solc:

npm i solc

Cree un archivo para implementar: deployment_Hello_World.js

const fs = require('fs');
const solc = require('solc');
const Web3 = require('web3');
const web3 = new Web3(new Web3.providers.HttpProvider(http://localhost:8545));
const input = fs.readFileSync('/path/to/HelloWorld.sol');
const output = solc.compile(input.toString(), 1);
const bytecode = output.contracts[':HelloWorld'].bytecode;
const abi = JSON.parse(output.contracts[':HelloWorld'].interface);
const gasEstimate = web3.eth.estimateGas({ data: '0x' + bytecode });
const contract = web3.eth.contract(abi);

contract.new({ data: '0x' + bytecode, from: web3.eth.coinbase, gas: gasEstimate }, (err, res) => {
    if (err) {
        console.log(err);
        return;
    } else {
        if (res.address) {
            console.log('Deployed contract address: ' + res.address);
        }
    }
});