Блокчейн изнутри

Концепции: What Is a Block, Hash Function, Chain: prevHash, Merkle Tree, Why Unfakeable, Nodes, New Block Birth

:::section{mins=2} Что такое блок :::

:::lead [[gloss:block|Блок]] — страница в книге учёта. В нём записаны [[gloss:transaction|транзакции]] за определённый период. :::

:::p{html} Каждый [[gloss:block|блок]] содержит три вещи: [[gloss:transaction|Транзакции]] — список операций: кто, кому, сколько. Один [[gloss:block|блок]] [[gloss:ethereum|Ethereum]]: обычно 100-200 [[gloss:transaction|транзакций]]. [[gloss:hash|Хеш]] предыдущего [[gloss:block|блока]] (prevHash) — «отпечаток» предыдущей страницы. Соединяет [[gloss:block|блоки]] в цепочку. Метаданные — номер [[gloss:block|блока]], время, кто создал, служебная информация. :::

:::callout [[gloss:block|Блок]] — конверт. Внутри — чеки ([[gloss:transaction|транзакции]]). На конверте — номер и отпечаток предыдущего конверта. Конверты в ряд — [[gloss:blockchain|блокчейн]]. :::

:::keypoints{label="Ключевые моменты"}

  • [[gloss:block|Блок]] содержит [[gloss:transaction|транзакции]], [[gloss:hash|хеш]] предыдущего [[gloss:block|блока]] и метаданные
  • prevHash связывает [[gloss:block|блоки]] в неразрывную цепочку
  • Один [[gloss:block|блок]] [[gloss:ethereum|Ethereum]] вмещает обычно 100-200 [[gloss:transaction|транзакций]]
  • Метаданные включают номер [[gloss:block|блока]], время создания и информацию о создателе :::

:::details{badge=Глубже title="Структура блока Ethereum"} :::p{html} [[gloss:bitcoin|Bitcoin]]: UTXO model. Нет «аккаунта с балансом». Есть неизрасходованные выходы [[gloss:transaction|транзакций]] (Unspent Transaction Outputs). Баланс = сумма всех UTXO адреса. [[gloss:transaction|Транзакция]] потребляет (inputs) одни UTXO и создаёт (outputs) новые. Как наличные: отдал $50, получил сдачу $30. :::

:::p{html} [[gloss:ethereum|Ethereum]]: Account model. Два типа аккаунтов: EOA (обычный [[gloss:wallet|кошелёк]], [[gloss:private key|приватный ключ]]) и Contract Account ([[gloss:smart contract|смарт-контракт]], код). Каждый аккаунт: nonce, balance, storageRoot, codeHash. [[gloss:transaction|Транзакция]] изменяет state напрямую: balance[from] -= value, balance[to] += value. :::

:::p Следствие: [[gloss:bitcoin|Bitcoin]] — сканировать ~90M UTXO для баланса. [[gloss:ethereum|Ethereum]] — одно поле в state trie. Но state trie растёт: полная [[gloss:node|нода]] 1TB+. :::

:::p Размер [[gloss:block|блока]]: [[gloss:bitcoin|Bitcoin]] ~1-4 MB (после SegWit). [[gloss:ethereum|Ethereum]] — ограничен [[gloss:gas|gas]] (30M gas limit), не размером. Время [[gloss:block|блока]]: [[gloss:bitcoin|Bitcoin]] ~10 мин (difficulty). [[gloss:ethereum|Ethereum]] — 12 сек (фиксировано, slot-based). Solana ~400 мс. ::: :::

:::further{label="Для углублённого изучения"}

:::quiz{id=q-1-2-s1 correct=2 explanation="Верно. Адреса в блокчейне псевдонимны — они не содержат реальных личностей. Блок хранит транзакции, хеш предыдущего блока (звено цепи), временную метку и метаданные."} Чего НЕТ внутри блока?

  • Транзакции
  • Хеш предыдущего блока
  • Личность каждого отправителя транзакций
  • Временную метку и метаданные :::

:::section{mins=2} Хеш-функция :::

:::lead [[gloss:hash|Хеш]] превращает любые данные в короткую строку фиксированной длины. Как отпечаток пальца — уникальный. :::

