Verkle tree — компактные доказательства состояния для «stateless» Ethereum

Verkle tree — криптографическая структура данных для коммитмента состояния на основе векторных коммитментов. Задумана как замена Merkle Patricia Trie (MPT) в экосистеме Ethereum и других блокчейнов для уменьшения размера свидетельств (witness), ускорения валидации и достижения режима stateless clients — узлов, которые могут валидировать блоки без хранения полного состояния.

В классических меркловых деревьях доказательство требует «ветку» из хешей по каждому уровню. В Verkle используются векторные коммитменты (в Ethereum — вариант на базе KZG-полиномиальных коммитментов), за счёт чего доказательства компактны и почти не растут с шириной узла. Это позволяет выбирать широкие узлы (ветвление 256 и более), уменьшая глубину и общий размер свидетеля.

Зачем это нужно:

  • кратно меньшие witness для доступа к состоянию;
  • возможность stateless-валидации (узел валидирует блок, получая только свидетельство состояния, — без «тяжёлой» синхронизации);
  • потенциальное снижение требований к оборудованию для валидаторов и рост децентрализации;
  • облегчение будущих направлений (zk-EVM, более высокие лимиты газа при прочих равных, упрощённый быстрый старт узлов).

См. также: Блокчейн — как устроен распределённый реестр, KZG-коммитменты (создать), векторные коммитменты (создать), stateless-клиенты (создать), Merkle Patricia Trie (создать).

Интуиция: почему Merkle-ветка «распухает», а Verkle — нет

  • В Merkle/MPT для доказательства включения ключа нужно перечислять соседние хеши на каждом уровне дерева — получается логарифмический по глубине и довольно «толстый» набор данных. Чем глубже дерево (чем меньше ветвление и больше состояние), тем длиннее «ветка».
  • В Verkle каждый внутренний узел хранит коммитмент к массиву дочерних значений. Доказательство «вытягивает» не все соседние хеши, а пруф корректности конкретной позиции в векторе, на который «ссылается» коммитмент. Поскольку векторные коммитменты допускают компактные пруфы (в Ethereum выбран KZG), размер пруфа почти не зависит от числа детей. Поэтому можно делать широкие узлы (например, с ветвлением 256), резко уменьшая глубину дерева и суммарный объём свидетеля.

Базовые понятия

  • Коммитмент. Криптографическая «связка» на набор данных: вы публикуете компактный «отпечаток» (commitment) и позже можете доказать, что конкретное значение было частью зафиксированного набора.
  • Векторный коммитмент. Коммитмент на упорядоченный список значений с возможностью доказать корректность элемента по индексу. Важные свойства — компактность пруфа и проверяемость относительно опубликованного коммитмента.
  • KZG-коммитменты. Полиномиальные коммитменты (Kate–Zaverucha–Goldberg), позволяющие делать постоянного размера пруфы корректности значения многочлена в точке. В контексте Verkle список дочерних значений «вкладывается» в полином, который коммитится, — а доказательство корректности «позиции» сводится к проверке значения полинома. См. Kzg Commitments.
  • Witness (свидетель). Набор данных, который поставляется вместе с блоком/транзакцией и позволяет узлу проверить корректность чтений состояния без локального доступа к полному состоянию.

Структура Verkle-дерева

По смыслу Verkle — это trie (префиксное дерево) с широкими узлами и особой схемой коммитмента/доказательств.

Ключи состояния. В Ethereum-спеке ключ представляют в виде 32-байтного ключа особой формы:

31-байтовый stem — «ствол» пути (основная часть ключа),

1-байтовый suffix — «хвост», который различает тип/ячейку значения в этом «стволе» (например, слоты стореджа, код аккаунта, поля заголовка аккаунта и т. п.).

Такое разбиение упрощает батчинг чтений и уменьшает повторяемость пруф-частей: много обращений к разным suffix одного и того же stem «делят» часть сведений в общем свидетеле.

