Запуск Bitcoin Full Node

Запуск Bitcoin Full Node

Несмотря на то, что у большинства людей при слове Bitcoin возникает ассоциация с криптовалютой, торговлей и прочим, мало кто задумывается, что эта криптовалюта работает благодаря одноименной технологии - блокчейну Bitcoin. В статье мы кратко пройдемся по теории и больше времени уделим практике - глянем настройки клиента сети, соберем его в docker контейнер и поделаем запросы через curl. Ставьте приятную для вас фоновую музыку и поехали!

Содержание:

Bitcoin blockchain - это peer-to-peer сеть, созданная специально для того, чтобы работать по наборам определенных правил (consensus). Эти правила регулируют процесс проверки транзакций таким образом, что сеть Bitcoin становится невосприимчивой к мошенничеству c транзакциями, не прибегая при этом к централизованной архитектуре. Сеть опирается на данные нескольких узлов/нод, которые независимо друг от друга проверяют новые операции и передают свои результаты другим узлам для дальнейшего анализа, проверки и формирования блока.

Запуск Bitcoin Full Node

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 и распаковываем:

wget https://bitcoincore.org/bin/bitcoin-core-30.0/bitcoin-30.0-x86_64-linux-gnu.tar.gz tar -xzf bitcoin-30.0-x86_64-linux-gnu.tar.gz cd bitcoin-30.0/bin/

Запускаем full-ноду в сети основной сети mainnet:

./bitcoind -daemon

Всё.

Запуск Bitcoin Full Node

Нода запущена в виде сервиса в фоновом режиме c параметрами по-умолчанию. После старта, начнётся загрузка блоков в папку /home/bitcoin/.bitcoin/blocks. Полная синхронизация займет примерно 8-12ч (+-в зависимости от характеристик узла).

Проверить статус синхронизации можно через клиент:

./bitcoin-cli -getinfo
Запуск Bitcoin Full Node

