Привет, Хабр! На связи Николай, главный редактор Web3 Tech. Как можно предположить по должности, опыта в разработке я почти не имею. Год назад закончил мини-курс по Python, сделал об этом пост и с тех пор код не писал. Но недавно набрался смелости, заручился посильной поддержкой коллег и решил создать, пусть и локальную, но все же свою блокчейн-сеть!

В блоге Web3 Tech уже публиковали соответствующий гайд, но в нем отсутствовали некоторые детали, которые могут быть неочевидны пользователям моего уровня. В этом посте я в подробностях опишу весь путь с чистого листа: от чистого компьютера, которого не касалась рука программиста, до рабочей среды с функционирующим блокчейном на три ноды и мониторингом. Постараюсь сохранить все детали, о которые может споткнуться тот, кто первый раз приблизился к разработке.

Готовим всё необходимое

Для экспериментов потребуется компьютер с ОС Ubuntu 18.04 (x64), MacOS Sierra или более поздними версиями. Если у вас Windows, разумно поискать руководства по установке Ubuntu. У меня в распоряжении MacOS Sonoma, так что по системным требованиям прохожу. Если у вас тоже «мак», узнать версию ОС можно, кликнув на яблоко в левом верхнем углу и выбрав «Об этом Mac». А сравнить, что новее — ваша версия или Sierra — с помощью статьи о MacOS на википедии.

Для работы потребуется установить среду разработки IDE. Здесь допустимы разные варианты, у меня с давних времен установлена Visual Studio Code. Можно попробовать ее, но если у вас еще нет IDE, рекомендую остановиться на IntelliJ Idea. Пролистайте страницу продукта чуть ниже, до Community Edition, она бесплатна и достаточна для наших задач. В выпадающем меню выберите Intel или Apple Silicon, в зависимости от конфигурации вашего «мака» (яблоко в углу — Об этом Mac — Процессор). Таким же образом выберите нужный установщик Docker Desktop.

И IDE, и Docker устанавливаются как обычные приложения; важно только не забыть свой пароль администратора. При успешном запуске Docker в наборе значков в правом верхнем углу появится новый — логотип Docker.

Как показали мои дальнейшие эксперименты, проще всего будет, если ваш Mac основан на процессоре Intel. Устройства на архитектуре Apple потребуют дополнительной настройки и чуть более сложных команд. Я постараюсь разобраться и вернуться к ним в будущих постах, чтобы не перегружать этот. 

Развертываем и запускаем блокчейн-сеть

Создадим рабочую папку для нашей сети. Советую не присваивать ей сложное имя, чтобы его постоянное упоминание не замылило глаз при дальнейшей работе. Свою рабочую папку я назвал demo-platform.

Для развертывания сети нужен файл с конфигурацией, docker-compose.yml. Скачайте его в рабочую папку и откройте с помощью IDE. Поменяем в нем более старую версию ноды Waves Enterprise на более новую «Конфидент». Для этого замените во всем файле we-network на w3-network. А затем выделите в файле текст со строки node-0: до строки networks: (не включая последнюю), замените на текст ниже и перезапишите файл:

  node-0:
    image: web3techru/confident:v1.9.0
    ports:
      - "6862:6862"
      - "6864:6864"
      - "6865:6865"
    networks:
      - w3-network
    hostname: node-0
    container_name: node-0
    env_file:
      - ./env/node-0.env
    volumes:
      - ./configs/nodes/node-0/node.conf:/node/node.conf
      - ./configs/nodes/node-0/keystore.dat:/node/keystore.dat
      - node-0-data:/node/data
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
  node-1:
    image: web3techru/confident:v1.9.0
    ports:
      - "6872:6862"
      - "6874:6864"
      - "6875:6865"
    networks:
      - w3-network
    hostname: node-1
    container_name: node-1
    env_file:
      - ./env/node-1.env
    volumes:
      - ./configs/nodes/node-1/node.conf:/node/node.conf
      - ./configs/nodes/node-1/keystore.dat:/node/keystore.dat
      - node-1-data:/node/data
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
  node-2:
    image: web3techru/confident:v1.9.0
    ports:
      - "6882:6862"
      - "6884:6864"
      - "6885:6865"
    networks:
      - w3-network
    hostname: node-2
    container_name: node-2
    env_file:
      - ./env/node-2.env
    volumes:
      - ./configs/nodes/node-2/node.conf:/node/node.conf
      - ./configs/nodes/node-2/keystore.dat:/node/keystore.dat
      - node-2-data:/node/data
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always

