Как скомпилировать контракты Solidity с Geth v1.6?

Я попытался скомпилировать следующий контракт внутри geth:

pragma solidity ^0.4.8;

contract Test {
    uint256 public value;

    function Test() {
        value = 123;    
    }
}

используя следующие команды для сглаженного исходного кода:

> var testSource = "pragma solidity ^0.4.8; contract Test { uint256 public value; function Test() { value = 123; } }";
undefined
> var testCompiled = web3.eth.compile.solidity(testSource);
Error: The method eth_compileSolidity does not exist/is not available
    at web3.js:3104:20
    at web3.js:6191:15
    at web3.js:5004:36
    at <anonymous>:1:20

Как описано в eth_compilers, eth_compileSolidity исчезли в go-ethereum 1.6.0 #3793 , возможность компилировать исходный код Solidity была удалена изнутри geth.

Как мне скомпилировать исходный код Solidity?

Как собрать монеты системы токенов, помогите мне
См. github.com/bokkypoobah/Tokens#seantest-token-on-ropsten , чтобы узнать, как использовать Remix и MyEtherWallet для развертывания токен-контрактов.

Ответы (6)

Альтернатива 1. Используйте Remix для компиляции, затем скопируйте и вставьте для развертывания

Используйте ремикс с https://ethereum.github.io/browser-solidity :

введите описание изображения здесь

Скопируйте инструкции по развертыванию Web3 со страницы Remix:

