В этом уроке мы:

  • Настройте блокчейн с несколькими узлами
  • Настройка узлов майнинга
  • Подключите несколько узлов и настройте сеть блокчейнов.
  • Протестируйте сеть блокчейнов, добывая блоки и убедившись, что блоки распространяются на все узлы.
  • Убедитесь, что локальная копия блокчейна на всех узлах обновлена.

Установка и необходимое программное обеспечение

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.

  1. Запустите команду 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, чтобы получать последние обновления и сообщения!