Развертывание контракта Greeter через интерфейс командной строки geth не регистрируется в моем частном блокчейне.

Я запускаю локальный частный блокчейн 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) команда geth attach из другого окна не принимается. Я думаю, что это отличается от основной сети. Как запустить команды развертывания контракта, пока майнер занимается майнингом?
теперь с помощью geth --dev и упомянутая выше проблема с консолью решена. Однако до сих пор не получил ответа с адресом из блокчейна. Даже переход по этой отличной ссылке дал те же результаты: ethereum.stackexchange.com/questions/566/…

Ответы (2)

Обновление от 23 апреля 2017 г.

geth1.6.0 содержит критическое изменение, удаляющее доступ к компилятору Solidity изнутри geth.

Обходной путь подробно описан в разделе Как скомпилировать контракты Solidity в geth с помощью v1.6.0 **НАРУШАЮЩЕЕ ИЗМЕНЕНИЕ**?



Обновление от 04 февраля 2017 г.

В 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 изменилось между gethv1.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

Если вы не получаете указанных выше результатов

  1. Не беспокойтесь о настройке окна № 2
  2. Запустите все команды из разделов окна № 2 выше, начиная с var greeterSource = 'contract mortal { address ow...to greeter2.greet()в окне № 1.
  3. Если вы не получаете 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, но на вашем экране будет больше сообщений.

Полностью сработало! Спасибо. Я думаю, что моя проблема заключалась в том, как я настроил свои аргументы для строк geth двух окон.
когда я запускаю строку "greeterContract.new...", я получаю сообщение об ошибке: учетная запись заблокирована. Есть идеи как разблокировать аккаунт?
В --testnet, я никогда не получаю Contract transaction sendподтверждения, но у меня есть 4 эфира из крана. Это должна быть правильная валюта для тестовой сети, верно?
Это должна быть правильная валюта для тестовой сети, если вы видите 4 эфира в своей учетной записи Testnet, используя web3.fromWei(eth.getBalance(eth.accounts[0]), "ether"). И из вашего вопроса ethereum.stackexchange.com/questions/5977/… у вас есть 4 эфира, так что это правильные эфиры.
Это действительно разница в том, в каком порядке находятся аргументы командной строки...
Обратите внимание, что при запуске geth-сервера в окне № 1 запрос парольной фразы может потеряться в выходных данных. Если кажется, что запуск сервера зависает, скорее всего, он просто ждет вашей парольной фразы. Как только я понял это, это сработало отлично.

Я полностью следую этому руководству, но до сих пор не получил информацию "контракт заминирован! адрес: 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 неожиданный токен еще

Есть идеи. я действительно ценю

Я немного обновил пример, чтобы учесть разницу в поведении IPC в gethверсиях 1.3.6 и 1.4.5-stable. Единственное изменение здесь — в geth --datadir "./data" --dev attach ipc:data/geth.ipc. Я также переформатировал код, чтобы найти контракт для более удобного чтения и копирования. Я перепроверил инструкцию дважды. Не могли бы вы повторить свои команды.
да, нужно добавить "geth.ipc". Я добавил его, но я все еще не получаю хэш транзакции. Это странно
Я добавил некоторые примечания по устранению неполадок выше.
Спасибо за ваш быстрый ответ. @BokkyPooBah. Я исправил свою проблему. все правильно вы предоставили. Моя проблема в том, что я не разблокировал свой аккаунт.