Как работает консенсус
В кульминационной статье мы разобрали, почему Proof of Stake работает. Эта страница — механизм, который его запускает: как миллион валидаторов без единого лидера по очереди создают один блок каждые двенадцать секунд и соглашаются с результатом. Слоты, комитеты, эпохи, финальность, строители блоков и вся жизнь валидатора.
- proof of stake
- финальность
В кульминационной статье мы разобрали почему Ethereum использует Proof of Stake: заблокировать реальные деньги, следовать цепочке с наибольшим весом аттестаций и сделать откат финализированного блока настолько дорогим, что он обойдётся в треть всего застейканного ETH. Это принцип. Эта страница — механизм: реальная машина, которая превращает принцип в работающие блоки.
Задача, которую она решает, жестокая: более миллиона валидаторов, рассредоточенных по планете, без лидера и общих часов, должны каждый раз по очереди производить ровно один блок и соглашаться с тем, какие блоки считать действительными — достаточно быстро, чтобы быть полезными, и достаточно дёшево, чтобы каждый мог участвовать. Смотрите, как это собирается — одно исправление за другим.
Разбить время на слоты
Если бы любой валидатор мог публиковать блок когда угодно, миллион из них постоянно бы сталкивался — два блока на одной высоте, и без общих часов невозможно сказать, какой пришёл «первым». Нужно изобрести часы. Разобьём время на фиксированные слот Фиксированное окно длиной 12 секунд. В каждом слоте ровно одному валидатору назначено предложить блок; 32 слота составляют эпоху. по 12 секунд и в каждом слоте назначим ровно одного валидатора предлагающим (proposer) — единственным, кто имеет право создать блок в этот момент. Стабильный, безлидерный ритм: один слот, один предлагающий, один блок.
Пустые слоты допустимы (если предлагающий офлайн, слот просто проходит), и все согласны с расписанием, потому что слоты отсчитываются от фиксированного времени генезиса. У цепочки теперь есть темп.
→ Шаг 2: выбрать предлагающего через лотерею, которую нельзя обмануть.
Общее случайное зерно: RANDAO
Сгенерируем одно число, которому доверяет вся сеть и которое нельзя предсказать, — и используем его, чтобы сопоставить каждый слот с предлагающим. Это число — RANDAO Накапливаемая в цепочке случайность: каждый предлагающий добавляет значение (полученное из своей BLS-подписи) к текущему зерну, так что никто в одиночку не контролирует результат и знать его заранее невозможно. . Каждый предлагающий при создании блока раскрывает значение, выведенное из его подписи, и подмешивает его в текущее зерно. Поскольку итоговое зерно зависит от вкладов каждого, ни один валидатор не может им управлять; а поскольку каждый вклад раскрывается только в момент предложения — заранее его не узнать. Зерно детерминированно выбирает предлагающего для каждого слота — и комитеты, о которых речь пойдёт дальше, — так что любой может пересчитать и проверить назначение, но никто не может его сфальсифицировать.
→ Шаг 3: пусть все проголосуют за то, что видят.
Аттестации: голос от каждого валидатора
Согласие рождается из голосов, а не из власти. Каждый валидатор подаёт аттестация Подписанный голос валидатора, подаваемый раз в эпоху. В нём указывается блок, который валидатор видит головой (голос за выбор форка, fork choice), и пара контрольных точек source-to-target (голос за финальность по Casper-FFG). — подписанный голос, который одновременно говорит две вещи: вот блок, который я вижу головой (голос за выбор форка, добавляющий вес этой ветке) и вот контрольная точка, которую я считаю текущей (голос за финальность — об этом через минуту). Выбор форка (fork choice) затем следует ветке с наибольшим весом аттестующего стейка, поэтому minoritарная ветка никогда не перевесит честное большинство.
Миллион валидаторов не может голосовать в каждом слоте, не затопив сеть, поэтому их делят на комитет Псевдослучайное подмножество валидаторов. Каждый валидатор попадает ровно в один комитет в одном слоте эпохи — в каждом слоте один или несколько комитетов (до 64) — так что каждый валидатор аттестует ровно раз в эпоху. — эпоха состоит из 32 слотов, и каждый валидатор перемешивается ровно в один комитет в одном из них (в слоте может быть несколько комитетов). Каждый валидатор голосует ровно раз в эпоху, в слоте своего комитета. Голоса накапливаются как вес на цепочке.
→ Шаг 4: превратить накопленные голоса в финальность.
Эпохи, обоснование, финализация
Сгруппируем каждые 32 слота в эпоха Промежуток из 32 слотов (~6,4 минуты). На границах эпох стоят контрольные точки; финальность принимается от эпохи к эпохе. — около 6,4 минуты — и будем считать блок на каждой границе контрольной точкой (checkpoint). Голос за финальность внутри каждой аттестации — это голос за контрольную точку. Правило (Casper-FFG) двухступенчатое: когда ≥⅔ всего застейканного ETH аттестует контрольную точку, она становится обоснованной (justified); когда две контрольные точки подряд обоснованы, более ранняя становится финализированной (finalized).
Финализированный означает экономически необратимый: отменить его можно лишь если валидаторы, держащие треть всего стейка, подпишут две противоречивые контрольные точки — это доказуемо, наказуемо слэшингом и разорительно. В нормальной работе блок финализируется примерно через две эпохи (~13 минут) после предложения. Это число, которого ждёт осторожный торговец.
→ Шаг 5: разделить предложение и строительство.
Разделение предлагающего и строителя
Разделим маленькую работу (предложить: подписать один заголовок в свой слот) и большую работу (построить: собрать наиболее выгодный порядок транзакций). Специализированные строители (builders) соревнуются в создании самого прибыльного блока — транзакции из мемпула плюс приватный поток ордеров, оптимально упорядоченные для захвата MEV Maximal Extractable Value — прибыль от выбора того, какие транзакции включить и в каком порядке. Строительство с захватом MEV — специализированная работа, поэтому она отдаётся строителям. — и делают ставку за право, чтобы их блок был предложен. Доверенный релей (relay) хранит в эскроу блоки-кандидаты и показывает предлагающему только заголовки и ставки, но никогда не тела блоков. Предлагающий подписывает заголовок с наибольшей ставкой вслепую — берёт на себя обязательство до того, как увидит содержимое, — и только тогда релей раскрывает тело сети.
Одиночный домашний стейкер, который никогда не обгонит профессиональную команду в строительстве блоков, просто принимает лучшую ставку и зарабатывает столько же. Сегодня это работает как внепротокольный MEV-Boost; встраивание в протокол — enshrined PBS — активно разрабатывается, потому что доверие к релеям остаётся уязвимым местом.
→ Шаг 6: познакомимся с валидатором.
Депозит, аттестации, выход — или слэшинг
Валидатор — это 32 ETH и набор ключей. Его жизнь — конвейер: внести 32 ETH, подождать в ограниченной по темпу очереди активации (чтобы состав валидаторов не менялся рывками), затем стать активным — аттестовать каждую эпоху, предлагать в редкий слот, выпавший по лотерее. Выполняй обязанности правильно и вовремя — получай стабильное вознаграждение; пропускай — плати небольшие штрафы; если цепочка перестаёт финализироваться, утечка бездействия постепенно сокращает стейк отсутствующих валидаторов, пока активные две трети не восстановятся. Чтобы уйти, подай запрос на добровольный выход, подожди в очереди выхода и выведи стейк.
И обрыв, который придаёт реальность всем предыдущим шагам: слэшинг Наказание за доказуемо противоречивые сообщения — предложение двух блоков в одном слоте или подачу конфликтующих аттестаций. Валидатор принудительно выводится, а часть его стейка (вплоть до всего) сжигается. . Подпиши два блока в одном слоте или две конфликтующие аттестации — и любой может подать доказательство; валидатора принудительно выводят, а часть его стейка — вплоть до полного — сжигается. Каждое «они не могут солгать, не потеряв деньги» из кульминационной статьи — это вот это: автоматическое, доказуемое, встроенное в протокол наказание.
Остаток маячной машины
Шесть шагов — это позвоночник; на нём висит горсть реальных механизмов:
- Комитет синхронизации. Ротирующая группа из 512 валидаторов, обновляемая каждые 256 эпох (~27 часов), подписывает каждый заголовок блока. Она нужна, чтобы лёгкие клиенты могли следить за цепочкой, проверяя один небольшой, медленно меняющийся набор подписей вместо миллиона аттестаций.
- Маячная цепочка и исполнение. Всё вышесказанное живёт на консенсусном уровне (beacon chain). Реальные транзакции и исполнение EVM — на уровне исполнения; с момента Слияния (Merge) каждый блок объединяет оба уровня, и консенсусный уровень управляет уровнем исполнения через engine API.
- Агрегация. Отдельные аттестации агрегируются (BLS-подписи объединяются в одну) перед записью в цепочку — именно это позволяет миллиону голосов за эпоху вообще уместиться.
- Лимиты и консолидация валидаторов. Эффективный баланс валидатора ограничен сверху (исторически 32 ETH; увеличен для крупных стейкеров в EIP-7251), чтобы вес оставался пропорциональным, а состав управляемым.