EIP-4895: как забрать застейканный ETH без транзакции
После The Merge 32 ETH валидатора и его награды жили на консенсус-слое без пути домой. Обычная транзакция не может их сдвинуть — нет EOA, нет ключа, нечего подписать на слое исполнения. EIP-4895 переворачивает поток: консенсус-слой сам вталкивает выводы в каждый блок, а EVM просто пополняет баланс.
- 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 — изящное исправление. Давайте его выведем.
Проблема: баланс, до которого не дотянется ни одна транзакция
Деньги валидатора живут на консенсус-слое как обычная запись баланса — 32 ETH стейка плюс всё заработанное. Естественный способ переместить ETH в Ethereum — транзакция: аккаунт подписывает «отправить X к Y». Но валидатор не является аккаунтом слоя исполнения. У него нет EOA, нет приватного ключа, который распознаёт EVM, и нет баланса в состоянии слоя исполнения, с которого можно было бы списать. Так что буквально не существует транзакции, которую кто-либо мог бы написать, чтобы вытянуть эти деньги через границу, — отправителя не существует там, где живут транзакции.
Два слоя не разделяют модель аккаунтов, а транзакция — это притяжение, инициируемое аккаунтом, которому принадлежат средства. Здесь же владелец средств — реестр валидаторов протокола, а не EOA.
→ Шаг 2: перестаём тянуть и начинаем толкать.
Переворачиваем поток: CL вталкивает выводы в блок
Транзакция — это притяжение, которое подписывает владелец средств. Так переверните направление: пусть консенсус-слой толкает. Определите новый объект — вывод (withdrawal) Объект системного уровня, который консенсус-слой вставляет прямо в блок исполнения: { index, validatorIndex, address, amount }. Это не транзакция — у него нет подписи, нет аккаунта-отправителя, и он не стоит газа. Пользователь никогда не может создать его сам. , — который CL вставляет напрямую в каждый блок исполнения. Каждый блок исполнения получает список withdrawals, а заголовок блока — withdrawalsRoot (корень Меркла, фиксирующий этот список, точно так же как transactionsRoot фиксирует транзакции). Слой исполнения не запрашивает их — консенсус-слой передаёт их как часть сборки блока.
Это ключевой сдвиг рамки: вывод — это операция системного уровня, а не транзакция. Никто её не подписывает, у неё нет from, и она не потребляет газ. Деньги двигает сам протокол, а withdrawalsRoot делает набор проверяемым и частью консенсуса.
→ Шаг 3: максимально простая обработка.
Обработка вывода: увеличить баланс, и всё
Вот насколько мало для этого нужно. Для каждого вывода { index, validatorIndex, address, amount } слой исполнения просто добавляет amount (переведённое из Gwei в Wei) к балансу address. Это вся операция целиком. Это не вызов, несущий значение: никакое исполнение EVM не запускается, никакой код контракта не исполняется, никакой receive() или fallback не срабатывает, и это не стоит газа. Это не может откатиться, потому что исполнять нечего — это безусловное зачисление, протокол чеканит обратно ETH, который уже был застейкан.
Поскольку это полностью обходит EVM, даже контрактный аккаунт, получающий вывод, просто видит рост своего баланса без какого-либо исполнения. index — это глобальный, постоянно растущий счётчик, так что каждый вывод уникален и упорядочен.
→ Шаг 4: два вида, оба автоматические.
Два вида — и вы никогда не нажимаете кнопку
Консенсус-слой непрерывно обходит множество валидаторов (скользящий обход) и автоматически испускает выводы в двух формах. частичный вывод (partial withdrawal) Автоматическое «снятие сливок» наград: любой баланс валидатора сверх эффективного потолка в 32 ETH периодически выводится на адрес вывода валидатора, пока сами 32 ETH остаются застейканными и продолжают валидировать. снимает всё сверх потолка эффективного баланса в 32 ETH — ваши награды приходят домой, пока ваш стейк продолжает работать. Полный вывод возвращает весь оставшийся баланс валидатора, как только он полностью вышел из активного множества. Оба требуют, чтобы у валидатора был выставлен признак вывода 0x01, указывающий на адрес слоя исполнения, — а как только это сделано, ETH просто приходит; никакой транзакции вывода отправлять не нужно.