var untitled_testContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"value","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"}]);
var untitled_test = untitled_testContract.new(
   {
     from: web3.eth.accounts[0], 
     data: '0x60606040523415600b57fe5b5b607b6000819055505b5b608f806100246000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514603a575bfe5b3415604157fe5b6047605d565b6040518082815260200191505060405180910390f35b600054815600a165627a7a72305820a4fac284b98d43538f802082b0db8c67ddd6d72df4e8d9fbccb4cec0e52ea0df0029', 
     gas: '4700000'
   }, function (e, contract){
    console.log(e, contract);
    if (typeof contract.address !== 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
 })

И вставьте его в geth consoleс разблокированной учетной записью:

> personal.unlockAccount(eth.accounts[0], "{top secret password}");
true
> var untitled_testContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"value","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"}]);
"0xe22dc29e3e05d3206d9636ae7cba87a2827e7b3ef28c6e8e6d2ad49a14ba3ce9"
var untitled_test = untitled_testContract.new(
   {
     from: web3.eth.accounts[0],
     data: '0x60606040523415600b57fe5b5b607b6000819055505b5b608f806100246000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514603a575bfe5b3415604157fe5b6047605d565b6040518082815260200191505060405180910390f35b600054815600a165627a7a72305820a4fac284b98d43538f802082b0db8c67ddd6d72df4e8d9fbccb4cec0e52ea0df0029',
     gas: '4700000'
   }, function (e, contract){
    console.log(e, contract);
    if (typeof contract.address !== 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
 })



Альтернатива 2 — использовать компилятор Solidity (Linux и OS/X, возможно, Windows с Cygwin)

$ more Test.sol 
pragma solidity ^0.4.8;

contract Test {
    uint256 public value;

    function Test() {
        value = 123;    
    }
}

Скомпилируйте Test.sol в формате .json, назначьте данные переменной JavaScript и отправьте вывод в файл:

$ echo "var testOutput=`solc --optimize --combined-json abi,bin,interface Test.sol`" > test.js
$ cat test.js
var testOutput={"contracts":{"Test.sol:Test":{"abi":"[{\"constant\":true,\"inputs\":[],\"name\":\"value\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"type\":\"constructor\"}]","bin":"60606040523415600b57fe5b5b607b6000819055505b5b608f806100246000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514603a575bfe5b3415604157fe5b6047605d565b6040518082815260200191505060405180910390f35b600054815600a165627a7a72305820d0e71d151634ac6ae7626860a17881104022e5cd6d3a088eb8f941d9aa8e3bd20029"}},"version":"0.4.9+commit.364da425.Darwin.appleclang"}

В gethзагрузите содержимое test.js:

$ geth console
...
> loadScript("test.js")
true
> testOutput
{
  contracts: {
    Test.sol:Test: {
      abi: "[{\"constant\":true,\"inputs\":[],\"name\":\"value\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"type\":\"constructor\"}]",
      bin: "60606040523415600b57fe5b5b607b6000819055505b5b608f806100246000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514603a575bfe5b3415604157fe5b6047605d565b6040518082815260200191505060405180910390f35b600054815600a165627a7a72305820d0e71d151634ac6ae7626860a17881104022e5cd6d3a088eb8f941d9aa8e3bd20029"
    }
  },
  version: "0.4.9+commit.364da425.Darwin.appleclang"
}

> testOutput.contracts
{
  abi: "[{\"constant\":true,\"inputs\":[],\"name\":\"value\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"type\":\"constructor\"}]",
...
> var testContract = web3.eth.contract(JSON.parse(testOutput.contracts["Test.sol:Test"].abi));
undefined
> personal.unlockAccount(eth.accounts[0], "{top secret password}");
true
> var test = testContract.new({ from: eth.accounts[0], data: "0x" + testOutput.contracts["Test.sol:Test"].bin, gas: 4700000},
  function (e, contract) {
    console.log(e, contract);
    if (typeof contract.address !== 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
  }
);
...
Если я следую вашим инструкциям из Альтернативы 1, я получаю сообщение об ошибке: «ошибка: ошибка: недопустимый аргумент 0: недопустимый шестнадцатеричный код». Я понял, что байт-код (bin) вызывает эту ошибку. Я также пробовал Альтернативу 2, но получаю ту же ошибку.
Альтернатива 2 работала и была единственной рабочей инструкцией, которую я смог найти до сих пор. Большое спасибо!
Мне удалось скомпилировать контракт с помощью ethereum.github.io/browser-solidity, но когда я получил код из поля WEB3DEPLOY и вставил его в файл myetherwallet.com/#contracts Deploy, он выдал ошибку (красные рамки)
В более новой версии ремикса нажмите кнопку «Подробнее» в разделе «Компилировать» и найдите WEB3DEPLOYраздел

Недавно я столкнулся с той же проблемой. Есть множество обходных путей, но вот метод, который я использовал. Это не обязательно лучший подход.

Чтобы сгенерировать байт-код:

> solc --bin soliditySource.sol

Чтобы сгенерировать ABI:

> solc --abi soliditySource.sol

Затем с вашим вновь сгенерированным bytecodeи abiв geth 1.6:

 var abi = <abi from solc>;
 var myContract = eth.contract(abi); 
 var bytecode = '0x' + <bytecode from solc>;
 var txDeploy = {from:eth.coinbase, data: bytecode, gas: 1000000}; 
 var myContractPartialInstance = myContract.new(txDeploy); 

 // Mine block containing transaction...

 var myContractInstance = myContract.at(myContractPartialInstance.address);
Abi должен быть объектом JSON, поэтому преобразуйте его с помощью JSON.parse. Также может потребоваться сначала разблокировать учетную запись, например. personal.unlockAccount(eth.accounts[0]).

Возможно, вместо этого вы рассмотрите возможность загрузки truffleфреймворка. С трюфельным фреймворком я могу не только компилировать, но и легко хранить свои файлы (он делает это за меня).

После того, как вы загрузили truffleс помощью команды

npm i -g truffle

вы можете легко скомпилировать с помощью команды truffle compile.

После нескольких дней биения головой об устаревших документах я сделал здесь очень простую версию, которая может помочь: https://alanbuxton.wordpress.com/2017/07/19/first-steps-with-ethereum . -частные-сети-и-смарт-контракты-на-ubuntu-16-04/

Я разместил вашу ссылку на reddit.com/r/ethdev/comments/6ouis7/…
Спасибо @BokkyPooBah, надеюсь, это поможет людям. Официальные документы довольно ужасны.

Поскольку geth отказался от интерфейса компилятора командной строки после версии 1.6, я долгое время был озадачен. Я написал простое руководство, описывающее, как скомпилировать и развернуть контракт после версии geth1.6. Надеюсь, этот урок поможет вам. Контракт Depoly в частной сети

Создание смарт-контракта с помощью командной строки https://www.ethereum.org/greeter

Привет и добро пожаловать в Ethereum StackExchange. Пожалуйста, не публикуйте вопросы как ответы на другие вопросы. Если вам нужна помощь в решении проблемы, задайте новый вопрос, и мы надеемся, что кто-то на него ответит.