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));
}
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].bytecode
enthalten 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].interface
enthalten wird, und vom Online-Compiler ist dies:
[{"constant":false,"inputs":[],"name":"g","outputs":[],"type":"function"}]
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
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 interface
im kompilierten Vertrag zurückgegebene Wert ist ein JSON-String und kein Array, wie von web3 gefordert.
Dem bytecode
Feld fehlt das 0x
Hex-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 solc
Binärdatei direkt zu verwenden.
eth
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.