¿A qué se refiere "código y ABI que necesita web3" en solc/nodejs?

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));
}
"no estoy seguro de qué valores ingresar en los primeros paréntesis" Hola, ¿cuál es la pregunta, qué paréntesis? Si de hablar 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í.

Respuestas (2)

Código fuente, código de bytes e interfaz binaria de la aplicación

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].bytecodeque 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].interfaceque contendrá, y del compilador en línea esto es:

[{"constant":false,"inputs":[],"name":"g","outputs":[],"type":"function"}]


Compilación de código fuente

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


Otra información

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 contractshash (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 interfacedevuelto en el contrato compilado es una cadena JSON y no una matriz como lo requiere web3.

  • Al bytecodecampo le falta el 0xprefijo 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 solcbinario directamente.