Тестовая сеть
Тестовая сеть из нескольких узлов¶
Вот ссылки на три нормальные статьи, на основе которых написана эта cтраница. Правда, они уже устарели и авторы сразу предлагают использовать контейнеры, поэтому материал переработан и актуализирован (на момент написания).
Итак, для начала убедимся, что у нас есть файл password
. В нём находится пароль от всех аккаунтов на всех клиентах, которые мы будем создавать.
cat password
Создадим две папки
mkdir node1 node2
Создадим ссылки на password
ln password node1/
ln password node2/
В каждой из них создадим по одному аккаунту
geth account new --datadir=node1 --password=password
geth account new --datadir=node2 --password=password
Сохраним адрес аккаунта в файл account
(заменив 0x0...1
на реальное значение, конечно), чтобы всегда были под рукой
echo 0x0000000000000000000000000000000000000001 > node1/account
echo 0x0000000000000000000000000000000000000002 > node2/account
Теперь создадим genesis.json
, который используем для инициализации клиентов. Возпользуемся утилитой puppeth
.
Она идёт вместе с Geth
Вызовем
puppeth
На первый вопрос в качестве имени укажем genesis
+-----------------------------------------------------------+
| Welcome to puppeth, your Ethereum private network manager |
| |
| This tool lets you create a new Ethereum network down to |
| the genesis block, bootnodes, miners and ethstats servers |
| without the hassle that it would normally entail. |
| |
| Puppeth uses SSH to dial in to remote servers, and builds |
| its network components out of Docker containers using the |
| docker-compose toolset. |
+-----------------------------------------------------------+
Please specify a network name to administer (no spaces, hyphens or capital letters please)
> genesis
Теперь выберем пункт 2
Sweet, you can set this via --network=genesis next time!
INFO [11-29|15:46:37.453] Administering Ethereum network name=genesis
WARN [11-29|15:46:37.519] No previous configurations found path=/home/kirill/.puppeth/genesis
What would you like to do? (default = stats)
1. Show network stats
2. Configure new genesis
3. Track new remote server
4. Deploy network components
> 2
Хотим создать - 1
What would you like to do? (default = create)
1. Create new genesis from scratch
2. Import already existing genesis
> 1
Выбираем PoA - 2
Which consensus engine to use? (default = clique)
1. Ethash - proof-of-work
2. Clique - proof-of-authority
> 2
В нашем случае не имеет значения, пусть будет 15
How many seconds should blocks take? (default = 15)
> 15
Укажим только первый аккаунт, он будет "авторитетным"
Which accounts are allowed to seal? (mandatory at least one)
> 0x0000000000000000000000000000000000000001
> 0x0000000000000000000000000000000000000002
> 0x
Укажем оба аккаунта, т.к. этот genesis.json
будет использован для инициализации обоих клиентов
Which accounts should be pre-funded? (advisable at least one)
> 0x0000000000000000000000000000000000000001
> 0x0000000000000000000000000000000000000002
> 0x
Пожалуй, не будем добавлять кучу ненужных адресов
Should the precompile-addresses (0x1 .. 0xff) be pre-funded with 1 wei? (advisable yes)
> no
Пусть будет 1234
Specify your chain/network ID if you want an explicit one (default = random)
> 1234
Осталось сохранить всё в файл
What would you like to do? (default = stats)
1. Show network stats
2. Manage existing genesis
3. Track new remote server
4. Deploy network components
> 2
и ещё раз 2
1. Modify existing configurations
2. Export genesis configurations
3. Remove genesis configuration
> 2
Ага, прямо сюда
Which folder to save the genesis specs into? (default = current)
Will create genesis.json, genesis-aleth.json, genesis-harmony.json, genesis-parity.json
>
Отлично
INFO [11-29|16:12:09.564] Saved native genesis chain spec path=genesis.json
ERROR[11-29|16:12:09.564] Failed to create Aleth chain spec err="unsupported consensus engine"
ERROR[11-29|16:12:09.629] Failed to create Parity chain spec err="unsupported consensus engine"
INFO [11-29|16:12:09.629] Saved genesis chain spec client=harmony path=genesis-harmony.json
Для выхода из puppeth
жмём Ctrl+C
Далее удалим genesis-harmony.json
, т.к. он нам не нужен
rm genesis-harmony.json
Подправим значение периода, чтобы новый блок создавался только если есть новая транзакция. git diff -- genesis.json
после исправления должен выдать что-то типа
git diff -- genesis.json
diff --git a/genesis.json b/genesis.json
index 93f2e4c..b328421 100644
--- a/genesis.json
+++ b/genesis.json
@@ -11,7 +11,7 @@
"petersburgBlock": 0,
"istanbulBlock": 0,
"clique": {
- "period": 15,
+ "period": 0,
"epoch": 30000
}
},
Инициализируем клиентов
geth --datadir=node1 init genesis.json
geth --datadir=node2 init genesis.json
Создадим файл command
, в который запишем bash
скрипт для запуска клиента
touch node1/command node2/command
geth --nousb --datadir=$pwd --syncmode=full --port=30310 --miner.gasprice=0 --miner.gastarget=470000000000 --http --http.addr=localhost --http.port=8545 --http.api admin,eth,miner,net,txpool,personal,web3 --mine --miner.etherbase=0x0000000000000000000000000000000000000001 --allow-insecure-unlock --unlock=0x0000000000000000000000000000000000000001 --password=password --nodiscover --verbosity=4 console 2>geth.log
И для второго
geth --nousb --datadir=$pwd --syncmode=full --port=30311 --miner.gasprice=0 --miner.gastarget=470000000000 --http --http.addr=localhost --http.port=8546 --http.api admin,eth,miner,net,txpool,personal,web3 --mine --miner.etherbase=0x0000000000000000000000000000000000000002 --allow-insecure-unlock --unlock=0x0000000000000000000000000000000000000002 --password=password --nodiscover --verbosity=4 console 2>geth.log
Если хочется запустить "в фоновом режиме", то надо дописать перед всей командой
nohup
и удалитьconsole
из ключей. Но для того, чтобы воспользоваться консолью придётся делатьattach
.
Запустим два терминала, перейдём в node1
и node2
соответсвенно и выполним bash command
. Должно появиться что-то вида
Welcome to the Geth JavaScript console!
instance: Geth/v1.9.24-stable-cc05b050/linux-amd64/go1.15.5
coinbase: 0x4753811b64845535945dafc6a10c1fbe6ca916f7
at block: 0 (Sun Nov 29 2020 15:49:23 GMT+0300 (MSK))
datadir: /home/kirill/git/personal/blockchain/node1
modules: admin:1.0 clique: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
To exit, press ctrl-d
>
В каждой из консолей выполним две команды. Первая позволит получить список пиров (их не должно быть - пустой массив), а вторая - информацию о клиенте.
admin.peers
admin.nodeInfo
Нас интересует значение enode
второго клиента. Вызовем в консоли первого метод добавления пира
admin.addPeer("значение-enode-второго-клиента")
Ещё раз проверяем пиров - у каждого клиента должно было появиться по одному.
Вуаля.
Тестовая PoA сеть из двух узлов готова.