Типы узлов (обобщённо):

  • Внутренние (inner) узлы — содержат векторный коммитмент (набор «детей» по индексам 0..255). Значения детей — это либо следующие узлы (их коммитменты/ссылки), либо листовые значения.
  • Extension/leaf-узлы — «развилки» на концах путей, привязанные к stem и хранящие до 256 «ячеек» по всем возможным suffix (0..255) для данного ствола. Отсутствующие ячейки трактуются как пустые.
  • Ветвление и глубина. Типичный выбор для Ethereum — ветвление 256 (ширина по одному байту пути за уровень). Это даёт малую глубину (обычно 2–3 уровня до extension-узла) и высокую «совместимость» с байтовыми ключами.

См. также: Размётка state-ключей в Ethereum (создать), Патриция-tries (создать).

Как строится корень состояния

Как и в Merkle/MPT, над всем деревом считается корневой коммитмент (root), который включается в заголовок блока. Разница в том, что:

  • на каждом внутреннем узле фиксируется KZG-коммитмент к массиву «детей» (256 позиций);
  • листовые/extension-узлы фиксируют коммитмент к ячейкам для данного stem;
  • верификация чтений/записей состояния сводится к проверке KZG-пруфов от листа к корню.

Доказательства (witness): принцип работы

Чтобы проверить доступ к значению V = state[key], валидатору, который не хранит состояние, нужно получить от построителя блока witness:

Путь ключа (stem + suffix) и указание, в какой «ячейке» хранится V;

Пруф корректности для соответствующего extension-узла: «массив 256 ячеек действительно коммитится в опубликованный коммитмент листа, и в позиции suffix лежит V»;

Пруфы для внутренних уровней, что «коммитмент листа является элементом массива детей у родителя в позиции i», и так — пока не дойдём до корня.

Благодаря KZG-пруфам и широким узлам количество передаваемых данных компактно: в среднем оценка порядка сотен байт на аккаунт/ключ, а общий witness для блока с батчингом чтений остаётся приемлемым для p2p-распространения. Это ключ к stateless-клиентам: они не держат state, но «видят» достаточно, чтобы проверить корректность доступа.

См. Stateless Clients.

Сравнение: Merkle Patricia Trie vs Verkle

Критерий MPT (сегодня) Verkle (переход)
Тип узлов Хеши детей; узкие ветви Векторные коммитменты; широкие ветви (256+)
Глубина Больше (особенно из-за хекcари-ветвления/нибблов) Меньше (байтовое ветвление 256)
Размер пруфа (на ключ) Значительный: ветка хешей по уровням Компактный: KZG-пруфы по уровням
Батчинг чтений Частично помогает, но верхние уровни дублируются Выигрыш выше: общий контекст узлов + компактные KZG
Stateless-валидация Теоретически возможна, но witness велик Практически применима: witness кратно меньше
Совместимость с zk Есть, но большие Merkle-ветки Более «дружественен» к zk-пруфам (меньше данных/вызовов)

См. Merkle Patricia Trie, Kzg Commitments, Stateless Clients.

Почему KZG (и какие есть альтернативы)

KZG даёт постоянного размера пруфы и быструю проверку, опирается на pairing-кривые и доверительную установку (toxic waste) — это архитектурный компромисс, принятый экосистемой Ethereum ранее (см. EIP-4844 для блобов данных) и повторно используемый для Verkle.

Альтернативные конструкции (векторные коммитменты на основе Pedersen/IPA, SNARK-доказательства поверх бинарных Merkle и др.) обсуждаются в исследовательских ветках: они могут убирать доверительную установку, но часто проигрывают по скорости/размеру пруфа или усложняют внедрение. В продакшен-цепочке Ethereum ставка сделана на KZG как на уже «обкатанную» технологию.

См. Kzg Commitments, системы доказательств (создать).

«Стебли» и «суффиксы»: как ключи экономят witness

Разделение ключа на 31-байтовый stem + 1-байтовый suffix даёт два эффекта:

  • Плотная укладка «ячейек» в одном листе по всем суффиксам 0..255 — меньше уникальных листов в пруфе;
  • Шаринг пруф-частей между разными доступами в рамках одного stem (типично для чтений одного аккаунта/его стореджа): повторно используемые куски не дублируются в общем witness блока.

Это — один из главных источников выигрыша над MPT, где ветка для каждого слота часто уникальна на многих уровнях.

