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));
}
Все работает, но когда я теряю последнюю часть, я не уверен, какие значения вводить в первые скобки и //code and ABI that are needed by web3
. Не могли бы вы помочь?
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));
}
Если вы вставите свой исходный код contract x { function g() {} }
в левую панель онлайн-компилятора Solidity , справа вы увидите текстовое поле Bytecode , содержащее двоичное представление вашего исходного кода. Это то, что output.contracts[contractName].bytecode
будет содержать, и из онлайн-компилятора это:
606060405260478060106000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063e2179b8e146037576035565b005b604260048050506044565b005b5b56
Вы также найдете текстовое поле Interface с правой стороны, содержащее двоичный интерфейс приложения . Это то, что output.contracts[contractName].interface
будет содержать, и из онлайн-компилятора это:
[{"constant":false,"inputs":[],"name":"g","outputs":[],"type":"function"}]
Следующий оператор назначает источник вашего контракта переменной input
:
var input = "contract x { function g() {} }";
Следующий оператор вызывает компилятор Solidity для компиляции исходного кода и сохранения полученной информации в переменной output
:
var output = solc.compile(input, 1); // 1 activates the optimiser
Я искал немного больше информации о Solidity и node.js и нашел ваш пример из chriseth/browser-solidity . Не забудьте установить компилятор Solidity для использования node.js с помощью инструкции:
npm install solc
Мне потребовалось некоторое время, чтобы понять это, и ответ @BokkyPooBah, безусловно, помог. Однако вот некоторый код, который работает для меня прямо сейчас.
var contract = output.contracts[':' + myContractName];
var abi = JSON.parse(contract.interface);
var code = '0x' + contract.bytecode;
Обратите внимание, что:
Имя контракта будет иметь префикс :
в contracts
хэше (это не имеет значения, если циклически перебирать имена свойств, как в примере, но это боль, когда вас интересует конкретный контракт)
В interface
скомпилированном контракте возвращается строка JSON, а не массив, как того требует web3.
В bytecode
поле отсутствует 0x
шестнадцатеричный префикс, необходимый для web3.
Дополнительное примечание: я обнаружил, что компилятор solc-js на несколько порядков медленнее, чем использование бинарного компилятора через web3 и работающий узел, поэтому я не уверен, что рекомендую его использовать. На самом деле я бы рекомендовал просто использовать solc
двоичный файл напрямую.
эт
for (var contractName in output.contracts)
том, что там нечего менять. Комментарий//
— это тоже просто комментарий, никакого кода там писать не нужно.