Развертывание смарт-контракта в тестовой сети Ethereum

Я следовал этому руководству 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.

достаточно ли у вас тестового эфира для развертывания контракта?
Думаю да, 5 эфиров. Этого достаточно?

Ответы (1)

Проблема в том, что ваша команда 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}");

Это разблокирует вашу учетную запись, а затем позволит оплатить транзакцию.

Большое спасибо. Теперь это работает!