Привет, Хабр! На связи Николай, главный редактор 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, и мы перейдем к демопроектам.
Если у вас возникли вопросы, задавайте их в комментариях. Если не смогу ответить сам, постараюсь привлечь наших опытных разработчиков и девопсов. Буду очень рад и комментариям о том, как можно что-либо оптимизировать в инструкции. До новых челленджей!
zubrbonasus
Запустить чужой образ джокера не равно создать блокчейн сеть.
Создать блокчей сеть - это накодить все необходимое, дабы оно работало в докере. )))