Я попытался скомпилировать следующий контракт внутри 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?
Используйте ремикс с 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);
}
})
$ 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);
}
}
);
...
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);
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/
Поскольку geth отказался от интерфейса компилятора командной строки после версии 1.6, я долгое время был озадачен. Я написал простое руководство, описывающее, как скомпилировать и развернуть контракт после версии geth1.6. Надеюсь, этот урок поможет вам. Контракт Depoly в частной сети
Создание смарт-контракта с помощью командной строки https://www.ethereum.org/greeter
Сунил Кумар
конфиденциальностьisahumanright.eth