В этом уроке мы:
- Настройте блокчейн с несколькими узлами
- Настройка узлов майнинга
- Подключите несколько узлов и настройте сеть блокчейнов.
- Протестируйте сеть блокчейнов, добывая блоки и убедившись, что блоки распространяются на все узлы.
- Убедитесь, что локальная копия блокчейна на всех узлах обновлена.
Установка и необходимое программное обеспечение
Go Etheruem (Geth) - это инструмент клиентского интерфейса командной строки, который позволяет вам взаимодействовать с вашим частным блокчейном Ethereum.
Если вам нужно установить Homebrew на ваш Mac, поместите следующую строку в командную строку терминала:
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
После установки Homebrew установите Geth:
$ brew tap ethereum/ethereum $ brew install ethereum
Настроить Genesis Block
Создайте новый каталог проекта. В нем создайте файл genesis.json
с помощью любого редактора по вашему выбору. Я использую Код Visual Studio на Mac, бесплатный редактор:
$ mkdir project3 $ cd project3
Скопируйте следующий JSON в свой genesis.json
файл и сохраните файл в каталоге проекта.
\\genesis.json file { "config": { "chainId": 4321, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "alloc": {}, "difficulty" : "0x20000", "gasLimit" : "0x8880000" }
Настройте первый узел (узел 1)
После сохранения файла genesis.json
вы готовы создать свой первый узел. Чтобы создать свой первый узел, откройте новое окно терминала, перейдите в папку своего проекта и введите следующую команду:
$ geth --datadir blkchain1 init genesis.json
Эта команда инициализирует новый узел цепочки блоков, используя конфигурацию, указанную в файле genesis.json
. Используя — -datadir
, мы указываем имя каталога, в котором на узле будет храниться локальная копия цепочки блоков.
Эта команда создаст каталог с именем blkchain1
в каталоге вашего проекта. Этот каталог содержит каталоги geth
и keystore
. Данные блокчейна будут храниться в локальной базе данных в каталоге geth
.
Вы можете проверить это, перейдя в каталог blkchain1
в командном терминале и введя ls -l
. Также перейдите в подкаталог geth
и введите ls -l
.
Теперь, когда ваш узел 1 инициализирован, давайте запустим узел 1 с помощью Geth. В окне терминала перейдите в папку проекта (где вы сохранили файл genesis.json
) и введите следующее:
$ geth --datadir blkchain1 --nodiscover --networkid 1234 console
Эта команда запустит ваш первый узел и вызовет консоль Geth, где вы можете вводить команды для взаимодействия с блокчейном Node1.
Вы увидите следующее:
Давайте разберемся с этой командой geth console и разберемся с ней:
— -datadir blkchain1
:
указывает каталог данных блокчейна. Если вы не укажете это, по умолчанию будет использоваться основной блокчейн Ethereum.
--nodiscover
:
отключает механизм обнаружения одноранговых узлов и включает добавление одноранговых узлов вручную.
--networkid 1234
:
идентичность вашей сети Ethereum, другие одноранговые узлы также будут иметь такой же сетевой идентификатор. Идентификатор сети может быть любым случайным целым числом.
Теперь, когда вы находитесь в консоли Geth, чтобы получить дополнительную информацию об узле, воспользуемся командой admin. Введите следующую команду в консоли Geth:
> admin.nodeInfo
Это даст вам больше информации о вашем узле:
Обратите внимание на следующее:
- по умолчанию
listener
порт - 30303 enode id
- это идентификатор вашего узла- порт
discovery
- «0», поскольку мы установили его в--nodiscover
.
Чтобы получить список всех команд администратора, введите «admin». и нажмите ‹tab›
Теперь давайте настроим аккаунт, в котором будут собираться добытые эфиры. Введите в консоли Geth следующее:
> personal.newAccount()
Вы можете ввести любую кодовую фразу - это ваш пароль. Команда возвращает идентификатор учетной записи.
Чтобы получить список всех учетных записей:
> personal.listAccounts
Узел 1 готов!
Держите окно терминала (с Geth Console для Node1) открытым и работающим. Мы откроем новое окно терминала для настройки узла 2.
Настройте второй узел (узел 2)
Теперь давайте настроим второй узел в сети блокчейн. Процесс будет аналогичен настройке Node1.
Откройте новое окно терминала и перейдите в папку проекта, содержащую файл genesis.json
.
Инициализируйте новый узел с помощью следующей команды:
$ geth --datadir blkchain2 init genesis.json
Примечание. Поскольку мы хотим, чтобы этот узел был частью той же цепочки блоков, мы используем один и тот же генезисный блок.
Это создаст новый узел, данные которого будут храниться в новом каталоге с именем blkchain2
(он будет содержать локальную копию базы данных блокчейна для узла 2).
Чтобы запустить узел 2 с помощью консоли Geth, введите следующее:
$ geth --datadir blkchain2 --nodiscover --networkid 1234 --port 30304 console
Это запустит узел 2 и вызовет консоль Geth, подключенную к узлу 2.
Обратите внимание на следующие отличия для узла 2:
- мы указываем номер порта 30304
Порт по умолчанию 30303 уже используется первым узлом, поэтому, если мы не укажем отдельный порт, это вызовет ошибку. - мы даем тот же идентификатор сети, что и для узла 1. Это важно, поскольку мы хотим, чтобы оба узла были частью сети.
- мы указываем, что
— -datadir
для node2 будет вblkchain2
Выполните команду admin.nodeInfo
в консоли Geth для Node2:
> admin.nodeInfo
Обратите внимание, что это предоставляет информацию об узле для узла 2. Вы можете сравнить enode id
, выполнив команду same admin.nodeInfo
в окне терминала, запустив консоль Geth для узла 1.
Как и в случае с узлом 1, мы можем настроить учетную запись на узле 2, введя personal.newAccount()
в консоли Geth для узла 2.
Вы можете использовать любую парольную фразу для учетной записи.
> personal.newAccount()
Узел 2 готов!
Не закрывайте оба окна терминала, одно из которых запускает консоль Geth (узел 1), а второе - консоль Geth (узел 2), бок о бок.
На следующем шаге мы соединим Node1 и Node2 и создадим сеть блокчейн!
Подключите узлы
Поздравляю! У вас работает 2 узла блокчейна.
Следующим шагом будет их соединение друг с другом и создание сети. Мы сделаем это, добавив один из узлов к другому в качестве «однорангового узла».
Выполните следующую команду на консолях Geth как на Node1, так и на Node2:
> admin.peers
Обратите внимание, что оба возвращают пустой массив, поскольку узлы не связаны ни с какими другими узлами.
Давайте добавим Node1 в качестве однорангового узла к Node2.
- Запустите команду
admin.nodeInfo
на узле 1
2. Скопируйте enode id
для узла 1:
"enode://549468e6d00e135128af33e03a6d27b0ee5fda7fbd0154b2e83fe68afdfda869eb6ace6ccaefe84ed7a5b804529dcef49f0b5d64be97da87b1e28ddecfca227a@[::]:30303?discport=0"
3. В Geth Console для Node2 добавьте Node1 в качестве однорангового узла к Node2 с помощью команды admin.addPeer(“//enode id”):
> admin.addPeer("enode://549468e6d00e135128af33e03a6d27b0ee5fda7fbd0154b2e83fe68afdfda869eb6ace6ccaefe84ed7a5b804529dcef49f0b5d64be97da87b1e28ddecfca227a@[::]:30303?discport=0")
Теперь, когда вы запустите команду admin.peers
в любой из консоли Geth, вы увидите другой узел в списке как одноранговый!
Ура! Теперь у вас есть подключенная сеть блокчейнов!
Но как узнать наверняка?
Давайте проверим это, не так ли? Давайте обновим что-нибудь в Node1 и посмотрим, распространяется ли это изменение через сеть блокчейнов на Node2.
Убедитесь, что у вас есть подключенный блокчейн и распределенная база данных
Хорошо, пока у вас должно быть:
- Открываются два окна терминала
В одном запущена консоль Geth для Node1, а во втором - Get Console для Node2. - Узел 1 сохраняет свою локальную копию блокчейна в папке
blkchain1
. - Узел 2 сохраняет свою локальную копию блокчейна в папке
blkchain2
. - Кроме того, на предыдущем шаге вы соединили два узла с помощью
admin.addPeer()
Таким образом, если новые блоки добываются и добавляются в узел 1, этот новый блок должен распространяться по сети цепочки блоков, а локальная копия цепочки блоков узла 2 должна обновляться автоматически.
Давайте проверим, произойдет ли это.
В Geth Console (Node1) приступим к майнингу:
> miner.start(1)
Чтобы проверить, сколько блоков было добыто на Node1 в любой момент, запустите в консоли Geth (Node1) следующее:
> eth.blockNumber
Это вернет номер текущего добытого блока (или высоту цепочки блоков).
После добычи нескольких блоков перейдите в консоль Geth (узел 2) и выполните команду eth.blockNumber
.
Вы заметите, что высота блока в узле 2 совпадает с высотой блока в узле 1! Это подтверждает, что блоки, добытые на узле 1, были переданы по цепочке блоков на узел 2.
Чтобы поднять его на ступеньку выше, вы можете проверить данные в фактических блоках на Узле 1 и Узле 2.
Подождите, пока будет добыто около 10 блоков, а затем выполните следующую команду в Geth Console (Node1) и Geth Console (Node2):
> eth.getBlock(3)
Эта команда отображает содержимое блока 3 из цепочки блоков. Обратите внимание, что данные, отображаемые в консоли Geth (Node1) и Geth Console (Node2), идентичны, что указывает на то, что Block3, добытый узлом Node1, был распространен по сети цепочки блоков, а также является частью данных локальной цепочки блоков в узле 2.
Ура!! Теперь у вас есть полностью функциональная и подключенная многоузловая частная сеть Ethereum!
Удачного кодирования!
Следите за мной на Medium, чтобы получать последние обновления и сообщения!