Архитектура 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 состоит из нескольких ключевых компонентов. Они работают вместе, обеспечивая независимую проверку всей истории транзакций.
Компоненты полного узла
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 |
|---|---|---|
Хранение данных | Центральный реестр (одна БД) | Распределённый реестр (~60 000 узлов) |
Модель баланса | Баланс на счёте (account model) | Набор UTXO (нет поля "баланс") |
Валидация | Банк проверяет и одобряет | Каждый узел проверяет независимо |
Отказоустойчивость | Single point of failure | Нет единой точки отказа |
Доступ | KYC, рабочие часы, ограничения | 24/7, без разрешений (permissionless) |
Обработка | Секунды (внутри), дни (международ.) | ~10 минут (1 подтверждение) |
Ключевое архитектурное отличие: банк использует account model (баланс на счёте), а Bitcoin — UTXO model (набор неизрасходованных выходов). В следующем уроке мы подробно разберём модель UTXO.
Ключевые концепции модуля
В этом модуле мы последовательно разберём:
| Урок | Тема | Что вы узнаете |
|---|---|---|
| BTC-02 | Модель UTXO | Как работают транзакции: входы, выходы, сдача, комиссия |
| BTC-03 | Структура блока | 80 байт заголовка, связывание блоков, дерево Меркла |
| BTC-04 | Bitcoin Script | Язык программирования транзакций, стековая машина |
| BTC-05 | Типы транзакций | P2PKH, P2SH, P2WPKH, P2WSH, P2TR (Taproot) |
| BTC-06 | Майнинг и PoW | Поиск nonce, целевое значение, вознаграждение |
| BTC-07 | Корректировка сложности | Алгоритм каждые 2016 блоков |
| BTC-08 | Сетевой протокол | P2P, распространение блоков, IBD |
| BTC-09 | Lightning Network | Платёжные каналы, off-chain транзакции |
| BTC-10 | HTLC и маршрутизация | Атомарные платежи через цепочку каналов |
Связь с криптографией
Всё, что мы изучили в модуле “Криптографические основы”, напрямую применяется в 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-160 | Hash160 для адресов (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.
Практика
Закрепите знания на практике:
-
Bash-лаб (
labs/bitcoin/scripts/lab-01-transactions.sh): Создание транзакций на regtest черезbitcoin-cli. Вы увидите UTXO, отправите транзакцию, соберёте raw transaction вручную. -
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 нет понятия “баланс”, как работают входы и выходы транзакций, и что такое сдача.
Finished the lesson?
Mark it as complete to track your progress