См. State Layout.

Stateless-клиенты: что меняется в узлах

В режиме stateless у узла нет локальной БД состояния (или есть неполная/кэш).

Вместо этого:

  • блок (или набор транзакций) приходит вместе с witness по всем чтениям/записям состояния;
  • узел проверяет корректность каждого доступа (чтение/предыдущее значение, корректность изменения) относительно корня состояния и транзакционной логики;
  • после валидации узел может выбросить witness (если не кэширует), продолжая оставаться «тонким» валидатором.

Варианты: weak-statelessness (узлы кэшируют часто используемые узлы дерева/ветви) и full-statelessness (минимальный/нулевой кэш). На практике в Ethereum курс в сторону weak-statelessness как «рабочего» компромисса на первом этапе.

См. Stateless Clients, Portal Network (создать).

Газовая модель и доступ к состоянию

Когда чтения состояния «упакованы» в компактный witness, возникает желание привязать газ-стоимость не только к операциям EVM, но и к реальной цене доступа к состоянию (размеру/сложности свидетеля):

  • дороже обходится доступ к «раскиданным» по префиксам ключам;
  • дешевле — батчированные/локализованные доступы (много суффиксов у одного stem).

Внедрение Verkle в Ethereum предполагает коррекцию газовых констант и правил доступа к state, чтобы нагрузка отражала реальную цену сети. Это поощряет разработчиков хранить данные компактно и «локально» по ключам.

См. Газовая модель в Ethereum (создать).

Миграция с MPT на Verkle: общая логика

Полная замена «коммитмента состояния» в публичном блокчейне — деликатная операция. Для Ethereum дорожная карта включает:

  • Фазу подготовки: тестовые реализации, соответствие спецификации, генерация двух параллельных корней (MPT и Verkle) на стенде;
  • Инструменты миграции: преобразование ключей/данных в новую раскладку (stems/suffixes), построение начального Verkle-дерева;
  • Проверки и инварианты: совпадение «смыслового» состояния (балансы, сторедж) при переходе;
  • Активацию хардфорка: блок, в котором узлы начинают проверять только Verkle-корень в заголовке.

После перехода узлы, не обновившиеся на Verkle, выпадут из консенсуса (несовместимый корень/правила). Поэтому релиз сопровождается долгим тестированием и коммуникацией для операторов узлов.

См. Merkle Patricia Trie, Апгрейды сети Ethereum (создать), Portal Network.

Взаимосвязь с другими направлениями (L2, DA, zk)

  • L2/роллапы. Меньшие witness и лучшая модель доступа к состоянию улучшают данные для доказательств и встроенные вызовы L2→L1, особенно в zk-сценариях.
  • DA (доступность данных). Verkle не заменяет data availability (см. EIP-4844 и блобы), но «подтягивает» слой состояния к более компактным доказательствам.
  • zk-EVM. Более «дружелюбный» к zk формат prуфов снижает накладные расходы на L1-верификацию (меньше публичных входов, меньше Merkle-веток), упрощая zk-путь.

См. Роллапсы — оптимистические и zk: как это работает, Danksharding/блобы (создать), Zk Evm (создать).

Примерный порядок выигрышей (интуитивно)

  • На один ключ: вместо длинной Merkle-ветки — постоянного порядка пруф для листа и каждого уровня (обычно 2–3).
  • На блок: за счёт батчинга обращений к одним и тем же stems многие части свидетеля не дублируются; итоговый объём укладывается в рамки безопасной p2p-передачи в слоте.

Численные оценки зависят от параметров сети, числа уникальных stems, шаблонов доступа контрактов, но именно снижение witness на порядки и делает stateless-валидацию практичной.

См. Stateless Clients.

Инженерные аспекты и имплементация

Ключевые задачи для клиентов/валидаторов:

  • Реализовать KZG-операции (коммитменты/пруфы/верификация) одинаково в основных клиентах (geth, Nethermind, Erigon и др.).
  • Встроить кодеки для ключей (stem/suffix), согласовать форматы сериализации узлов Verkle.
  • Реализовать хранилище (on-disk) и кэширование горячих узлов, чтобы узлы-производители блоков и полноузловые операторы могли работать эффективно.
  • Обновить RPC/трейсеры/инструменты (отладка, архивные узлы, снапшоты).
  • Подобрать параметры ширины узлов (256 — де-факто стандарт), конфигурацию «пустых» ячеек и правила pruning.