Изначально в нашей сети будет три ноды, но если того потребуют проекты, мы добавим еще. 

Теперь откроем новый для себя инструмент — Терминал, или командную строку (Программы — Утилиты — Терминал). Откройте его и перейдите в рабочую папку. Для этого вам понадобится ее полный адрес. Проще всего его получить в Finder (проводнике Mac OS). Откройте свою папку и внизу увидите путь к ней (если не видите, нажмите Вид — Показать строку пути). Нажмите здесь правой кнопкой на вашей папке в строке и выберите «Скопировать путь до…»

Можно сделать то же самое с помощью пункта «Открыть в Терминале», но давайте пойдем через базовые команды, это полезно
Можно сделать то же самое с помощью пункта «Открыть в Терминале», но давайте пойдем через базовые команды, это полезно

Возвращаемся в Терминал, вводим cd и вставляем путь к папке:

cd /Users/nzemlyanskiy/demo-platform

Теперь мы в нужной папке, можно запускать Docker-контейнер для развертывания:

docker run --rm -ti -v $(pwd):/config-manager/output web3techru/config-manager:v1.9.0

Через некоторое время и много промежуточных сообщений мы увидим в Терминале строку «WE network environment is ready!»:

В рабочей директории при этом появится несколько новых файлов и папок. Обратите внимание на credentials.txt, где содержится информация о нодах:

Торжественный момент: можно перерезать ленточку нашего блокчейна! Для этого в Терминале введите:

docker-compose up -d

Некоторое время ноды и сервисы будут запускаться, в случае успеха во всех строках будут позитивные статусы:

Теперь уже можно посмотреть статистику сети. Для этого откройте браузер и введите в адресной строке localhost или 127.0.0.1. Вы попадаете на страницу клиента Waves Enterprise, где надо будет создать учетную запись. Введите произвольную почту и пароль. Далее вам предложат подтвердить учетную запись по почте, но поскольку сеть у нас поднята локально, никакого подтверждения не требуется — ваш пользователь просто добавляется в базу на компьютере. Залогиньтесь с новой учеткой, и перед вами откроется информация о новой сети:

Три ноды, как и прописывали. Отправитель транзакций один, ведь и транзакция всего одна — генезис, создание сети. Количество блоков растет автоматически, пока сеть запущена, вне зависимости от ваших в ней действий.
Три ноды, как и прописывали. Отправитель транзакций один, ведь и транзакция всего одна — генезис, создание сети. Количество блоков растет автоматически, пока сеть запущена, вне зависимости от ваших в ней действий.

Чтобы сеть не работала вхолостую и не потребляла ресурсы, вы можете в любой момент остановить ее командой в Терминале:

docker-compose down

Вновь запустить ее можно будет с помощью предыдущей команды.

Настраиваем мониторинг

Для будущих проектов нам пригодится мониторинг блокчейна: так мы сможем отслеживать его состояние. Будем использовать опенсорсную платфому аналитики Grafana и базу данных InfluxDB.

Загружаем Grafana с помощью команды:

docker run -d --name=grafana -p 3000:3000 grafana/grafana

Не забудьте, что в Терминале нужно предварительно перейти к нашей рабочей папке. Образ Grafana загрузится из Сети:

Теперь ставим InfluxDB. Команду ниже нужно вводить в одну строку:

docker run -d --name influxdb -p 8086:8086 -e INFLUXDB_DB=sandbox_influxdb -e INFLUXDB_ADMIN_USER=sandbox_influxdb_admin -e INFLUXDB_ADMIN_PASSWORD=sandbox_influxdb_pass quay.io/influxdb/influxdb:v1.6.4

