Я создаю 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);
}
}
}
Любая помощь будет высоко оценена, застрял на некоторое время :)
Попробуйте просто вырезать и вставить свой код в терминал 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.
0.4.13+commit.0fb4cb1a.Emscripten.clang
, которую вы используете?используя 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);
Алексей Барсук
Мидхун Мохан
макансадо