:::p{html} Три свойства: Детерминизм: одни данные → всегда один [[gloss:hash|хеш]]. «Hello» → всегда тот же отпечаток. Лавинный эффект: один символ изменился → [[gloss:hash|хеш]] полностью другой. Нельзя предсказать. Необратимость: из [[gloss:hash|хеша]] невозможно восстановить данные. Мясорубка: фарш обратно в мясо не собрать. :::

:::callout Мясорубка для данных. Закидываешь что угодно — получаешь строку одинаковой длины. Обратно не собрать. :::

:::keypoints{label="Ключевые моменты"}

  • [[gloss:hash|Хеш]]-функция всегда возвращает строку фиксированной длины, независимо от размера входных данных
  • Детерминизм гарантирует одинаковый результат для одинаковых данных
  • Лавинный эффект: малейшее изменение входа полностью меняет [[gloss:hash|хеш]]
  • Необратимость: из [[gloss:hash|хеша]] невозможно восстановить исходные данные
  • В [[gloss:blockchain|блокчейне]] [[gloss:hash|хеши]] связывают [[gloss:block|блоки]], адреса, Merkle Tree и идентифицируют [[gloss:transaction|транзакции]] :::

:::details{badge=Глубже title="SHA-256, Keccak-256 и пространство хешей"} :::p{html} [[gloss:bitcoin|Bitcoin]]: SHA-256 (двойное хеширование: SHA-256(SHA-256(data))). Двойное — защита от length extension attacks конструкции Merkle-Damgård. :::

:::p{html} [[gloss:ethereum|Ethereum]]: Keccak-256. Выбран до финализации SHA-3. NIST изменил padding в финальной версии → Keccak-256 ≠ SHA-3-256. Иногда вызывает путаницу в коде. :::

:::p Пространство [[gloss:hash|хешей]]: 2^256 ≈ 1.16 × 10^77. Атомов во Вселенной ≈ 10^80. При 10 млрд [[gloss:hash|хешей]]/сек полный перебор: ~3.67 × 10^60 лет. Возраст Вселенной: 1.38 × 10^10 лет. :::

:::p{html} Birthday problem: collision возможен после ~2^128 попыток (не 2^256). Это 3.4 × 10^38 — непрактично. Поэтому «128-bit security» для SHA-256. :::

:::p [[gloss:mining|Майнинг]] [[gloss:bitcoin|Bitcoin]]: brute-force подбор nonce, чтобы [[gloss:hash|хеш]] начинался с N нулей. Текущая difficulty: ~71 ведущий нуль в бинарном. Вероятность: 1 из 2^71 ≈ 1 из 2.36 × 10^21. ::: :::

:::further{label="Для углублённого изучения"}

:::quiz{id=q-1-2-s2 correct=2 explanation="Верно. Это лавинный эффект. Даже изменение одного бита даёт полностью другой хеш. Именно поэтому хеши работают как отпечатки — любое изменение немедленно обнаруживается."} Ты меняешь один символ в файле и вычисляешь SHA-256 хеш. Что происходит?

  • Хеш меняется ровно на один символ
  • Хеш меняется незначительно, пропорционально правке
  • Хеш меняется полностью — совершенно другая строка
  • Хеш остаётся прежним если изменено меньше 10% :::

:::section{mins=2} Цепочка: prevHash :::

:::lead Каждый [[gloss:block|блок]] содержит [[gloss:hash|хеш]] предыдущего. Это создаёт неразрывную цепочку. :::

:::p{html} Измени [[gloss:transaction|транзакцию]] в [[gloss:block|блоке]] #1 → его [[gloss:hash|хеш]] изменится → prevHash в #2 не совпадёт → #2 недействителен → #3 недействителен → вся цепочка после изменения сломана. Каскадный эффект: изменить [[gloss:block|блок]] #100 = пересчитать #100 → #101 → #102 → ... → все до текущего. [[gloss:ethereum|Ethereum]]: ~19 млн+ [[gloss:block|блоков]]. Пересчитать быстрее, чем сеть добавляет новые — невозможно. :::

:::callout Стена из кирпичей, где каждый «помнит» форму предыдущего. Вытащи один — все сверху рухнут. :::

