Инструкция по развертыванию частной сети Ethereum
Всем привет! Данная статья содержит описание процесса установки и настройки приватной сети Ethereum на ОС Ubuntu 16.0.4. Надеюсь кому-нибудь пригодится!
Установка компонентов из PPA
Для установки софта необходимо выполнить следующие команды:
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
В пакете ethereum также содержится консольный интерфейс Geth, необходимый для работы с сетью.
Создание Генезиса
После установки всех необходимых пакетов, необходимо перейти к формированию Генезиса. Генезис – Самый первый блок в цепочке блокчейн, всегда заполняется вручную, даже в реальной сети.
Создадим файл genesis.json выполнив следующую команду:
sudo nano genesis.json
Запишем в файл следующие параметры:
{ "nonce": "0x0000000000000042",
"timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x0",
"gasLimit": "0x8000000",
"difficulty": "0x400",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x3333333333333333333333333333333333333333",
"alloc": { } }
ParentHash - хэш ссылка на предыдущий блок блокчэйна. В нашем случае первым блоком является генезис, поэтому он равен нулю
mixhash, nonce – Параметры, используемые в технологии the Proof-of-Work (PoW). Они подтверждают проведение требуемого количества вычислений для блока
Coinbase – бенефициарий. Требуется для корректной работы системы расчета вознаграждения при генерации новых блоков. (Для реального проекта параметры необходимо изменить, т.к. приведенные настройки подвергают сеть взлому.)
Запуск node и инициализация genesis
Перед запуском нескольких узлов эфира необхоимо убедиться, что:
- каждый экземпляр имеет отдельный каталог данных (--datadir)
- каждый экземпляр работает на разных портах (both eth and rpc) (--port and —rpcport)
- в случае кластера экземпляры должны знать друг о друге ipc endpoint должны быть уникальными или ipc интерфейс должен быть выключен (--ipcpath or —ipcdisable)
Подробности и информацию по флагам можно посмотреть на ГитХабе.
Инициализация блока genesis для первой ноды (node1):
geth --identity "Billing1" --rpc --rpcport "8082" --rpccorsdomain "*" --datadir "/home/maxim/project/network/node2" -- ipcdisable --port "30302" --rpcapi "db,eth,net,web3" --networkid 1999 init /home/maxim/project/network/genesis.json
В итоге выполнения команд получаем следующий результат:
I1212 14:31:04.487121 cmd/geth/chaincmd.go:131] successfully wrote genesis block and/or chain rule set: 6650a0ac6c5e805475e7ca48eae5df0e32a2147a154bb2222731c770ddb5c158
Инициализация блока genesis для второй ноды (node1node2 (необходимо выполнят на другом терминале Ctrl+Alt+t):
geth --identity "Billing2" --rpc --rpcport "8083" --rpccorsdomain "*" --datadir "/home/maxim/project/network/node3" -- ipcdisable --port "30303" --rpcapi "db,eth,net,web3" --networkid 1999 init /home/maxim/project/network/genesis.json Результат: I1212 14:31:04.487121 cmd/geth/chaincmd.go:131] successfully wrote genesis block and/or chain rule set: 6650a0ac6c5e805475e7ca48eae5df0e32a2147a154bb2222731c770ddb5c158
Запуск нод и клиента
Запускаем первую ноду:
geth --identity "Billing1" --rpc --rpcport "8082" --rpccorsdomain "*" --datadir "/home/maxim/project/network/node2" - -ipcdisable --port "30302" --rpcapi "db,eth,net,web3" --networkid 1999 console 2>> /home/maxim/project/network/node2/filelog1.log
Cоздаем аккаунт с паролем qwe:
personal.newAccount("qwe")
Адрес аккаунта отображается в консоле следующим образом:
"0x04d4eddae29f46b0578e23cc9b01ccdb1a8ba86c"
Присваиваем аккаунту статус майнера:
miner.setEtherbase(eth.accounts[0])
Запускаем генерацию блоков:
miner.start()
После формирования DAG в консоли будут отображены записи, сообщающие о корректности формирования блоков:
I1212 14:31:04.822979 eth/backend.go:484] checking DAG (ethash dir: /home/maxim/.ethash) I1212 14:31:05.955535 vendor/github.com/ethereum/ethash/ethash.go:276] Done generating DAG for epoch 0, it took 1.135322105s I1212 214:31:07.589805 miner/unconfirmed.go:83]
mined potential block #1 [050f878e…], waiting for 5 blocks to confirm I1212 14:31:08.590261 miner/worker.go:514] commit new work on block 2 with 0 txs & 0 uncles. Took 248.713µs
I1212 14:31:08.596575 miner/unconfirmed.go:83]
mined potential block #1 [e88f1c28…], waiting for 5 blocks to confirm I1212 14:31:08.959788 miner/unconfirmed.go:83]
mined potential block #2 [8ace02fc…], waiting for 5 blocks to confirm
Останавливаем майнинг:
miner.stop()
Собираем данные о ноде:
admin.nodeInfo.enode
Получаем следующие сообщение:
enode://2e21fe4357c72368a61737d90ff7f645df121f99601942c879acbfb3fb53a6b90f66ebe7bc87086c0b9584056b357 dc1f7424b93c5348af7429c839cc9bf151b@[::]:30302
Запускаем ноду 2:
geth --identity "Billing2" --rpc --rpcport "8083" --rpccorsdomain "*" --datadir "/home/maxim/project/network/node3" -- ipcdisable --port "30303" --rpcapi "db,eth,net,web3" --networkid 1999 console 2>> /home/maxim/project/network/node3/filelog2.log
Теперь необходимо связать узлы.
Для этого в каждый узел необходимо добавить уникальный адрес другого узла, выполнив в консоли следующую команду:
admin.nodeInfo.enode
Передаевм полученный идентификатор в функцию
admin.addPeer("идентификатор узла")
Выводим в консоль данные второй ноды:
admin.nodeInfo.enode
Получаем сообзение:
enode://23409a6196304d1f49d0e9ea832b2fa005c4ee424c44dae5c4fd9633187fa15411201eb6737dfc2de001ff1b4aeb6 53d06e558ffae9b87254eb047cc77aa7025@[::]:30303
Вводим в консоле первой ноды:
admin.addPeer("enode://23409a6196304d1f49d0e9ea832b2fa005c4ee424c44dae5c4fd9633187fa15411201eb6737dfc2 de001ff1b4aeb653d06e558ffae9b87254eb047cc77aa7025@[127.0.0.1]:30303")
В консоли второй ноды можно увидеть, что блоки сгенерированные в первой ноде импортировались во вторую ноду.
ИТОГ:
- Поднята сеть Etherium;
- Запущены две ноды;
- Создан аккаунт майнер;
- Блоки успешно сгенерированы;
С уважением, @dmitrijv
Ссылка на пакет данных.
Ссылка на источник изображения.