Безопасность:

  • Проверка корректности библиотек эллиптической криптографии (pairings).
  • Поддержание/проверка trusted setup (как и в EIP-4844): артефакты церемонии, верификация и общественный аудит.
  • Инварианты корректности (например, «нет несогласованности между старым MPT-состоянием и Verkle» в фазе подготовки).

См. Kzg Commitments, Клиенты Ethereum (создать).

Типичные вопросы (FAQ)

Это «ещё один вид Merkle»? Нет. Идея похожа (дерево → корневой коммитмент), но криптографический механизм другой: векторные коммитменты вместо хеш-цепочек. Это даёт более короткие доказательства и позволяет делать широкие узлы.

Что с доверительной установкой? Для KZG нужен trusted setup. Альтернативы без него существуют, но хуже по параметрам/сложности. В Ethereum уже есть опыт безопасной церемонии (для блобов), поэтому экосистема склоняется к reuse этого подхода.

Verkle решит все проблемы масштабирования? Нет. Это «кирпич» в стене масштабирования: уменьшает state-witness, открывает дорогу stateless-валидации, но вопросы доступности данных, MEV, L2-архитектуры и экономики газа остаются отдельными направлениями.

Как это повлияет на разработчиков смарт-контрактов? Косвенно. Изменится базовая стоимость доступа к состоянию (в газовой модели), будут предпочтительны локальные по ключам схемы хранения и батчированные операции. Код на Solidity не «ломается», но паттерны хранения стоит пересмотреть.

Практические рекомендации разработчикам

  • Проектируйте ключи «локально». Храните связанные слоты так, чтобы они попадали в один stem и разные suffix — это удешевит witness при батчинге.
  • Минимизируйте «разброс» чтений. Старайтесь, чтобы транзакция (или батч) обращались к меньшему числу stems.
  • Журналируйте доступы. Профилируйте, какие ключи и в каком паттерне опрашивает ваш контракт, — это поможет оптимизировать газ после перехода.
  • Готовьте миграцию. Если вы храните сложные структуры в MPT-ключах, спланируйте «мэппинг» на (stem, suffix) и протестируйте миграционные процедуры.

См. Gas Model, State Layout.

Термины и определения

  • Vector commitment (векторный коммитмент): коммитмент к массиву значений с короткими пруфами по индексу. См. Vector Commitment.
  • KZG: полиномиальный коммитмент с постоянного размера пруфом; основа для Verkle в Ethereum. См. Kzg Commitments.
  • Witness: данные для проверки чтений состояния без локального state. См. Stateless Clients.
  • Stem/Suffix: схема разбиения ключа состояния (31+1 байт), уменьшающая дублирование данных в witness. См. State Layout.

Хронология и статус (обобщённо)

Период Событие Значение
2021 Публичные спецификации/посты о Verkle и статлессности Выбор векторных коммитментов (KZG), оценка выигрыша в witness
2023–2024 Клиентские прототипы, тестовые сети, эксперименты с двойным коммитментом Подготовка миграции MPT→Verkle, стабилизация кодеков
2025 Интеграция в дорожную карту Ethereum (после EIP-4844/PeerDAS, параллельно с Pectra/Fusaka) Фокус на снижении порога входа для узлов и stateless-валидации

См. Network Upgrades.

Связанные и рекомендуемые страницы в нашей Wiki

Базовые: Блокчейн — как устроен распределённый реестр, Merkle Patricia Trie, Kzg Commitments, Stateless Clients, Роллапсы — оптимистические и zk: как это работает, Gas Model, Portal Network

Криптовалюты: Биткоин (BTC) — что это такое и как работает, Ethereum

Персоны/идеи: Виталик Бутерин, Ник Сабо

Перспективные (создать): Векторные коммитменты: практика и свойства, Ключи состояния и layout в Ethereum, Системы доказательств для L1/L2

Task Runner