Перейти к содержанию
Learning Platform
Начальный
20 минут
Bitcoin Архитектура Узлы P2P сеть Блокчейн

Архитектура Bitcoin

Зачем это блокчейну?

Bitcoin — это не просто криптовалюта. Это распределённая система, где тысячи независимых узлов поддерживают общую историю транзакций без центрального сервера. Каждый узел самостоятельно проверяет каждый блок и каждую транзакцию, не доверяя другим участникам сети.

В этом модуле мы разберём, как это работает изнутри — от структуры транзакций до Lightning Network. Вы поймёте не просто что делает Bitcoin, а почему каждый компонент спроектирован именно так.

# Это то, что происходит каждые ~10 минут в сети Bitcoin:
# 1. Узлы получают транзакции от пользователей
# 2. Майнеры собирают транзакции из mempool в блок
# 3. Майнер находит nonce: SHA256d(header) < target
# 4. Блок рассылается по P2P сети
# 5. Каждый узел НЕЗАВИСИМО проверяет блок
# 6. Валидный блок добавляется в цепочку

import hashlib

def sha256d(data: bytes) -> bytes:
    """Double SHA-256 -- основная хеш-функция Bitcoin"""
    return hashlib.sha256(hashlib.sha256(data).digest()).digest()

# Пример: Genesis Block header (80 байт) -> block hash
genesis_header_hex = (
    "01000000"  # version
    "0000000000000000000000000000000000000000000000000000000000000000"  # prev hash
    "3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"  # merkle root
    "29ab5f49"  # timestamp
    "ffff001d"  # nbits
    "1dac2b7c"  # nonce
)
header_bytes = bytes.fromhex(genesis_header_hex)
block_hash = sha256d(header_bytes)
# Результат (little-endian -> display): 000000000019d6689c...
print(f"Genesis Block Hash: {block_hash[::-1].hex()[:16]}...")

Обзор архитектуры

Каждый полный узел (full node) Bitcoin состоит из нескольких ключевых компонентов. Они работают вместе, обеспечивая независимую проверку всей истории транзакций.

Архитектура узла Bitcoin
P2P СетьMempoolВалидация блоковUTXO SetКошелёкRPC интерфейс
P2P Сеть
Mempool
Валидация блоков
UTXO Set
Кошелёк
RPC интерфейс

Компоненты полного узла

P2P Сеть — узел поддерживает TCP-соединения с 8-125 другими узлами. Через них он получает новые блоки, транзакции и адреса других узлов. Протокол использует бинарные сообщения с magic bytes, командой и чексуммой.

Mempool — пул неподтверждённых транзакций. Когда пользователь отправляет транзакцию, она попадает в mempool узла, где ждёт включения в блок. Каждая транзакция проходит полную валидацию перед попаданием в mempool.

Валидация блоков — проверка Proof-of-Work (хеш < target), структуры заголовка, всех транзакций в блоке и соблюдения правил консенсуса. Если хоть одно правило нарушено — блок отклоняется.

UTXO Set — множество всех неизрасходованных выходов (~100 миллионов записей). Это ядро Bitcoin: именно по UTXO Set проверяется, может ли транзакция тратить указанные входы.

Кошелёк — управление ключами и создание транзакций. В Bitcoin Core 30.2 используются только descriptor wallets (дескрипторные кошельки). Кошелёк отслеживает баланс как сумму UTXO, которые он может потратить.

RPC интерфейс — JSON-RPC API для взаимодействия с узлом. Через него работают bitcoin-cli, кошельки и приложения.

Bitcoin vs традиционная банковская система

Чтобы понять архитектуру Bitcoin, полезно сравнить её с привычной банковской системой.

Bitcoin vs банковская система
АспектБанковская системаBitcoin
Хранение данных
Центральный реестр (одна БД)Распределённый реестр (~60 000 узлов)
Модель баланса
Баланс на счёте (account model)Набор UTXO (нет поля "баланс")
Валидация
Банк проверяет и одобряетКаждый узел проверяет независимо
Отказоустойчивость
Single point of failureНет единой точки отказа
Доступ
KYC, рабочие часы, ограничения24/7, без разрешений (permissionless)
Обработка
Секунды (внутри), дни (международ.)~10 минут (1 подтверждение)
Ключевое отличиеВ банке баланс -- это запись в БД. В Bitcoin баланс вычисляется из набора UTXO. Нет центрального хранилища балансов.