:::keypoints{label="Ключевые моменты"}

  • Каждый [[gloss:block|блок]] хранит [[gloss:hash|хеш]] предыдущего [[gloss:block|блока]] (prevHash), образуя цепочку
  • Изменение одного [[gloss:block|блока]] каскадно ломает все последующие [[gloss:block|блоки]]
  • Пересчитать миллионы [[gloss:block|блоков]] быстрее сети практически невозможно
  • Распределённость: тысячи [[gloss:node|узлов]] хранят оригинальную копию цепочки :::

:::details{badge=Глубже title="Genesis Block и финальность"} :::p{html} [[gloss:genesis block|Genesis Block]] ([[gloss:block|блок]] #0): prevHash = 0x0000...0000. [[gloss:bitcoin|Bitcoin]] [[gloss:genesis block|genesis]]: текст «The Times 03/Jan/2009 Chancellor on brink of second bailout for banks». [[gloss:ethereum|Ethereum]] [[gloss:genesis block|genesis]]: 30 июля 2015, начальное распределение ETH. Посмотреть: etherscan.io/block/0 :::

:::p{html} [[gloss:finality|Финальность]]: [[gloss:bitcoin|Bitcoin]]: ~6 подтверждений (~60 мин). Вероятностная. [[gloss:ethereum|Ethereum]] [[gloss:proof of stake|PoS]]: 2 эпохи (~12.8 мин). Casper FFG: checkpoint с 2/3 голосов → justified → следующий justified → предыдущий finalized. Отмена finalized = [[gloss:slashing|slashing]] ≥1/3 [[gloss:validator|валидаторов]] = $10+ млрд. :::

:::p Solana: несколько секунд (optimistic confirmation). ::: :::

:::further{label="Для углублённого изучения"}

:::section{mins=2} Дерево Меркла :::

:::lead Позволяет быстро проверить [[gloss:transaction|транзакцию]] без скачивания всего [[gloss:block|блока]]. :::

:::p{html} [[gloss:block|Блок]]: 100-200 [[gloss:transaction|транзакций]]. Как быстро проверить, что конкретная — там? Merkle Tree — дерево [[gloss:hash|хешей]]. Снизу: [[gloss:hash|хеш]] каждой [[gloss:transaction|транзакции]]. Пары [[gloss:hash|хешей]] объединяются вверх. И так до вершины — Merkle Root. Доказать Tx B в [[gloss:block|блоке]]: нужны только Hash(A) и Hash(CD). Не все [[gloss:transaction|транзакции]]. Это Merkle Proof. Light Clients: мобильные [[gloss:wallet|кошельки]] скачивают только заголовки (~500 MB вместо 1 TB) и запрашивают Merkle Proof для своих [[gloss:transaction|транзакций]]. :::

:::callout Турнирная сетка. Чтобы проверить участника — пройди его путь до финала, не нужно знать все матчи. :::

:::keypoints{label="Ключевые моменты"}

  • Merkle Tree организует [[gloss:hash|хеши]] [[gloss:transaction|транзакций]] в древовидную структуру с единым корнем (Merkle Root)
  • Merkle Proof позволяет доказать наличие [[gloss:transaction|транзакции]], предоставив лишь логарифмическое число [[gloss:hash|хешей]]
  • Light Clients используют Merkle Proof вместо скачивания полного [[gloss:blockchain|блокчейна]]
  • [[gloss:ethereum|Ethereum]] хранит transactionsRoot и receiptsRoot в заголовке каждого [[gloss:block|блока]] :::

:::details{badge=Глубже title="Merkle Patricia Trie и Verkle Trees"} :::p{html} [[gloss:ethereum|Ethereum]] использует Merkle Patricia Trie — гибрид Patricia Trie (поиск по ключу) + Merkle Tree (верификация). :::

:::p Три дерева в каждом [[gloss:block|блоке]]: State Trie (все аккаунты, ключ = адрес), Transaction Trie ([[gloss:transaction|транзакции]], ключ = индекс), Receipt Trie (результаты). :::

:::p stateRoot охватывает ~400M+ аккаунтов. Один [[gloss:hash|хеш]] = весь [[gloss:ethereum|Ethereum]]. :::

:::p{html} Verkle Trees (будущее, The Verge): Vector commitment + Merkle. Proof ~150 байт vs ~1 KB у Merkle. Критично для stateless clients — [[gloss:node|нод]] без state, получающих proof с каждым [[gloss:block|блоком]]. EIP-6800. ::: :::

:::further{label="Для углублённого изучения"}

:::quiz{id=q-1-2-s4 correct=2 explanation="Верно. Каждый блок содержит хеш предыдущего. Измени блок #500 — его хеш изменится, что сделает невалидным блок #501 (который ссылается на него), затем #502 и так далее. Нужно переделать всю цепочку с этой точки быстрее чем честная сеть добавляет новые блоки."} Атакующий хочет изменить транзакцию в блоке #500. Что ему нужно сделать?

  • Переподписать только эту транзакцию
  • Пересчитать только блок #500
  • Пересчитать блок #500 и все последующие блоки
  • Ничего — старые блоки можно свободно редактировать :::

:::section{mins=2} Почему невозможно подделать :::

:::lead Пересчитать миллионы [[gloss:block|блоков]] быстрее сети — дороже, чем играть честно. :::

:::p{html} Три уровня защиты: [[gloss:cryptography|криптографический]] (каскадное разрушение цепочки), вычислительный (огромные ресурсы для пересчёта), социальный (тысячи [[gloss:node|узлов]] с оригиналом). Представь книгу, пронумерованную отпечатками пальцев, копии которой хранят тысячи людей по всему миру. Подделать одну страницу — значит переписать все следующие и убедить тысячи людей принять твою версию. :::

:::howto{label="Как это понять"}

  • [[gloss:blockchain|Блокчейн]] намеренно медленный. Стоимость добавления [[gloss:block|блока]] — это стоимость атаки. Убери её — и безопасности нет.
  • [[gloss:hash|Хеш]] — это отпечаток. Измени один символ где угодно — весь отпечаток меняется. Именно поэтому цепочку нельзя подделать.
  • Любой компьютер может запустить [[gloss:node|ноду]] и проверить каждую [[gloss:transaction|транзакцию]] в истории. Не нужно никому доверять — можно проверить самому. :::

:::callout Представь книгу, пронумерованную отпечатками пальцев, копии которой хранят тысячи людей по всему миру. Подделать одну страницу — значит переписать все следующие и убедить тысячи людей принять твою версию. :::

:::keypoints{label="Ключевые моменты"}

  • Три уровня защиты: [[gloss:cryptography|криптографический]], вычислительный и социальный
  • Изменение [[gloss:block|блока]] требует пересчёта всех последующих — это каскадный эффект
  • Экономическая стоимость атаки на крупные сети исчисляется миллиардами долларов
  • Безопасность сети пропорциональна её размеру и стоимости стейка/хешрейта
  • Даже успешная атака обесценивает саму сеть, делая её экономически иррациональной :::

:::details{badge=Глубже title="Стоимость атаки и реальные случаи"} :::p{html} Стоимость атаки на [[gloss:ethereum|Ethereum]]: нужно ≥1/3 стейка для остановки, ≥2/3 для подделки. Стейк: ~30M+ ETH. Стоимость 1/3: ~$25+ млрд. Купить 10M ETH невозможно — обвалит цену. Плюс [[gloss:slashing|slashing]]. :::

:::p{html} [[gloss:bitcoin|Bitcoin]] 51% attack: >50% hashrate. Текущий: ~600+ EH/s. Стоимость: миллиарды $. После атаки [[gloss:bitcoin|Bitcoin]] обесценивается — атакующий теряет. :::

:::p Экономически иррационально для крупных сетей. Реальные атаки на малые сети: Ethereum Classic (2020): 3 атаки за месяц, reorg на 3,693 блока, ~$5.6M [[gloss:double spending|double-spent]]. Причина: крошечный hashrate vs ETH mainnet. Вывод: безопасность пропорциональна размеру сети. $100K hashrate — дёшево атаковать. $100B — нереально. :::

:::p{html} Long-range attack ([[gloss:proof of stake|PoS]]): старые ключи [[gloss:validator|валидаторов]] → альтернативная цепочка. Защита: weak subjectivity checkpoint (синхронизация не старше ~2 недель). :::

:::p{html} Selfish mining ([[gloss:bitcoin|Bitcoin]]): секретная цепочка, публикация когда длиннее. Eyal & Sirer (2013): невыгодно при <25% hashrate. ::: :::

:::further{label="Для углублённого изучения"}

:::section{mins=2} Узлы :::

:::lead [[gloss:node|Узел]] — компьютер с копией [[gloss:blockchain|блокчейна]], проверяющий [[gloss:transaction|транзакции]]. Больше [[gloss:node|узлов]] = надёжнее сеть. :::

:::p{html} Full [[gloss:node|Node]]: текущее состояние, проверяет каждый [[gloss:block|блок]]. Основа [[gloss:decentralization|децентрализации]]. Light [[gloss:node|Node]]: только заголовки. Запрашивает Merkle Proof. Твой мобильный [[gloss:wallet|кошелёк]]. Archive [[gloss:node|Node]]: ВСЁ + вся история изменений каждого аккаунта. Огромный. Etherscan, Dune. RPC-провайдеры: MetaMask подключён к Infura (ConsenSys) по умолчанию — централизованная точка. Infura outage (ноябрь 2020) «отключил» MetaMask для миллионов. [[gloss:blockchain|Блокчейн]] работал, пользователи не видели. Альтернативы: Alchemy, QuickNode, свой [[gloss:node|узел]]. :::

:::callout Full [[gloss:node|Node]] — библиотекарь (знает всё текущее). Light [[gloss:node|Node]] — посетитель с каталогом (просит показать страницу). Archive [[gloss:node|Node]] — хранилище всех редакций за все годы. :::

:::keypoints{label="Ключевые моменты"}

  • Full [[gloss:node|Node]] хранит текущее состояние и проверяет каждый [[gloss:block|блок]] — основа [[gloss:decentralization|децентрализации]]
  • Light [[gloss:node|Node]] скачивает только заголовки (~500 MB) и использует Merkle Proof
  • Archive [[gloss:node|Node]] хранит всю историю изменений (13+ TB) — нужен Etherscan, Dune и аналитикам
  • [[gloss:ethereum|Ethereum]] имеет ~8,000+ [[gloss:node|нод]], [[gloss:bitcoin|Bitcoin]] — ~15,000+
  • RPC-провайдеры (Infura, Alchemy) дают доступ к [[gloss:blockchain|блокчейну]] без запуска своего [[gloss:node|узла]] :::

:::details{badge=Глубже title="Execution и Consensus клиенты Ethereum"} :::p{html} Два клиента после The Merge: Execution Client (EL): Geth (~55%), Nethermind (~30%), Besu, Erigon. Consensus Client (CL): Prysm (~35%), Lighthouse (~30%), Teku, Lodestar, Nimbus. :::

:::p{html} Client diversity — критическая метрика. Баг в клиенте с >66% доли → ошибочная [[gloss:finality|финализация]] → honest minority [[gloss:slashing|slashed]] (парадокс). Geth + Prysm = доминирующая пара = риск. :::

:::p{html} [[gloss:validator|Валидатор]]: 32 ETH (~$80K+). Альтернативы: Rocket Pool (8 ETH), Lido (любая сумма через stETH). :::

:::p Требования: Full [[gloss:node|Node]] (Geth): ~800 GB - 1 TB, 16 GB RAM, SSD. Archive [[gloss:node|Node]]: 13+ TB, 64+ GB RAM, NVMe. Light Client: ~500 MB, смартфон. ::: :::

:::further{label="Для углублённого изучения"}

:::quiz{id=q-1-2-s6 correct=1 explanation="Верно. Полные ноды не майнят — они верифицируют. Каждая полная нода независимо проверяет каждую транзакцию по правилам. Чем больше независимых верификаторов, тем сложнее протолкнуть невалидные транзакции."} Почему запуск полной ноды повышает безопасность сети?

  • Полные ноды майнят новые блоки и получают награды
  • Полные ноды независимо верифицируют каждую транзакцию — больше нод значит больше независимых проверок
  • Полные ноды шифруют блокчейн чтобы посторонние не могли его читать
  • Полные ноды обеспечивают ликвидность сети :::

:::section{mins=2} Рождение нового блока :::

:::lead Каждые 12 секунд в [[gloss:ethereum|Ethereum]] [[gloss:validator|валидатор]] собирает [[gloss:transaction|транзакции]] из [[gloss:mempool|мемпула]] и создаёт [[gloss:block|блок]]. :::

:::p{html} Путь [[gloss:transaction|транзакции]]: «Send» в MetaMask → подпись [[gloss:private key|приватным ключом]] → [[gloss:mempool|Мемпул]] — зал ожидания неподтверждённых [[gloss:transaction|транзакций]] → [[gloss:validator|Валидатор]] отбирает [[gloss:transaction|транзакции]] для [[gloss:block|блока]] → [[gloss:block|Блок]] создан, подписан, разослан → Другие [[gloss:validator|валидаторы]] проверяют и голосуют (attestation) → Через 2 эпохи (~12.8 мин) — [[gloss:finality|финализация]] навсегда. EIP-1559: часть [[gloss:gas|gas]] сжигается, при высокой нагрузке ETH становится дефляционным. :::

:::callout [[gloss:mempool|Мемпул]] — зал ожидания в аэропорту. [[gloss:gas|Gas]] price — класс билета. Business (высокий [[gloss:gas|gas]]) — первый. Economy (низкий) — ждёт. :::

:::keypoints{label="Ключевые моменты"}

  • [[gloss:transaction|Транзакция]] проходит путь: подпись -> [[gloss:mempool|мемпул]] -> отбор [[gloss:validator|валидатором]] -> [[gloss:block|блок]] -> attestation -> [[gloss:finality|финализация]]
  • [[gloss:mempool|Мемпул]] — это очередь неподтверждённых [[gloss:transaction|транзакций]], приоритет определяется [[gloss:gas|gas]] price
  • Время [[gloss:block|блока]] в [[gloss:ethereum|Ethereum]] фиксировано: 12 секунд (слот)
  • EIP-1559: часть [[gloss:gas|gas]] сжигается, при высокой нагрузке ETH становится дефляционным
  • [[gloss:finality|Финализация]] занимает ~12.8 минут (2 эпохи) через механизм Casper FFG :::

:::details{badge=Глубже title="Ethereum PoS: слоты, эпохи и MEV-Boost"} :::p{html} [[gloss:ethereum|Ethereum]] [[gloss:proof of stake|PoS]] — подробно: Время: slots (12 сек) и epochs (32 slots = 6.4 мин). Каждый slot: случайный proposer из [[gloss:validator|валидаторов]]. На практике: ~90% [[gloss:block|блоков]] через MEV-Boost (Proposer-Builder Separation). Builder оптимизирует порядок, proposer выбирает [[gloss:block|блок]] с наивысшей ценой. Остальные [[gloss:validator|валидаторы]] — attesters, голосуют за валидность. Checkpoint с 2/3 голосов → justified → [[gloss:finality|finalized]]. :::

:::p{html} Вознаграждение: базовое (~0.02-0.05 ETH) + priority fees + [[gloss:mev|MEV]] tips. Base fee (EIP-1559): часть [[gloss:gas|gas]] сжигается. Загруженная сеть = сжигается больше ETH, чем выпускается = дефляционный ETH. :::

:::p{html} Proposer-Builder Separation (PBS): Searchers → [[gloss:mev|MEV]]-возможности. Builders → оптимальные [[gloss:block|блоки]]. Proposers → выбирают [[gloss:block|блок]] с лучшей ценой. Топ-3 builder-а: ~80% [[gloss:block|блоков]]. Новая централизация. SUAVE ([[gloss:flashbots|Flashbots]]) — попытка решения. :::

:::p{html} Timing games: proposer-ы задерживают публикацию до конца slot-а для большего [[gloss:mev|MEV]]. Если слишком долго — missed slot. Blob transactions (EIP-4844, Dencun, 2024): данные L2 rollups. Не хранятся вечно (~18 дней). Снизили стоимость L2 в 10-100x. [[gloss:gas|Gas]] на Arbitrum/Base: $0.001-0.01. ::: :::

:::further{label="Для углублённого изучения"}