Развёртывание ноды Bitcoin
Собственная нода Bitcoin нужна когда вам нужна независимость от третьих сторон. Публичные API (Blockstream, BlockCypher) — удобны, но: rate limits, downtime, невозможность делать некоторые RPC-вызовы, privacy (все ваши адреса видит провайдер). Для продакшн-системы приёма платежей или кастодиального сервиса — собственная нода обязательна.
Требования к железу
| Режим | Диск | RAM | CPU | Описание |
|---|---|---|---|---|
| Pruned | 10–15 GB | 2 GB | 2 cores | Хранит только UTXO set + последние N блоков |
| Full | 650+ GB | 4 GB | 4 cores | Полная история транзакций |
| Full + Electrum (Fulcrum) | 1 TB+ | 8 GB | 4+ cores | Для кошельков и адресного поиска |
SSD обязателен — HDD делает initial block download в 3–5 раз медленнее из-за случайных чтений при верификации UTXO set.
Установка Bitcoin Core
# Ubuntu 22.04
wget https://bitcoincore.org/bin/bitcoin-core-27.0/bitcoin-27.0-x86_64-linux-gnu.tar.gz
# Всегда верифицируйте подпись!
wget https://bitcoincore.org/bin/bitcoin-core-27.0/SHA256SUMS
wget https://bitcoincore.org/bin/bitcoin-core-27.0/SHA256SUMS.asc
gpg --recv-keys 152812300785C96444D3334D17565732E08E52E
gpg --verify SHA256SUMS.asc SHA256SUMS
sha256sum --check SHA256SUMS --ignore-missing
tar xzf bitcoin-27.0-x86_64-linux-gnu.tar.gz
sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-27.0/bin/*
Конфигурация ~/.bitcoin/bitcoin.conf:
# Основное
server=1
daemon=1
txindex=1 # Индекс всех транзакций (нужен для lookupByTxId)
# RPC
rpcuser=bitcoinrpc
rpcpassword=STRONG_RANDOM_PASSWORD_HERE
rpcbind=127.0.0.1
rpcallowip=127.0.0.1
# ZMQ — для real-time нотификаций
zmqpubrawblock=tcp://127.0.0.1:28332
zmqpubrawtx=tcp://127.0.0.1:28333
zmqpubhashblock=tcp://127.0.0.1:28334
# Производительность
dbcache=1000 # Кеш для initial sync, МБ
maxmempool=500 # Размер мемпула, МБ
# Для pruned mode (уберите txindex):
# prune=10000 # Хранить 10 GB блоков
txindex=1 — критичен если нужно искать транзакции по хешу. Без него — только текущие UTXO. Включение задним числом требует полного reindex (bitcoind -reindex).
Initial Block Download
IBD на mainnet занимает 1–5 дней на SSD в зависимости от железа. Ускорение:
# Запуск с увеличенным кешем для IBD
bitcoind -dbcache=4000 -daemon
# Мониторинг прогресса
bitcoin-cli getblockchaininfo | jq '.verificationprogress'
# 0.0 → 1.0 (100%)
# Сколько осталось
bitcoin-cli getnetworkinfo | jq '.connections'
ZMQ для реального времени
Polling через RPC каждые несколько секунд — примитивно. ZMQ даёт push-нотификации:
import * as zmq from 'zeromq';
const blockSocket = new zmq.Subscriber();
const txSocket = new zmq.Subscriber();
blockSocket.connect('tcp://127.0.0.1:28334');
blockSocket.subscribe('hashblock');
txSocket.connect('tcp://127.0.0.1:28333');
txSocket.subscribe('rawtx');
// Новый блок
for await (const [topic, message] of blockSocket) {
const blockHash = message.toString('hex');
console.log('New block:', blockHash);
await processNewBlock(blockHash);
}
// Новая транзакция в мемпуле
for await (const [topic, rawTx] of txSocket) {
const tx = bitcoin.Transaction.fromBuffer(rawTx);
await processPendingTransaction(tx);
}
RPC основные вызовы
import * as Client from 'bitcoin-core';
const client = new Client({
host: '127.0.0.1',
port: 8332,
username: 'bitcoinrpc',
password: process.env.BITCOIN_RPC_PASSWORD!,
});
// Информация о транзакции
const tx = await client.getRawTransaction(txHash, true);
// Информация о UTXO
const utxo = await client.getTxOut(txHash, outputIndex);
// Создание нового адреса (для HD wallet лучше использовать bitcoinjs-lib)
const address = await client.getNewAddress('payment_label', 'bech32');
// Текущий fee rate (sat/vB для следующего блока)
const feeRate = await client.estimateSmartFee(1);
// feeRate.feerate в BTC/kB, переводим в sat/vB:
const satPerVbyte = Math.ceil(feeRate.feerate * 100_000);
Безопасность
RPC порт (8332) никогда не открывайте наружу. Доступ только через localhost или VPN:
# Firewall: закрыть RPC снаружи
ufw deny 8332
ufw allow 8333 # P2P порт — должен быть открыт для синхронизации
# Systemd unit для автозапуска
cat > /etc/systemd/system/bitcoind.service << EOF
[Unit]
Description=Bitcoin daemon
After=network.target
[Service]
User=bitcoin
ExecStart=/usr/local/bin/bitcoind -conf=/home/bitcoin/.bitcoin/bitcoin.conf
Restart=on-failure
TimeoutStartSec=infinity
[Install]
WantedBy=multi-user.target
EOF
systemctl enable bitcoind
systemctl start bitcoind
Отдельный системный пользователь bitcoin без sudo — стандартная практика. Файлы кошелька в /home/bitcoin/.bitcoin/wallets/ с резервной копией seed.