Для настройки автозапуска при загрузки систем можно создать простой systemd service в linux (в официальном репозитории есть более расширенный вариант:

cat > /etc/systemd/system/bitcoind.service << EOF [Unit] Description=Bitcoin daemon After=network.target [Service] Type=forking User=bitcoin Group=bitcoin ExecStart=/usr/local/bin/bitcoind -daemon -conf=/opt/bitcoind/bitcoin.conf PIDFile=/var/lib/bitcoind/bitcoind.pid Restart=on-failure RestartSec=60 TimeoutStopSec=600 [Install] WantedBy=multi-user.target EOF
sudo systemctl enable bitcoind sudo systemctl start bitcoind sudo systemctl status bitcoind

Для запуска в сети testnet используем флаг -testnet:

./bitcoind -daemon -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 позволяет вручную вызвать сжатие данных до заданной высоты.

Это лишь базовые аргументы — полный список можно увидеть через

bitcoind --help

Если флагов много, то есть смысл создать файл конфигурации, где будут перечислены все необходимые флаги со нужным значением. Кстати, в официальном репо есть скрипт, который генерирует этот конфиг gen-bitcoin-conf.sh

Генерируем rpcauth

rpcauth - аргумент, который отвечает за указание авторизационных данных в формате <USERNAME>:<SALT>lt;HASH>. Это безопаснее, чем хранить пароль в открытом виде. Скрипт для создания такого аргумента лежит в официальном репозитории.

Скачаем скрипт:

wget https://raw.githubusercontent.com/bitcoin/bitcoin/master/share/rpcauth/rpcauth.py chmod +x rpcauth.py

Сгенерируйте хэшированый пароль для пользователя admin так:

python3 rpcauth.py admin

можно с конкретным паролем:

python3 rpcauth.py admin mysecretpassword123

После отработки скрипта получаем ответ:

String to be appended to bitcoin.conf: rpcauth=admin:b14315532b86cf87e6f02dd242cef92b$8b5434859bd349bdb881b4a1d0fa44f82184fc06e1d786013fdce2bdd29e7a53 Your password: mysecretpassword123

Теперь занесем сгенерированную строку в файл конфигурации, например:

cat > bitcoin.conf << EOF # Network settings listen=1 port=8333 maxconnections=125 # RPC server=1 rpcbind=0.0.0.0 rpcallowip=172.16.0.0/12 rpcallowip=10.0.0.0/8 rpcallowip=127.0.0.1 rpcport=8332 # Security rpcauth # python3 rpcauth.py admin rpcauth=admin:b14315532b86cf87e6f02dd242cef92b$8b5434859bd349bdb881b4a1d0fa44f82184fc06e1d786013fdce2bdd29e7a53 # Data datadir=/opt/bitcoind/data txindex=1 dbcache=2048 # Logging printtoconsole=1 debug=0 # ZMQ for real-time notifications (опционально) zmqpubrawblock=tcp://0.0.0.0:28332 zmqpubrawtx=tcp://0.0.0.0:28333 zmqpubhashtx=tcp://0.0.0.0:28333 zmqpubhashblock=tcp://0.0.0.0:28332 EOF

Запускаем ноду в docker-контейнере

Для изолированного запуска в docker контейнере создадим небольшой Dockerfile:

FROM debian:stable-slim AS builde ARG USER_ID=1000 ARG GROUP_ID=1000 ARG BITCOIN_VERSION=30.0 ENV BITCOIN_VERSION=${BITCOIN_VERSION} \ BITCOIN_ROOT=/opt/bitcoind \ BITCOIN_BIN=/opt/bitcoind/bin \ BITCOIN_DATA=/opt/bitcoind/data \ PATH=/opt/bitcoind/bin:$PATH RUN apt-get update && apt-get install -y wget tar ca-certificates \ && rm -rf /var/lib/apt/lists/* RUN groupadd -g ${GROUP_ID} bitcoin && \ useradd -u ${USER_ID} -g bitcoin -s /bin/bash -m bitcoin RUN mkdir -p ${BITCOIN_BIN} ${BITCOIN_DATA} \ && chown -R bitcoin:bitcoin ${BITCOIN_ROOT} COPY bitcoin.conf ${BITCOIN_ROOT}/bitcoin.conf RUN cd /opt \ && wget https://bitcoincore.org/bin/bitcoin-core-${BITCOIN_VERSION}/bitcoin-${BITCOIN_VERSION}-x86_64-linux-gnu.tar.gz \ && tar -xzf bitcoin-${BITCOIN_VERSION}-x86_64-linux-gnu.tar.gz -C /opt \ && mv /opt/bitcoin-${BITCOIN_VERSION}/bin/* ${BITCOIN_BIN}/ \ && rm -rf /opt/bitcoin-${BITCOIN_VERSION} /opt/bitcoin-${BITCOIN_VERSION}-x86_64-linux-gnu.tar.gz EXPOSE 8332 8333 18332 18333 # 18443 18444 Uncomment for regtest VOLUME ["${BITCOIN_DATA}"] USER bitcoin WORKDIR ${BITCOIN_ROOT} ENTRYPOINT ["bitcoind"] CMD ["-printtoconsole", "-conf=${BITCOIN_ROOT}/bitcoin.conf"]

Собираем образ и запускаем ноду:

docker build -t bitcoin-core . --no-cache --progress=plain docker run --name bitcoin-mainnet -v $PWD/data:/data -v $PWD/bitcoin.conf:/opt/bitcoind/bitcoin.conf -p 8333:8333 -p 8332:8332 bitcoin-core

Смотрим логи:

docker logs -f bitcoin-mainnet
Запуск Bitcoin Full Node

Из логов видно, что нода поднялась без ошибок и считала конфигурацию из файла bitcoin.conf. Здесь же можно следить за процессом синхронизации - сначала должна пройти пре-синхронизаиця (Pre-synchronizing blockheaders) и синхронизация заголовков блоков (Synchronizing blockheaders) и после нода начнет скачивать блоки (UpdateTip: new best)

Запуск Bitcoin Full Node

height=1 - показывает актуальный скаченный блок
progress=0.000000 - общий прогресс

Запускаем ноду через docker compose

Для запуска через “docker compose” сначала создадим папку для данных с нужными правами

mkdir -p data && chown -R 1000:1000 ./data/

Далее, создаем docker-compose.yaml

cat > docker-compose.yaml << EOF services: bitcoind: build: context: . dockerfile: Dockerfile args: BITCOIN_VERSION: 30.0 container_name: bitcoin-mainnet restart: unless-stopped deploy: resources: limits: cpus: '2.0' memory: 4G reservations: cpus: '1.0' memory: 2G volumes: - ./data:/opt/bitcoind/data - ./bitcoin.conf:/opt/bitcoind/bitcoin.conf:ro ports: - "8333:8333" - "127.0.0.1:8332:8332" - "127.0.0.1:28332:28332" - "127.0.0.1:28333:28333" healthcheck: test: ["CMD", "bitcoin-cli", "-conf=/opt/bitcoind/bitcoin.conf", "getblockchaininfo"] interval: 30s timeout: 10s retries: 3 start_period: 120s EOF

Запускаем и проверяем логи

docker compose up -d --build docker compose logs -f bitcoin-mainnet
Запуск Bitcoin Full Node

Примеры запросов

Проверить статус блокчейна через cli, на каком блоке сейчас процесс синхронизации

docker exec -it bitcoin-mainnet bitcoin-cli \ -rpcconnect=127.0.0.1 \ -rpcport=8332 \ -rpcuser=admin \ -rpcpassword=mysecretpassword123 \ getblockcount

или более подробно:

docker exec -it bitcoin-mainnet bitcoin-cli \ -rpcconnect=127.0.0.1 \ -rpcport=8332 \ -rpcuser=admin \ -rpcpassword=mysecretpassword123 \ getblockchaininfo

примеры вывода:

docker exec -it bitcoin-mainnet bitcoin-cli -rpcconnect=127.0.0.1 -rpcport=8332 -rpcuser=admin -rpcpassword=mysecretpassword123 getblockcount 81963 docker exec -it bitcoin-mainnet bitcoin-cli -rpcconnect=127.0.0.1 -rpcport=8332 -rpcuser=admin -rpcpassword=mysecretpassword123 getblockchaininfo { "chain": "main", "blocks": 83903, "headers": 921747, "bestblockhash": "000000000024a5e2a58b49cb11bfc80bf0f10f30dd55cf7c60cd670669e6b62c", "bits": "1b31b2a3", "target": "000000000031b2a3000000000000000000000000000000000000000000000000", "difficulty": 1318.670050153592, "time": 1286457534, "mediantime": 1286456673, "verificationprogress": 9.960287813533725e-05, "initialblockdownload": true, "chainwork": "000000000000000000000000000000000000000000000000008c9192a1f548c0", "size_on_disk": 41759874, "pruned": false, "warnings": [ ] }

Здесь актуальные блоки на момент выполнения запросов - 81963 и 83903. Проверить актуальный блок в сети bitcoin можно через explorer, например здесь: https://www.blockchain.com/explorer/blocks/btc

Так же запросы к API можно выполнять через curl:

curl --location --request POST --header 'Content-Type: application/json' -u admin:b14315532b86cf87e6f02dd242cef92b$8b5434859bd349bdb881b4a1d0fa44f82184fc06e1d786013fdce2bdd29e7a53 --data-raw '{"jsonrpc": "1.0", "id": "0", "method": "getblockchaininfo", "params": []}' http://127.0.0.1:8332 | jq

Заключение

В целом, мы подробно рассмотрели простейший запуск bitcoin full ноды через cli, systemd, docker и docker compose, поделали несколько запросов чтобы убедиться что с нодой всё хорошо, проанализировали логи. Глубоко в теорию уходить не стали, так как в интернете об этом достаточно материалов. Все приведенные в статье примеры можно найти в github репозитории.

Если вам было интересно, можете подписаться на мой ТГ-канал - @art_of_chain, там я выкладываю ссылки на последние статьи, примеры команд, напоминаю про ближайшие хардфорки, кратко излагаю основные термины, ну и конечно мемасы, куда уж без них)

Полезные ссылки

1
1 комментарий