Я следовал этому руководству https://ethereum.stackexchange.com/a/2787/2426 (или эквивалентно https://www.ethereum.org/greeter ) при попытке развернуть простой смарт-контракт в тестовой сети Ethereum. Я использую geth CLI в тестовой сети. Все работает, кроме последнего шага — загрузки кода в блокчейн. Вот что я сделал:
GETH SECOND INSTANCE:
geth --testnet --unlock 0 attach ipc:.ethereum/testnet/geth.ipc
instance: Geth/v1.4.10-stable-5f55d95a/linux/go1.6.2
coinbase: 0x47978a69f410d0f61850c92acdb0d4c464d70937
at block: 1697809 (Mon, 26 Sep 2016 07:10:20 UTC)
datadir: .ethereum/testnet
modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
> web3.fromWei(eth.getBalance(eth.accounts[0]).toNumber(), "ether")
"5.024681313417504"
КОМПИЛЯЦИЯ:
> 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 = "Good Morning, Smart Contract!"
> var greeterContract = web3.eth.contract(greeterCompiled.greeter.info.abiDefinition);
> 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); } } })
> debug.verbosity(4)
При изучении приветствующего это вывод:
> greeter
{
abi: [{
constant: false,
inputs: [],
name: "kill",
outputs: [],
payable: false,
type: "function"
}, {
constant: true,
inputs: [],
name: "greet",
outputs: [{...}],
payable: false,
type: "function"
}, {
inputs: [{...}],
type: "constructor"
}],
address: undefined,
transactionHash: null
}
> greeter.greet();
TypeError: 'greet' is not a function
at <anonymous>:1:1
Я жду минуту и не получил такого сообщения:
Contract mined! address: 0x...
Итак, контракт вроде бы правильно составлен, но я не могу получить ни адрес, ни txHash после загрузки в блокчейн. Возможно, он не был загружен или добыт. Как я могу понять это? Я пропустил что-то важное?
Изменить: сразу после попытки развернуть журнал сообщает о множестве сообщений, подобных этому:
I0926 10:31:13.097817 core/state/state_object.go:160] 47978a69f410d0f61850c92acdb0d4c464d70937: #1048576 631783523629846744286 (+ 420000000000000)
Будучи 0x47978a69f410d0f61850c92acdb0d4c464d70937, адрес coinbase узла geth.
Проблема в том, что ваша команда geth --testnet --unlock 0 attach ipc:.ethereum/testnet/geth.ipc
на самом деле не разблокирует учетную запись. Эта команда просто подключает консоль к работающему geth
экземпляру.
Если вы использовали geth --testnet --unlock 0 console
вместо этого, вам будет предложено разблокировать свою учетную запись со следующим сообщением:
Unlocking account 0 | Attempt 1/3
Passphrase:
I0926 21:48:25.702979 cmd/geth/accountcmd.go:189] Unlocked account 3b44...a400
Если вы хотите использовать эту geth ... attach
команду, выполните следующую команду непосредственно перед выполнением ваших транзакций:
personal.unlockAccount(eth.accounts[0], "{your password}");
Это разблокирует вашу учетную запись, а затем позволит оплатить транзакцию.
4gn3s
Хуан Игнасио Перес Сакристан