Что означает «код и ABI, необходимые для web3» в 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));
}

Все работает, но когда я теряю последнюю часть, я не уверен, какие значения вводить в первые скобки и //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));
}
«не уверен, какие значения вводить в первых скобках» Привет, в чем вопрос, какие скобки? Если говорить о for (var contractName in output.contracts)том, что там нечего менять. Комментарий //— это тоже просто комментарий, никакого кода там писать не нужно.

Ответы (2)

Исходный код, байт-код и двоичный интерфейс приложения

Если вы вставите свой исходный код 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двоичный файл напрямую.