В демонстрационных целях здесь мы используем не последнюю версию InfluxDB, о чем указано в соответствующей строчке image. Более поздние версии, начиная с 1.8, требуют более сложной настройки, так что остановимся на 1.6.4, которая пока доступна. В Терминале должен появиться отчет об успешной загрузке:

Возвращаемся в docker-compose.yml и прописываем сервисы мониторинга, чтобы они развернулись при следующем запуске блокчейна. В пункт services добавляем два новых сервиса, Grafana и InfluxDB:

grafana:
  image: grafana/grafana:latest
  hostname: grafana
  container_name: grafana
  environment:
    GF_SECURITY_ADMIN_USER: 'admin'
    GF_SECURITY_ADMIN_PASSWORD: 'pass'
  restart: always
  ports:
    - 3000:3000
  networks:
    - w3-network
  volumes:
    - grafana:/var/lib/grafana
influxdb:
  image: influxdb:1.6.4
  hostname: influxdb
  container_name: influxdb
  environment:
    - INFLUXDB_DB=influxdb
    - INFLUXDB_ADMIN_USER=admin
    - INFLUXDB_ADMIN_PASSWORD=pass
  restart: always
  ports:
    - 8086:8086
  networks:
    - w3-network
  volumes:
    - influxdb:/var/lib/influxdb

Обратите внимание на поля GF_SECURITY_ADMIN_USER и GF_SECURITY_ADMIN_PASSWORD в docker-compose.yml — здесь устанавливается логин и пароль, по которому мы будем заходить в Grafana. Я везде остановлюсь на стандартных.

Теперь пропишем сервисы в файлах нод. В дальнейшем вы сможете мониторить только те ноды, в конфигурации которых будет добавлен мониторинг. В рабочей папке откройте /configs/nodes/node-0/node.conf через IDE и добавьте в него код ниже.

# Performance metrics
kamon {
  # Set to "yes", if you want to report metrics
  enable = yes
  # An interval within metrics are aggregated. After it, them will be sent to the server
  metric.tick-interval = 1 second
  # Reporter settings
  influxdb {
    hostname = "influxdb"
    port = 8086
    database = "influxdb"
    time-units = "ms"
    authentication {
      user = "admin"
      password = "pass"
    }
    environment.host = "0"
  }
}

# Non-aggregated data (information about blocks, transactions, ...)
metrics {
  enable = yes
  node-id = "0"
  influxdb {
    uri = "http://influxdb:8086"
    db = "influxdb"
    username = "admin"
    password = "pass"
    batch-actions = 100
    batch-flash-duration = 1s
  }
}

Повторите вставку в файлах /configs/nodes/node-1/node.conf и /configs/nodes/node-2/node.conf, изменив значения environment.host и node-id в каждом файле на 1 и 2 соответственно. Значения db, username, password в файлах нод должны совпадать со значениями  INFLUXDB_DB, INFLUXDB_ADMIN_USER и INFLUXDB_ADMIN_PASSWORD в docker-compose.yml.

Вернитесь в docker-compose.yml. Добавьте InfluxDB три раза, в блоки node-0, node-1 и node-2 после строчки image…:

depends_on:
  - influxdb

И наконец, пропишите сервисы в самом конце, в разделе volumes, добавив:

grafana:
influxdb:

Если блокчейн у вас уже запущен, перезапустите его через команду

docker-compose up -d

Важно, чтобы в docker-compose.yml каждая строка имела нужный отступ. В списке первого уровня стоят сервисы (grafana, influxdb, nginx-proxy…). Каждый из них имеет вложенный список настроек (image, hostname, container_name…). Если сдвинуть сервис на уровень настроек, то Docker подумает, что это недопустимая настройка, и выдаст ошибку:

Поделюсь и другой ошибкой, что встретил на этом этапе:

Похоже, в результате какой-то неудачной попытки контейнеры запустились частично, и впоследствии при повторных попытках возникал конфликт. Решение здесь простое, заходим в Docker Desktop через значок в доке или в верхней панели (Go to the Dashboard):

