var input = "contract x { function g() {} }";
var output = solc.compile(input, 1); // 1 activates the optimiser
for (var contractName in output.contracts) {
// code and ABI that are needed by web3
console.log(contractName + ': ' + output.contracts[contractName].bytecode);
console.log(contractName + '; ' + JSON.parse( output.contracts[contractName].interface));
}
Todo está funcionando, pero cuando me pierdo en la última parte, no estoy seguro de qué valores ingresar en los primeros paréntesis y el //code and ABI that are needed by web3
. ¿Puedes ayudarme?
for (var contractName in output.contracts) {
// code and ABI that are needed by web3
console.log(contractName + ': ' + output.contracts[contractName].bytecode);
console.log(contractName + '; ' + JSON.parse( output.contracts[contractName].interface));
}
Si conecta su código fuente contract x { function g() {} }
en el panel izquierdo del Compilador en línea de Solidity , verá en el lado derecho un cuadro de texto Bytecode que contiene la representación binaria de su código fuente. Esto es lo output.contracts[contractName].bytecode
que contendrá, y del compilador en línea es:
606060405260478060106000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063e2179b8e146037576035565b005b604260048050506044565b005b5b56
También encontrará un cuadro de texto de interfaz en el lado derecho que contiene la interfaz binaria de la aplicación . Esto es lo output.contracts[contractName].interface
que contendrá, y del compilador en línea esto es:
[{"constant":false,"inputs":[],"name":"g","outputs":[],"type":"function"}]
La siguiente declaración asigna la fuente de su contrato a la variable input
:
var input = "contract x { function g() {} }";
La siguiente declaración llama al compilador de Solidity para compilar su código fuente y almacenar la información resultante en la variable output
:
var output = solc.compile(input, 1); // 1 activates the optimiser
Estaba buscando un poco más de información sobre Solidity y node.js, y encontré su ejemplo de chriseth/browser-solidity . Recuerde instalar su compilador Solidity para que lo use node.js usando la declaración:
npm install solc
Me tomó un poco de tiempo resolver esto y la respuesta de @BokkyPooBah ciertamente ayudó. Sin embargo, aquí hay un código que funciona para mí en este momento.
var contract = output.contracts[':' + myContractName];
var abi = JSON.parse(contract.interface);
var code = '0x' + contract.bytecode;
Tenga en cuenta que:
El nombre del contrato tendrá el prefijo :
en el contracts
hash (esto no importa si recorre los nombres de las propiedades como en el ejemplo, pero es una molestia cuando está interesado en un contrato en particular)
Lo interface
devuelto en el contrato compilado es una cadena JSON y no una matriz como lo requiere web3.
Al bytecode
campo le falta el 0x
prefijo hexadecimal que requiere web3.
Nota adicional: encontré que el compilador solc-js es mucho más lento que usar el compilador binario a través de web3 y un nodo en ejecución, por lo que no estoy seguro de recomendar su uso. De hecho, creo que recomendaría simplemente usar el solc
binario directamente.
ética
for (var contractName in output.contracts)
no hay nada que cambiar ahí. El comentario//
también es solo un comentario, no es necesario escribir ningún código allí.