Я запускаю локальный частный блокчейн Ethereum, используя:
geth --networkid 60098 --genesis CustomGenesis.json --nodiscover --maxpeers 0 --rpc --rpccorsdomain "http://localhost:3000" --datadir "./data" console
Он работает нормально. Я могу добыть несколько монет, чтобы заполнить счет coinbase и увидеть баланс в нем.
Моя проблема в том, что моя транзакция по развертыванию контракта не записывается в блокчейн. Я попробовал учебник Greeter из документации на GitHub wiki .
Соответствующие утверждения, которые я вывел из этой статьи:
var greeterSource = 'contract mortal { address owner; function mortal() { owner = msg.sender; } function kill() { if (msg.sender == owner) suicide(owner); } } contract greeter is mortal { string greeting; function greeter(string _greeting) public { greeting = _greeting; } function greet() constant returns (string) { return greeting; } }'
var greeterCompiled = web3.eth.compile.solidity(greeterSource)
Компилируется нормально, а затем я использовал эту команду для развертывания контракта:
var _greeting = "Hello World!"
var greeterContract = web3.eth.contract(greeterCompiled.greeter.info.abiDefinition);
var practice_acct = '0x0ff4e0dfc7f4b94b4ab6a83e922fe1ac9ac1a625'; //verified to have sufficient coins
var greeter = greeterContract.new(_greeting,{from: practice_acct, data: greeterCompiled.greeter.code, gas: 4000000}, function(e, contract){ if(!e) { if(!contract.address) { console.log("Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined..."); } else { console.log("Contract mined! Address: " + contract.address); console.log(contract); } } })
Затем я получаю это обратно после ввода моей парольной фразы и попытки вывести приветствие:
Разблокировать учетную запись 85b1a00f429811eed0f56ceff9ae19de047ab9fe Парольная фраза: неопределенный приветствующий {адрес: неопределенный}
Я даже пытался напрямую вставить код «Web3 deploy» из онлайн-компилятора Solidity, используя источник учебника. До сих пор не возвращается адрес.
Любые идеи, где моя проблема может быть?
geth
1.6.0 содержит критическое изменение, удаляющее доступ к компилятору Solidity изнутри geth
.
Обходной путь подробно описан в разделе Как скомпилировать контракты Solidity в geth с помощью v1.6.0 **НАРУШАЮЩЕЕ ИЗМЕНЕНИЕ**?
В Solidity 0.4.9 есть критическое изменение. Обходной путь подробно описан в разделе Невозможно определить GreeterContract в учебнике Greeter. Критическое изменение в Solidity 0.4.9! где вы должны использовать ссылку на переменную, например, greeterCompiled.<stdin>:greeter
с greeterCompiled["<stdin>:greeter"]
.
Вот пошаговое руководство по развертыванию этого контракта в блокчейне разработки.
Создать учетную запись Coinbase
user@Kumquat:~/ESE/Deploy$ geth --datadir "./data" --dev account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase:
Repeat Passphrase:
Address: {730b87e78b07fb2bf1b1e8b127b3353d08d72706}
Окно №1. Запуск экземпляра Geth Mining с разблокированной учетной записью
Этот экземпляр geth будет майнить блокчейн. Мы разблокируем учетную запись coinbase, чтобы этот экземпляр мог выполнять транзакции и запускать майнинг в одном потоке процессора. Введите пароль, созданный на предыдущем шаге, в Passphrase:
приглашении.
user@Kumquat:~/ESE/Deploy$ geth --datadir "./data" --dev --unlock 0 --mine --minerthreads 1
I0409 01:02:10.427513 32675 database.go:71] Alloted 16MB cache to data/chaindata
I0409 01:02:10.429602 32675 database.go:71] Alloted 16MB cache to data/dapp
I0409 01:02:10.431573 32675 backend.go:314] Protocol Versions: [63 62 61], Network Id: 1
I0409 01:02:10.431686 32675 backend.go:362] Blockchain DB Version: 3
I0409 01:02:10.432078 32675 blockchain.go:214] Last header: #0 [e5be9214…] TD=131072
I0409 01:02:10.432118 32675 blockchain.go:215] Last block: #0 [e5be9214…] TD=131072
I0409 01:02:10.432153 32675 blockchain.go:216] Fast block: #0 [e5be9214…] TD=131072
I0409 01:02:10.439890 32675 cmd.go:115] Starting Geth/v1.3.6/linux/go1.5.1
I0409 01:02:10.440240 32675 server.go:311] Starting Server
I0409 01:02:12.543810 32675 udp.go:212] Listening, enode://ef1eb6acad7a816bcc8debe0b078e0d8433225ca5d57622687aea13fee389e2ef064e7f01b5f8bf1d003d4722032597f2688917ca13133bd872fb90ba6872bce@[::]:30303
I0409 01:02:12.544021 32675 backend.go:526] Server started
Unlocking account 0 | Attempt 1/3
I0409 01:02:12.544151 32675 backend.go:584] Automatic pregeneration of ethash DAG ON (ethash dir: /home/user/.ethash)
I0409 01:02:12.544180 32675 server.go:552] Listening on [::]:30303
I0409 01:02:12.544217 32675 backend.go:591] checking DAG (ethash dir: /home/user/.ethash)
Passphrase:
Account '0' (0x730b87e78b07fb2bf1b1e8b127b3353d08d72706) unlocked.
I0409 01:02:18.255806 32675 miner.go:119] Starting mining operation (CPU=1 TOT=1)
I0409 01:02:18.255950 32675 ipc.go:112] IPC service started (data/geth.ipc)
I0409 01:02:18.256684 32675 worker.go:569] commit new work on block 1 with 0 txs & 0 uncles. Took 829.143µs
I0409 01:02:18.256853 32675 ethash.go:220] Generating DAG for epoch 0 (size 1073739904) (0000000000000000000000000000000000000000000000000000000000000000)
I0409 01:02:19.852771 32675 ethash.go:237] Done generating DAG for epoch 0, it took 1.595912996s
I0409 01:02:34.225955 32675 worker.go:348] 🔨 Mined block (#1 / bf23cf06). Wait 5 blocks for confirmation
I0409 01:02:34.226385 32675 worker.go:569] commit new work on block 2 with 0 txs & 0 uncles. Took 357.68µs
I0409 01:02:34.226734 32675 worker.go:569] commit new work on block 2 with 0 txs & 0 uncles. Took 286.72µs
Окно №2. Запуск второго экземпляра Geth, присоединяющегося к первому
РЕДАКТИРОВАТЬ 30/05/2016 - Обновлена команда, так как поведение пути IPC изменилось между geth
v1.3.6 и 1.4.5-stable .
Откройте второй терминал и запустите второй экземпляр geth, который подключается к первому экземпляру geth. Проверка баланса учетной записи coinbase (eth.accounts[0]) покажет увеличение баланса по мере того, как первый экземпляр geth продолжает майнинг.
user@Kumquat:~/ESE/Deploy$ geth --datadir "./data" --dev attach ipc:data/geth.ipc
instance: Geth/v1.4.5-stable/linux/go1.5.1
datadir: data
coinbase: 0x730b87e78b07fb2bf1b1e8b127b3353d08d72706
at block: 71 (Sat, 09 Apr 2016 01:07:42 AEST)
modules: admin:1.0 db:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 shh:1.0 txpool:1.0 web3:1.0
> web3.fromWei(eth.getBalance(eth.accounts[0]).toNumber(), "ether")
"360"
> web3.fromWei(eth.getBalance(eth.accounts[0]).toNumber(), "ether")
"390"
>
Скомпилируйте код в вопросе и отобразите скомпилированный код.
> var greeterSource = 'contract mortal { address owner; function mortal() { owner = msg.sender; } function kill() { if (msg.sender == owner) suicide(owner); } } contract greeter is mortal { string greeting; function greeter(string _greeting) public { greeting = _greeting; } function greet() constant returns (string) { return greeting; } }'
undefined
> var greeterCompiled = web3.eth.compile.solidity(greeterSource)
undefined
> greeterCompiled
{
greeter: {
code: "0x606060405260405161023e38038061023e8339810160405280510160008054600160a060020a031916331790558060016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10609f57805160ff19168380011785555b50608e9291505b8082111560cc57600081558301607d565b50505061016e806100d06000396000f35b828001600101855582156076579182015b82811115607657825182600050559160200191906001019060b0565b509056606060405260e060020a600035046341c0e1b58114610026578063cfae321714610068575b005b6100246000543373ffffffffffffffffffffffffffffffffffffffff908116911614156101375760005473ffffffffffffffffffffffffffffffffffffffff16ff5b6100c9600060609081526001805460a06020601f6002600019610100868816150201909416939093049283018190040281016040526080828152929190828280156101645780601f1061013957610100808354040283529160200191610164565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156101295780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b565b820191906000526020600020905b81548152906001019060200180831161014757829003601f168201915b505050505090509056",
info: {
abiDefinition: [{...}, {...}, {...}],
compilerOptions: "--bin --abi --userdoc --devdoc --add-std --optimize -o /tmp/solc163112865",
compilerVersion: "0.3.1",
developerDoc: {
methods: {}
},
language: "Solidity",
languageVersion: "0.3.1",
source: "contract mortal { address owner; function mortal() { owner = msg.sender; } function kill() { if (msg.sender == owner) suicide(owner); } } contract greeter is mortal { string greeting; function greeter(string _greeting) public { greeting = _greeting; } function greet() constant returns (string) { return greeting; } }",
userDoc: {
methods: {}
}
}
},
mortal: {
code: "0x606060405260008054600160a060020a03191633179055605c8060226000396000f3606060405260e060020a600035046341c0e1b58114601a575b005b60186000543373ffffffffffffffffffffffffffffffffffffffff90811691161415605a5760005473ffffffffffffffffffffffffffffffffffffffff16ff5b56",
info: {
abiDefinition: [{...}, {...}],
compilerOptions: "--bin --abi --userdoc --devdoc --add-std --optimize -o /tmp/solc163112865",
compilerVersion: "0.3.1",
developerDoc: {
methods: {}
},
language: "Solidity",
languageVersion: "0.3.1",
source: "contract mortal { address owner; function mortal() { owner = msg.sender; } function kill() { if (msg.sender == owner) suicide(owner); } } contract greeter is mortal { string greeting; function greeter(string _greeting) public { greeting = _greeting; } function greet() constant returns (string) { return greeting; } }",
userDoc: {
methods: {}
}
}
}
}
>
Отправьте транзакцию, чтобы вставить код контракта в блокчейн. Вы увидите, что контрактная транзакция была успешно добыта.
> var _greeting = "Hello World!"
undefined
> var greeterContract = web3.eth.contract(greeterCompiled.greeter.info.abiDefinition);
undefined
> var greeter = greeterContract.new(_greeting, {from: eth.accounts[0], data: greeterCompiled.greeter.code, gas: 4000000},
function(e, contract) {
if (!e) {
if (!contract.address) {
console.log("Contract transaction send: TransactionHash: " +
contract.transactionHash + " waiting to be mined...");
} else {
console.log("Contract mined! Address: " + contract.address);
console.log(contract);
}
}
})
Contract transaction send: TransactionHash: 0x90d201388971770036898a7a22ab252cb0bf3c556f988a7b87583315cdaf58bc waiting to be mined...
undefined
> Contract mined! Address: 0x083628160c1cf218d14f2f0998c7a8dc72aec180
[object Object]
Вы увидите в окне №1 следующее сообщение, показывающее, что транзакция включена в добытый блок №352. Ваш контракт приветствия теперь находится в блокчейне:
I0409 01:22:16.060791 32675 worker.go:447] 🔨 🔗 Mined 5 blocks back: block #345
I0409 01:22:16.061344 32675 worker.go:569] commit new work on block 351 with 0 txs & 0 uncles. Took 437.176µs
I0409 01:22:17.021781 32675 xeth.go:1026] Tx(0x90d201388971770036898a7a22ab252cb0bf3c556f988a7b87583315cdaf58bc) created: 0x083628160c1cf218d14f2f0998c7a8dc72aec180
I0409 01:22:25.759727 32675 worker.go:348] 🔨 Mined block (#351 / 6d35d834). Wait 5 blocks for confirmation
I0409 01:22:25.763740 32675 worker.go:569] commit new work on block 352 with 1 txs & 0 uncles. Took 3.937696ms
I0409 01:22:25.763820 32675 worker.go:447] 🔨 🔗 Mined 5 blocks back: block #346
I0409 01:22:25.764723 32675 worker.go:569] commit new work on block 352 with 1 txs & 0 uncles. Took 816.878µs
I0409 01:22:27.864884 32675 worker.go:348] 🔨 Mined block (#352 / f44a6a52). Wait 5 blocks for confirmation
I0409 01:22:27.865448 32675 worker.go:569] commit new work on block 353 with 0 txs & 0 uncles. Took 485.587µs
В окне №2 вызовите метод Greeter.greet(), который извлечет сообщение из блокчейна и отобразит его:
> greeter.greet();
"Hello World!"
>
Если вы выходите из своего окна #2 экземпляра geth и хотите повторно запустить контракт, вставленный на шагах выше, снова запустите экземпляр geth (версия подключения окна #2) и выполните следующие команды. Замените адрес в at(...)
функции адресом вашего контракта:
> var greeter2 = eth.contract([{constant:false,inputs:[],name:'kill',outputs:[],type:'function'},{constant:true,inputs:[],name:'greet',outputs:[{name:'',type:'string'}],type:'function'},{inputs:[{name:'_greeting',type:'string'}],type:'constructor'}]).at('0x083628160c1cf218d14f2f0998c7a8dc72aec180');
undefined
> greeter2
{
address: "0x083628160c1cf218d14f2f0998c7a8dc72aec180",
allEvents: function(),
greet: function(),
kill: function()
}
> greeter2.greet()
"Hello World!"
>
РЕДАКТИРОВАТЬ 30.05.2016
var greeterSource = 'contract mortal { address ow...
to greeter2.greet()
в окне № 1.Если вы не получаете Contract mined! Address: 0x083628160c1...
сообщение:
а. Убедитесь, что geth
майнинг успешно. Вы должны увидеть сообщение 🔨 Mined block (#...
в окне №1.
б. Если вы не получили 🔨 Mined block (#...
сообщение, попробуйте запустить команду miner.start(1)
. Это запустит майнинг ЦП в одном потоке.
в. Проверьте баланс своего счета web3.fromWei(eth.getBalance(eth.accounts[0]).toNumber(), "ether")
, так как вам понадобится немного эфиров для отправки транзакции.
д. Если ничего не помогает, попробуйте настроить debug.verbosity(4)
и посмотреть, сможете ли вы решить, что происходит. Вы также можете попробовать 5 или 6, но на вашем экране будет больше сообщений.
--testnet
, я никогда не получаю Contract transaction send
подтверждения, но у меня есть 4 эфира из крана. Это должна быть правильная валюта для тестовой сети, верно?web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")
. И из вашего вопроса ethereum.stackexchange.com/questions/5977/… у вас есть 4 эфира, так что это правильные эфиры.Я полностью следую этому руководству, но до сих пор не получил информацию "контракт заминирован! адрес: xxx". Я добавляю else{ console.log(e) в var Greeter = GreeterContract.new(_greeting, {from: eth.accounts[0], data: GreeterCompiled.greeter.code, gas: 4000000}, function(e, Contract) { if(!e) { if(!contract.address) { console.log("Транзакция по контракту отправлена: TransactionHash: " + contract.transactionHash + " ожидает майнинг..."); } else { console.log( "Контракт заминирован! Адрес: " + contract.address); console.log(contract); } } })
Я получил строку 1:419 неожиданный токен еще
Есть идеи. я действительно ценю
geth
версиях 1.3.6 и 1.4.5-stable. Единственное изменение здесь — в geth --datadir "./data" --dev attach ipc:data/geth.ipc
. Я также переформатировал код, чтобы найти контракт для более удобного чтения и копирования. Я перепроверил инструкцию дважды. Не могли бы вы повторить свои команды.
ПолночьМолния
Билл Лаприз
Билл Лаприз
Билл Лаприз