Это список запущенных контейнеров. Узнаете названия из docker-compose? Ваш список может иметь другой порядок, главное — удалить все контейнеры, для чего в каждой строке справа есть иконка мусорного бака. После этого вновь запустите сеть:

Настраиваем веб-клиент Grafana

Перейдем в браузер для настройки Grafana. Она находится по адресу http://127.0.0.1:3000/login. Для авторизации используйте логин и пароль, установленные ранее (в моем случае это просто admin/pass).

Откройте меню-бутерброд в левом верхнем углу, нажмите Connections — Add new connection. В поисковой строке введите InfluxDB, выберите эту базу данных и на странице настройки вбейте следующие данные:

  • Query language: InfluxQL (этот язык совместим с нашей версией InfluxDB)

  • URL: http://influxdb:8086 (этот порт мы прописывали в docker-compose)

  • Database: influxdb (значение INFLUXDB_DB из docker-compose)

  • User: admin (значение INFLUXDB_ADMIN_USER)

  • Password: pass (значение INFLUXDB_ADMIN_PASSWORD)

Нажмите Save & Test. В ответ вы должны получить зеленую плашку. Из-за задержек у вас может быть другое число метрик, важно чтобы Grafana подтвердила успешное соединение:

Теперь на основе подключенных данных создадим дэшборд. Открываем меню в верхнем левом углу, далее Dashboards — New — New Dashboard — Import Dashboard. В поле Import via dashboard JSON model копируем код из документации. Нажимаем Load, на следующем шаге присваиваем дэшборду имя и определяем его место в иерархии дэшбордов (я оставил корневую папку Dashboards). Нажимаем Import.

Теперь мониторинг нашего блокчейна доступен в меню — Dashboards. В панели вы увидите много графиков, которые пустуют, поскольку отслеживают транзакции и другие события, которые мы на данном этапе не используем. Пока что важен для нас первый график, показывающий высоту блокчейна:

На скриншоте выше продемонстрирована идеальная картина мониторинга, когда все три ноды синхронно набирают одну и ту же высоту. На самом деле возможны отличия: Grafana может далеко не сразу подтянуть все ноды, и их высота может различаться, если в процессе вы много чего перезапускали и пересобирали.

Кроме того, большое значение здесь имеет конфигурация вашего компьютера. Мне, например, не удалось добиться идеала на Macbook Pro 2018 с Intel i7 и 16 ГБ оперативки. Скриншот выше прислал мой коллега-девопс (спасибо, Алик!) со сборкой на Mac M1. Ничего страшного, мониторинг — это производное от работы сети, и влиять на нее он не может. В будущих проектах вы перезапустите блокчейн уже более уверенно и, возможно, приблизитесь к идеальной графане :) На этапе знакомства важно, что сеть функционирует и мы это видим. 

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

Подведем итоги

Поздравляю: мы создали свой собственный блокчейн да еще и мониторинг развернули! В следующих постах я попробую разобраться, как повторить этот успех на «маках» с Apple Silicon, возможно, перееду на более новый InfluxDB, и мы перейдем к демопроектам.

Если у вас возникли вопросы, задавайте их в комментариях. Если не смогу ответить сам, постараюсь привлечь наших опытных разработчиков и девопсов. Буду очень рад и комментариям о том, как можно что-либо оптимизировать в инструкции. До новых челленджей!

Комментарии (5)


  1. zubrbonasus
    19.03.2024 14:30
    +2

    Запустить чужой образ джокера не равно создать блокчейн сеть.

    Создать блокчей сеть - это накодить все необходимое, дабы оно работало в докере. )))


  1. danilagridnev
    19.03.2024 14:30

    @klauss_z Мощь! Спасибо за статью, Коля) Молодец!


    1. MAXH0
      19.03.2024 14:30
      +1

      Позитивный спам выглядит именно так ;)


  1. Okunev_PY
    19.03.2024 14:30

    А причём тут эпичное вступление про питон?


    1. klauss_z Автор
      19.03.2024 14:30

      Чтобы рассказать об уровне автора и о том, на кого ориентирован пост ;)