Ключевое архитектурное отличие: банк использует account model (баланс на счёте), а Bitcoin — UTXO model (набор неизрасходованных выходов). В следующем уроке мы подробно разберём модель UTXO.

Ключевые концепции модуля

В этом модуле мы последовательно разберём:

УрокТемаЧто вы узнаете
BTC-02Модель UTXOКак работают транзакции: входы, выходы, сдача, комиссия
BTC-03Структура блока80 байт заголовка, связывание блоков, дерево Меркла
BTC-04Bitcoin ScriptЯзык программирования транзакций, стековая машина
BTC-05Типы транзакцийP2PKH, P2SH, P2WPKH, P2WSH, P2TR (Taproot)
BTC-06Майнинг и PoWПоиск nonce, целевое значение, вознаграждение
BTC-07Корректировка сложностиАлгоритм каждые 2016 блоков
BTC-08Сетевой протоколP2P, распространение блоков, IBD
BTC-09Lightning NetworkПлатёжные каналы, off-chain транзакции
BTC-10HTLC и маршрутизацияАтомарные платежи через цепочку каналов

Связь с криптографией

Всё, что мы изучили в модуле “Криптографические основы”, напрямую применяется в Bitcoin:

Криптографическая основаПрименение в BitcoinУроки
SHA-256Хеширование блоков, txid, адресаCRYPTO-05, CRYPTO-06
ECDSA (secp256k1)Подписание транзакций (legacy, SegWit)CRYPTO-11
Schnorr подписиПодписание транзакций (Taproot/P2TR)CRYPTO-12
Деревья МерклаMerkle Root в заголовке блокаCRYPTO-13, CRYPTO-14
RIPEMD-160Hash160 для адресов (SHA-256 + RIPEMD-160)CRYPTO-05

Endianness в Bitcoin

Важная техническая деталь, которая часто вызывает путаницу: Bitcoin использует little-endian для внутреннего хранения, но отображает хеши в big-endian (reversed).

import hashlib

# Пример: txid
raw_tx = bytes.fromhex("01000000...")  # сериализованная транзакция

# Внутренний формат (little-endian):
internal_hash = hashlib.sha256(hashlib.sha256(raw_tx).digest()).digest()
print(f"Внутренний (LE): {internal_hash.hex()[:16]}...")

# Формат отображения (big-endian / reversed):
display_hash = internal_hash[::-1]
print(f"Отображение (BE): {display_hash.hex()[:16]}...")

# bitcoin-cli возвращает в формате отображения (reversed)
# python-bitcoinlib:
# lx("abcd...")    -- из display (BE) в internal (LE)
# b2lx(bytes)     -- из internal (LE) в display (BE) строку

Запомните: то, что вы видите в bitcoin-cli — это reversed byte order. При работе с библиотеками используйте lx() для преобразования display -> internal и b2lx() для internal -> display.

Практика

Закрепите знания на практике:

  1. Bash-лаб (labs/bitcoin/scripts/lab-01-transactions.sh): Создание транзакций на regtest через bitcoin-cli. Вы увидите UTXO, отправите транзакцию, соберёте raw transaction вручную.

  2. Python notebook (labs/crypto/notebooks/10-bitcoin-transactions.ipynb): Программная работа с транзакциями через python-bitcoinlib. Подключение к regtest, парсинг транзакций, конструирование P2WPKH.

# Запуск лаба:
docker compose -f labs/bitcoin/docker-compose.yml up -d
docker exec bitcoin-regtest bash /scripts/init-regtest.sh
docker exec bitcoin-regtest bash /scripts/lab-01-transactions.sh

Что дальше?

В следующем уроке мы разберём модель UTXO — фундаментальную концепцию Bitcoin. Вы узнаете, почему в Bitcoin нет понятия “баланс”, как работают входы и выходы транзакций, и что такое сдача.

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс