Программное развертывание смарт-контракта из web3/nodejs

Я создаю Dapp, где всякий раз, когда пользователь создает учетную запись, он автоматически создает адрес Ethereum для пользователя (сейчас я открываю личный модуль через RPC, но это просто для игр). Теперь я хочу автоматически развертывать контракт, когда пользователь создает учетную запись, в идеале, чтобы сделать этого пользователя единственным адресом, способным взаимодействовать с этим контрактом.

Следуя некоторым руководствам ( это ), я установил solc и изменил свой код на

var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
const solc = require('solc');
var fs = require('fs');
const input = fs.readFileSync('contracts/helloWorld.sol');
const output = solc.compile(input.toString(), 1);
const bytecode = output.contracts['helloWorld'].bytecode;
const abi = JSON.parse(output.contracts[':helloWorld'].interface);

Однако это выдает ошибку TypeError: Cannot read property ':helloWorld' of undefined. После некоторого расследования я понял, что вывод возвращается{ errors: [ ':1:1: Error: Expected import directive or contract definition.\npragma solidity ^0.4.11;\n^\n' ] }

Наконец, даже увидев этот ответ, я до сих пор не могу понять, почему. Я вставляю свой код контракта в Remix IDE, и он не выдает никаких ошибок.

Мой код контракта (тестовый, который я сейчас использую)

pragma solidity ^0.4.11;

contract helloWorld {
    /* Constructor */
    address owner;

    function helloWorld() {
        owner = msg.sender;    
    }

    function remove() {
        if (msg.sender == owner) {
            // Suicide and send funds to owner
            selfdestruct(owner);
        }
    }

    function greet() constant returns (bytes32, address) {
        if (msg.sender == owner) {
            bytes32 hello = "hello";
            return (hello, msg.sender);
        }
    }

}

Любая помощь будет высоко оценена, застрял на некоторое время :)

Проверить результаты компиляции на наличие ошибок if (output['errors']) { console.log(JSON.stringify(output['errors']))}
Нужно ли читать договор из файла? если контракт не меняется, вы можете избежать только компиляции.
Это было бы более удобно, потому что таким образом я мог бы иметь каталог контрактов как часть приложения node со всеми контрактами в нем. Но что бы вы предложили в качестве альтернативы?

Ответы (3)

Попробуйте просто вырезать и вставить свой код в терминал nodejs (обратите внимание на серьезные галочки), так что...

var source = `pragma solidity ^0.4.11;

contract helloWorld {
    /* Constructor */
    address owner;

    function helloWorld() {
        owner = msg.sender;    
    }

    function remove() {
        if (msg.sender == owner) {
            // Suicide and send funds to owner
            selfdestruct(owner);
        }
    }

    function greet() constant returns (bytes32, address) {
        if (msg.sender == owner) {
            bytes32 hello = "hello";
            return (hello, msg.sender);
        }
    }

}`

var output = solc.compile(source);

Импортные вещи для меня тоже все еще странные

У меня это не сработало, выдает ту же ошибку.

Я думаю, что это проблема кодировки. https://github.com/ethereum/solc-js/issues/90

Ваше сообщение об ошибке исходит из этой строки:\npragma solidity ^0.4.11;\n^\n'

Когда я запустил его в своей консоли, toString привел к \npragma solidity ^0.4.11;\n\n, поэтому я думаю, что \n^литерал вызывает ошибку solc.

Ошибка исходит из этой строки, но я не совсем понял, как ее решить из вашего ответа, не могли бы вы пояснить, пожалуйста?
Кроме того, я попытался использовать пакет npm utf8 для преобразования в UTF-8, но он также вернул ошибку.
Человек по ссылке, которую я отправил, исправил свою проблему, настроив кодировку в самом редакторе, так как импорт с кодировкой utf8 с использованием fs не работал. Я думаю, что проблема может быть с вашим редактором, потому что ваш код отлично сработал для меня.
Я использую Sublime 2 и пробовал «Файл»> «Сохранить с кодировкой»> «UTF-8», но все равно выдает ту же ошибку. Любые другие идеи? Спасибо за помощь.
Ответ @thefett сработал и для меня ... может быть, обновить solc?
Я в версии 0.4.13+commit.0fb4cb1a.Emscripten.clang, которую вы используете?
0.4.4+commit.4633f3de.Darwin.appleclang
Оказывается, я совершил глупую ошибку. Я тестировал solc в другом окне терминала, а не в своем приложении node. Оказывается, модуль solc не был установлен в приложении node (слишком много часов с этим). Теперь это работает, большое спасибо за помощь и извините за это!

используя solc версии 0.4.19, объект контракта может быть доступен путем добавления :префикса к имени контракта,

const output = solc.compile(input.toString(), 1); const bytecode = '0x' + output.contracts[':helloWorld'].bytecode; const abi = JSON.parse(output.contracts[':helloWorld'].interface);