Часть III · Глава 30 из 43 · Shanghai · Capella

EIP-4895: как забрать застейканный ETH без транзакции

После The Merge 32 ETH валидатора и его награды жили на консенсус-слое без пути домой. Обычная транзакция не может их сдвинуть — нет EOA, нет ключа, нечего подписать на слое исполнения. EIP-4895 переворачивает поток: консенсус-слой сам вталкивает выводы в каждый блок, а EVM просто пополняет баланс.

Обновлено 23 июн. 2026 г. · 10 мин
Предполагается
  • The Merge (консенсус- и исполнительный слои)
  • основы стейкинга

После The Merge Ethereum работает как два слоя, скреплённых вместе: консенсус-слой (consensus layer) Beacon-цепочка — она ведёт proof of stake, отслеживает валидаторов и их балансы (стейк в 32 ETH плюс накопленные награды) и решает, какой блок исполнения канонический. Она не исполняет EVM. отслеживает валидаторов и их балансы, а слой исполнения (execution layer) EVM и мировое состояние аккаунтов и контрактов — где живут обычные балансы и исполняются транзакции. Он ничего не знает о балансах валидаторов на beacon-цепочке. исполняет EVM над обычными аккаунтами. ETH можно было положить внутрь (односторонний контракт депозита), но с сентября 2022 года до апгрейда Shanghai/Capella в апреле 2023 года не было способа забрать застейканный ETH обратно. Средства существовали лишь как число на beacon-цепочке, и ничто на слое исполнения не могло их коснуться. EIP-4895 — изящное исправление. Давайте его выведем.

1 шаг В ловушке на CL

Проблема: баланс, до которого не дотянется ни одна транзакция

Деньги валидатора живут на консенсус-слое как обычная запись баланса — 32 ETH стейка плюс всё заработанное. Естественный способ переместить ETH в Ethereum — транзакция: аккаунт подписывает «отправить X к Y». Но валидатор не является аккаунтом слоя исполнения. У него нет EOA, нет приватного ключа, который распознаёт EVM, и нет баланса в состоянии слоя исполнения, с которого можно было бы списать. Так что буквально не существует транзакции, которую кто-либо мог бы написать, чтобы вытянуть эти деньги через границу, — отправителя не существует там, где живут транзакции.

два слоя после Merge консенсус-слой · beacon-цепь валидатор: 32 ETH + награды слой исполнения · аккаунты и EVM ни один аккаунт не хранит стейк ✗ пути назад нет застейканный ETH и награды лежат на CL — без пути на EL
Стейк и награды валидатора лежат на консенсус-слое; обычные аккаунты и EVM живут на слое исполнения. Депозиты текут внутрь в одну сторону, но ничто на стороне исполнения не может подписаться за баланс валидатора или дотянуться до него — так что он не может вернуться.

Два слоя не разделяют модель аккаунтов, а транзакция — это притяжение, инициируемое аккаунтом, которому принадлежат средства. Здесь же владелец средств — реестр валидаторов протокола, а не EOA.

→ Шаг 2: перестаём тянуть и начинаем толкать.

2 шаг Толкать, а не тянуть

Переворачиваем поток: CL вталкивает выводы в блок

Транзакция — это притяжение, которое подписывает владелец средств. Так переверните направление: пусть консенсус-слой толкает. Определите новый объект — вывод (withdrawal) Объект системного уровня, который консенсус-слой вставляет прямо в блок исполнения: { index, validatorIndex, address, amount }. Это не транзакция — у него нет подписи, нет аккаунта-отправителя, и он не стоит газа. Пользователь никогда не может создать его сам. , — который CL вставляет напрямую в каждый блок исполнения. Каждый блок исполнения получает список withdrawals, а заголовок блока — withdrawalsRoot (корень Меркла, фиксирующий этот список, точно так же как transactionsRoot фиксирует транзакции). Слой исполнения не запрашивает их — консенсус-слой передаёт их как часть сборки блока.

CL проталкивает выводы в каждый блок консенсус слой push блок исполнения header · withdrawalsRoot ✓ транзакции подписано · газ · отправитель выводы нет подписи · нет газа новый список выводов + withdrawalsRoot — от CL, не от вас
Каждый блок исполнения получает список withdrawals и withdrawalsRoot в заголовке. В отличие от транзакций — которые несут подпись, отправителя и газ — выводы вталкиваются консенсус-слоем без всего этого; это системные операции, а не пользовательские действия.

Это ключевой сдвиг рамки: вывод — это операция системного уровня, а не транзакция. Никто её не подписывает, у неё нет from, и она не потребляет газ. Деньги двигает сам протокол, а withdrawalsRoot делает набор проверяемым и частью консенсуса.

→ Шаг 3: максимально простая обработка.

3 шаг Просто зачислить баланс

Обработка вывода: увеличить баланс, и всё

Вот насколько мало для этого нужно. Для каждого вывода { index, validatorIndex, address, amount } слой исполнения просто добавляет amount (переведённое из Gwei в Wei) к балансу address. Это вся операция целиком. Это не вызов, несущий значение: никакое исполнение EVM не запускается, никакой код контракта не исполняется, никакой receive() или fallback не срабатывает, и это не стоит газа. Это не может откатиться, потому что исполнять нечего — это безусловное зачисление, протокол чеканит обратно ETH, который уже был застейкан.

обработка = зачислить баланс, и всё вывод index · validatorIndex address · amount (Gwei) аккаунт получателя 10.0 → 12.0 нет вызова EVM · нет газа · код не исполняется безусловное зачисление — не перевод, который мог бы запустить код контракта
Обработка — это чистое увеличение баланса: добавить сумму вывода к адресу получателя. Никакой вызов EVM не совершается, так что никакой код контракта не исполняется, ничто не может откатиться, и газ не тратится — это безусловное зачисление, а не перевод.

Поскольку это полностью обходит EVM, даже контрактный аккаунт, получающий вывод, просто видит рост своего баланса без какого-либо исполнения. index — это глобальный, постоянно растущий счётчик, так что каждый вывод уникален и упорядочен.

→ Шаг 4: два вида, оба автоматические.

4 шаг Снятие сливок против выхода

Два вида — и вы никогда не нажимаете кнопку

Консенсус-слой непрерывно обходит множество валидаторов (скользящий обход) и автоматически испускает выводы в двух формах. частичный вывод (partial withdrawal) Автоматическое «снятие сливок» наград: любой баланс валидатора сверх эффективного потолка в 32 ETH периодически выводится на адрес вывода валидатора, пока сами 32 ETH остаются застейканными и продолжают валидировать. снимает всё сверх потолка эффективного баланса в 32 ETH — ваши награды приходят домой, пока ваш стейк продолжает работать. Полный вывод возвращает весь оставшийся баланс валидатора, как только он полностью вышел из активного множества. Оба требуют, чтобы у валидатора был выставлен признак вывода 0x01, указывающий на адрес слоя исполнения, — а как только это сделано, ETH просто приходит; никакой транзакции вывода отправлять не нужно.

CL сам проходит по набору валидаторов — кнопки «вывести» нет 32 excess 32+ excess 32+ вышел excess 32+ излишек сверх 32 снимается; у вышедшего валидатора возвращается весь стейк оба просто попадают в скользящий проход — кнопку нажимать не нужно
Частичные выводы снимают сливки наград сверх 32 ETH, пока стейк продолжает валидировать; полные выводы возвращают весь баланс вышедшего валидатора. Оба испускаются автоматически обходом консенсус-слоя на адрес вывода валидатора — никакого действия пользователя не требуется.
04 Глубже Куда двигаться дальше