Несколько локальных узлов
Два производящих nodeos на одном хосте (single host, multi-node testnet): отдельные порты HTTP/P2P и каталоги config/data, связь через cleos и при необходимости keosd. Схема ниже.

Перед началом¶
- Установка COOPOS; в
PATH—nodeos,cleos,keosd. - Опции nodeos — по необходимости.
Шаги¶
Откройте четыре окна терминала.
- Запустить менеджер кошельков
- Создать кошелёк по умолчанию
- Импортировать ключ COOPOS
- Запустить первый производящий узел
- Запустить второй производящий узел
- Получить информацию об узлах
1. Менеджер кошельков¶
В первом терминале запустите keosd:
При успехе в начале вывода будут строки вроде:
2493323ms thread-0 wallet_plugin.cpp:39 plugin_initialize ] initializing wallet plugin
2493323ms thread-0 http_plugin.cpp:141 plugin_initialize ] host: 127.0.0.1 port: 8899
2493323ms thread-0 http_plugin.cpp:144 plugin_initialize ] configured http to listen on 127.0.0.1:8899
2493323ms thread-0 http_plugin.cpp:213 plugin_startup ] start listening for http requests
2493324ms thread-0 wallet_api_plugin.cpp:70 plugin_startup ] starting wallet_api_plugin
В логе должна появиться строка про 127.0.0.1:8899; иначе смотрите ошибку и перезапустите keosd. Окно с keosd не закрывайте — переходите ко второму терминалу.
2. Кошелёк по умолчанию¶
Во втором терминале создайте кошелёк через cleos:
cleos сообщит о создании кошелька default и выдаст пароль — сохраните его. Пример вывода:
Creating wallet: default
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5JsmfYz2wrdUEotTzBamUCAunAA8TeRZGT57Ce6PkvM12tre8Sm"
В окне keosd появятся служебные сообщения. Дальнейшие команды cleos выполняйте во втором терминале.
3. Ключ COOPOS¶
Приватная тестовая цепочка создаётся с типовым начальным ключом — его нужно импортировать в кошелёк.
cleos --wallet-url http://127.0.0.1:8899 wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
4. Первый производящий узел¶
В третьем терминале:
nodeos --enable-stale-production --producer-name eosio --plugin eosio::chain_api_plugin --plugin eosio::net_api_plugin
Получается специальный «bios»-продюсер. При успехе в логе nodeos виден выпуск блоков.
5. Второй производящий узел¶
Загрузите на eosio контракт eosio.bios (ресурсы аккаунтов и привилегированные вызовы). Во втором терминале:
Создайте аккаунт-продюсер inita: сгенерируйте ключи и импортируйте закрытый в кошелёк.
Внимание
Дальнейшие команды используют пары ключей из примера ниже. Чтобы копировать команды без правок, возьмите именно эти ключи, а не результат своей команды cleos create key. Если используете свои ключи — подставьте их во все следующие команды.
Типичный вывод cleos create key:
Private key: 5JgbL2ZnoEAhTudReWH1RnMuQS6DBeLZt4ucV6t8aymVEuYg7sr
Public key: EOS6hMjoWRF2L8x9YpeqtUEcsDKAyxSuM1APicxgRU1E3oyV5sDEg
Импорт закрытого ключа:
cleos --wallet-url http://127.0.0.1:8899 wallet import 5JgbL2ZnoEAhTudReWH1RnMuQS6DBeLZt4ucV6t8aymVEuYg7sr
Создание аккаунта inita: для create account нужны два открытых ключа — owner и active; здесь один и тот же ключ используется дважды.
cleos --wallet-url http://127.0.0.1:8899 create account eosio inita EOS6hMjoWRF2L8x9YpeqtUEcsDKAyxSuM1APicxgRU1E3oyV5sDEg EOS6hMjoWRF2L8x9YpeqtUEcsDKAyxSuM1APicxgRU1E3oyV5sDEg
executed transaction: d1ea511977803d2d88f46deb554f5b6cce355b9cc3174bec0da45fc16fe9d5f3 352 bytes 102400 cycles
# eosio <= eosio::newaccount {"creator":"eosio","name":"inita","owner":{"threshold":1,"keys":[{"key":"EOS6hMjoWRF2L8x9YpeqtUEcsDKA...
Аккаунт готов; в других руководствах на него вешают контракты — здесь он станет продюсером блоков.
В четвёртом терминале запустите второй экземпляр nodeos. Командная строка длиннее, чтобы не конфликтовать с первым узлом. Можно скопировать команду и при необходимости поправить ключи:
nodeos --producer-name inita --plugin eosio::chain_api_plugin --plugin eosio::net_api_plugin --http-server-address 127.0.0.1:8889 --p2p-listen-endpoint 127.0.0.1:9877 --p2p-peer-address 127.0.0.1:9876 --config-dir node2 --data-dir node2 --signature-provider EOS6hMjoWRF2L8x9YpeqtUEcsDKAyxSuM1APicxgRU1E3oyV5sDEg=KEY:5JgbL2ZnoEAhTudReWH1RnMuQS6DBeLZt4ucV6t8aymVEuYg7sr
У нового узла в логе будет немного активности, затем тишина до последнего шага — пока inita не зарегистрирован как продюсер. Ниже пример хвоста лога (у вас могут отличаться времена):
2393147ms thread-0 producer_plugin.cpp:176 plugin_startup ] producer plugin: plugin_startup() end
2393157ms thread-0 net_plugin.cpp:1271 start_sync ] Catching up with chain, our last req is 0, theirs is 8249 peer dhcp15.ociweb.com:9876 - 295f5fd
2393158ms thread-0 chain_controller.cpp:1402 validate_block_heade ] head_block_time 2018-03-01T12:00:00.000, next_block 2018-04-05T22:31:08.500, block_interval 500
2393158ms thread-0 chain_controller.cpp:1404 validate_block_heade ] Did not produce block within block_interval 500ms, took 3061868500ms)
2393512ms thread-0 producer_plugin.cpp:241 block_production_loo ] Not producing block because production is disabled until we receive a recent block (see: --enable-stale-production)
2395680ms thread-0 net_plugin.cpp:1385 recv_notice ] sync_manager got last irreversible block notice
2395680ms thread-0 net_plugin.cpp:1271 start_sync ] Catching up with chain, our last req is 8248, theirs is 8255 peer dhcp15.ociweb.com:9876 - 295f5fd
2396002ms thread-0 producer_plugin.cpp:226 block_production_loo ] Previous result occurred 5 times
2396002ms thread-0 producer_plugin.cpp:244 block_production_loo ] Not producing block because it isn't my turn, its eosio
Сейчас второй nodeos — «простаивающий» продюсер. Чтобы он стал активным, зарегистрируйте inita у bios-узла и обновите расписание продюсеров:
cleos --wallet-url http://127.0.0.1:8899 push action eosio setprods "{ \"schedule\": [{\"producer_name\": \"inita\",\"block_signing_key\": \"EOS6hMjoWRF2L8x9YpeqtUEcsDKAyxSuM1APicxgRU1E3oyV5sDEg\"}]}" -p eosio@active
executed transaction: 2cff4d96814752aefaf9908a7650e867dab74af02253ae7d34672abb9c58235a 272 bytes 105472 cycles
# eosio <= eosio::setprods {"version":1,"producers":[{"producer_name":"inita","block_signing_key":"EOS6hMjoWRF2L8x9YpeqtUEcsDKA...
Двухузловая тестовая сеть готова. Исходный узел перестаёт выпускать блоки, но продолжает их получать. Проверьте get info на каждом узле.
6. Информация об узлах¶
Первый узел:
Пример ответа:
{
"server_version": "223565e8",
"head_block_num": 11412,
"last_irreversible_block_num": 11411,
"head_block_id": "00002c94daf7dff456cd940bd585c4d9b38e520e356d295d3531144329c8b6c3",
"head_block_time": "2018-04-06T00:06:14",
"head_block_producer": "inita"
}
Второй узел:
Пример ответа:
{
"server_version": "223565e8",
"head_block_num": 11438,
"last_irreversible_block_num": 11437,
"head_block_id": "00002cae32697444fa9a2964e4db85b5e8fd4c8b51529a0c13e38587c1bf3c6f",
"head_block_time": "2018-04-06T00:06:27",
"head_block_producer": "inita"
}
Сеть на нескольких физических хостах настраивается отдельно.