Worauf bezieht sich "Code und ABI, die von web3 benötigt werden" in 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));
}

Alles funktioniert, aber wenn ich den letzten Teil verliere, bin ich mir nicht sicher, welche Werte in die ersten Klammern und die //code and ABI that are needed by web3. Können Sie bitte helfen?

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));
}
"unsicher, welche Werte in die ersten Klammern eingegeben werden sollen" Hallo, was ist die Frage, welche Klammern? Wenn wir darüber reden, for (var contractName in output.contracts)gibt es da nichts zu ändern. Der Kommentar //ist auch nur ein Kommentar, es muss kein Code geschrieben werden.

Antworten (2)

Quellcode, Bytecode und Binärschnittstelle der Anwendung

Wenn Sie Ihren Quellcode contract x { function g() {} }in das linke Fenster des Solidity Online Compilers einfügen , sehen Sie auf der rechten Seite ein Bytecode -Textfeld, das die binäre Darstellung Ihres Quellcodes enthält. Dies ist, was output.contracts[contractName].bytecodeenthalten wird, und vom Online-Compiler ist:

606060405260478060106000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063e2179b8e146037576035565b005b604260048050506044565b005b5b56

Auf der rechten Seite finden Sie auch ein Interface - Textfeld, das das Application Binary Interface enthält . Dies ist, was output.contracts[contractName].interfaceenthalten wird, und vom Online-Compiler ist dies:

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


Zusammenstellung des Quellcodes

Die folgende Anweisung weist der Variablen Ihre Vertragsquelle zu input:

var input = "contract x { function g() {} }";

Die folgende Anweisung ruft den Solidity-Compiler auf, um Ihren Quellcode zu kompilieren und die resultierenden Informationen in der Variablen zu speichern output:

var output = solc.compile(input, 1); // 1 activates the optimiser


Andere Informationen

Ich habe nach weiteren Informationen zu Solidity und node.js gesucht und Ihr Beispiel von chriseth/browser-solidity gefunden . Denken Sie daran, Ihren Solidity-Compiler für die Verwendung durch node.js mit der folgenden Anweisung zu installieren:

npm install solc

Ich habe eine Weile gebraucht, um das herauszufinden, und die Antwort von @BokkyPooBah hat sicherlich geholfen. Hier ist jedoch ein Code, der gerade für mich funktioniert.

var contract = output.contracts[':' + myContractName];
var abi = JSON.parse(contract.interface);
var code = '0x' + contract.bytecode;

Beachten Sie, dass:

  • :Dem Vertragsnamen wird im Hash vorangestellt contracts(dies spielt keine Rolle, wenn Sie Eigenschaftsnamen wie im Beispiel durchlaufen, ist aber mühsam, wenn Sie an einem bestimmten Vertrag interessiert sind).

  • Der interfaceim kompilierten Vertrag zurückgegebene Wert ist ein JSON-String und kein Array, wie von web3 gefordert.

  • Dem bytecodeFeld fehlt das 0xHex-Präfix, das von web3 benötigt wird.

Bonushinweis: Ich fand den Solc-js-Compiler um Größenordnungen langsamer als die Verwendung des Binär-Compilers über web3 und einen laufenden Knoten, daher bin ich mir nicht sicher, ob ich ihn empfehlen würde. Tatsächlich denke ich, dass ich empfehlen würde, nur die solcBinärdatei direkt zu verwenden.