Запуск Bitcoin Full Node
Несмотря на то, что у большинства людей при слове Bitcoin возникает ассоциация с криптовалютой, торговлей и прочим, мало кто задумывается, что эта криптовалюта работает благодаря одноименной технологии - блокчейну Bitcoin. В статье мы кратко пройдемся по теории и больше времени уделим практике - глянем настройки клиента сети, соберем его в docker контейнер и поделаем запросы через curl. Ставьте приятную для вас фоновую музыку и поехали!
Содержание:
Bitcoin blockchain - это peer-to-peer сеть, созданная специально для того, чтобы работать по наборам определенных правил (consensus). Эти правила регулируют процесс проверки транзакций таким образом, что сеть Bitcoin становится невосприимчивой к мошенничеству c транзакциями, не прибегая при этом к централизованной архитектуре. Сеть опирается на данные нескольких узлов/нод, которые независимо друг от друга проверяют новые операции и передают свои результаты другим узлам для дальнейшего анализа, проверки и формирования блока.
Bitcoin full node — это полноценный узел сети Bitcoin, который хранит всю историю блокчейна, валидирует транзакции и блоки, и ретранслирует их другим узлам. В физическом плане узлом может быть любой ПК, VDS/VPS или выделенный физический сервер(dedicated server). Существует множество клиентов для доступа к сети, такие как btcd, bitcoin knots, blockcore, nix-bitcoin, и так далее. Мы не будем останавливаться на их описании, подробнее вы сможете почитать о них на официальных сайтах и в репозиториях. Самый популярный на сегодняшний день клиент - это конечно Bitcoin Core. С помощью него, мы поднимем Bitcoin full ноду, напишем для него docker и docker-compose файлы, а так же изучим основные api-методы для запроса проверки состояния ноды.
Системные требования
- CPU: 2 vCPU
- RAM: 2GB (лучше 4GB)
- Disk: ~850Gb (без prune)
Запуск bitcoin ноды
Скачиваем последнюю версию bitcoin core и распаковываем:
Запускаем full-ноду в сети основной сети mainnet:
Всё.
Нода запущена в виде сервиса в фоновом режиме c параметрами по-умолчанию. После старта, начнётся загрузка блоков в папку /home/bitcoin/.bitcoin/blocks. Полная синхронизация займет примерно 8-12ч (+-в зависимости от характеристик узла).
Проверить статус синхронизации можно через клиент:
Для настройки автозапуска при загрузки систем можно создать простой systemd service в linux (в официальном репозитории есть более расширенный вариант:
Для запуска в сети testnet используем флаг -testnet:
Для более детальной настройки старта есть другие аргументы:
-datadir=путь — указать директорию данных (по-умолчанию /home/bitcoin/.bitcoin). -conf=путь — указать путь и имя файла конфигурации (по-умолчанию bitcoin.conf). -chain=chainname — указать цепочку (main, testnet, signet, regtest).(по-умолчанию main) -server=1 — запускать RPC-сервер, чтобы принимать команды командной строки и JSON-RPC. () -rpcuser=user, -rpcpassword=pw — указать данные для RPC-доступа -rpcallowip=127.0.0.1/0 - Разрешить JSON-RPC соединения из указанного IP/подсети. -bind=127.0.0.1:8333 - Привязка и прослушивание к указанному адресу (по умолчанию: 0.0.0.0). -rpcbind=127.0.0.1:8332 - Привязка к указанному адресу для прослушивания JSON-RPC запросов. -maxconnections=n — макс. число подключений пиров(по-умолчанию 125) -listen=0 — не слушать входящие соединения, если хотите режим только клиента -mempoolexpiry=n - Не сохранять транзакции в mempool дольше n часов (по-умолчанию: 336). -dbcache=n — задать размер кэша базы данных (в мегабайтах) (полезно для ускорения начальной синхронизации, по-умолчанию 450). Неиспользованная память Mempool используется для этого кэша. -disablewallet — отключить встроенный кошелёк (если не нужен) -txindex=1 — включить индексацию транзакций (для RPC-запросов поиска по txid, getrawtransaction). -prune=n — включить удаление старых блоков, оставляя лишь часть истории и достаточный набор данных для верификации последующих блоков. В качестве значения аргумента передается желаемый размер для данных на диске (например "-prune=1024" означает примерно 1Gb, обычно этого достаточно для хранения p2p данных блоков). Данный флаг подойдет если важна поддержка сети, но не архивирование всей цепочки, а так же для снижения требования к дисковому пространству. Этот режим несовместим с "-txindex", поэтому значение нужно поставить "-txindex=0". RPC-команда pruneblockchain позволяет вручную вызвать сжатие данных до заданной высоты.
Это лишь базовые аргументы — полный список можно увидеть через
Если флагов много, то есть смысл создать файл конфигурации, где будут перечислены все необходимые флаги со нужным значением. Кстати, в официальном репо есть скрипт, который генерирует этот конфиг gen-bitcoin-conf.sh
Генерируем rpcauth
rpcauth - аргумент, который отвечает за указание авторизационных данных в формате <USERNAME>:<SALT>lt;HASH>. Это безопаснее, чем хранить пароль в открытом виде. Скрипт для создания такого аргумента лежит в официальном репозитории.
Скачаем скрипт:
Сгенерируйте хэшированый пароль для пользователя admin так:
можно с конкретным паролем:
После отработки скрипта получаем ответ:
Теперь занесем сгенерированную строку в файл конфигурации, например:
Запускаем ноду в docker-контейнере
Для изолированного запуска в docker контейнере создадим небольшой Dockerfile:
Собираем образ и запускаем ноду:
Смотрим логи:
Из логов видно, что нода поднялась без ошибок и считала конфигурацию из файла bitcoin.conf. Здесь же можно следить за процессом синхронизации - сначала должна пройти пре-синхронизаиця (Pre-synchronizing blockheaders) и синхронизация заголовков блоков (Synchronizing blockheaders) и после нода начнет скачивать блоки (UpdateTip: new best)
height=1 - показывает актуальный скаченный блок
progress=0.000000 - общий прогресс
Запускаем ноду через docker compose
Для запуска через “docker compose” сначала создадим папку для данных с нужными правами
Далее, создаем docker-compose.yaml
Запускаем и проверяем логи
Примеры запросов
Проверить статус блокчейна через cli, на каком блоке сейчас процесс синхронизации
или более подробно:
примеры вывода:
Здесь актуальные блоки на момент выполнения запросов - 81963 и 83903. Проверить актуальный блок в сети bitcoin можно через explorer, например здесь: https://www.blockchain.com/explorer/blocks/btc
Так же запросы к API можно выполнять через curl:
Заключение
В целом, мы подробно рассмотрели простейший запуск bitcoin full ноды через cli, systemd, docker и docker compose, поделали несколько запросов чтобы убедиться что с нодой всё хорошо, проанализировали логи. Глубоко в теорию уходить не стали, так как в интернете об этом достаточно материалов. Все приведенные в статье примеры можно найти в github репозитории.
Если вам было интересно, можете подписаться на мой ТГ-канал - @art_of_chain, там я выкладываю ссылки на последние статьи, примеры команд, напоминаю про ближайшие хардфорки, кратко излагаю основные термины, ну и конечно мемасы, куда уж без них)
Полезные ссылки
Полный список API методов: https://developer.bitcoin.org/reference/rpc/ Official documentation: https://github.com/bitcoin/bitcoin/tree/master/doc Много инфы: https://www.lopp.net/bitcoin-information/full-node.html