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

Verkle tree — это криптографическая структура данных для коммитмента состояния, которая сочетает идею префиксного дерева (trie) с векторными коммитментами. В экосистеме Ethereum Verkle-дерево рассматривается как замена текущей структуры состояния Merkle Patricia Trie (MPT), чтобы:

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

В Ethereum Verkle строится на базе KZG-коммитментов и векторных коммитментов (vector commitments), что позволяет делать компактные пруфы состояния, почти не зависящие от ширины узла.

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

Зачем Ethereum переходит на Verkle-дерево

Текущая структура состояния Ethereum — Merkle Patricia Trie — надёжна, но создаёт проблемы:

  • Большой размер пруфов.

Для доказательства включения ключа в MPT нужны хеши на каждом уровне дерева. При глубоком дереве и большом состоянии witness получается тяжёлым.

  • Сложность stateless-валидации.

Полноценный stateless-клиент должен получать вместе с блоком весь пруф по каждому чтению/записи в состояние. С MPT суммарный объём данных часто выходит за рамки комфортного p2p-распространения.

  • Рост требований к узлам.

Чем больше state, тем дороже хранить полную БД и обслуживать запросы, что повышает барьер входа для валидаторов и узлов.

Verkle-дерево решает эту связку проблем:

  • Пруфы становятся на порядок компактнее.
  • Блок + witness остаются достаточно лёгкими, чтобы их могли обрабатывать stateless-клиенты.
  • Появляется возможность повышать лимит газа и развивать сеть, не резко повышая требования к железу.

Интуиция: чем Verkle отличается от Merkle/MPT

В классическом Merkle-дереве или MPT:

  • каждый узел хранит хеши детей;
  • доказательство включения ключа — это «ветка» всех соседних хешей по пути от листа к корню;
  • размер пруфа растёт с глубиной дерева: чем глубже состояние, тем больше хешей.

В Verkle:

  • каждый внутренний узел содержит векторный коммитмент к массиву детей (например, 256 значений по индексам 0..255);
  • вместо перечисления всех соседних хешей даётся короткий пруф для конкретного индекса в этом массиве;
  • размер пруфа почти не зависит от числа детей, поэтому можно делать широкие узлы (ветвление 256 и больше), уменьшая глубину дерева.

Идея:

Векторный коммитмент позволяет «зафиксировать» целый массив значений одним компактным отпечатком и затем доказывать корректность каждого элемента по индексу без большого объёма дополнительных данных.

В Ethereum векторные коммитменты реализуются через KZG-полиномиальные коммитменты.

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

  • Коммитмент — криптографический «отпечаток» набора данных: публикуется короткое значение (commitment), которое однозначно связанно с массивом, и позже можно доказать, что определённый элемент входил в этот массив.
  • Векторный коммитмент (vector commitment) — коммитмент к упорядоченному списку значений с возможностью:
    • доказать корректность элемента по индексу;
    • не раскрывать весь список.
  • KZG-коммитмент — полиномиальный коммитмент, позволяющий делать пруфы постоянного размера. Список значений кодируется в многочлен, для него публикуется коммитмент, а доказательство корректности элемента сводится к проверке значения многочлена в точке.
  • Witness (свидетель) — набор данных, который прикладывается к блоку и позволяет узлу, не хранящему состояние, проверить все чтения/записи в state.

Подробнее см. KZG-коммитменты и Векторные коммитменты.

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

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

Ключи состояния: stem и suffix

В спеке Ethereum ключи состояния для Verkle представляют в виде 32 байт, разделённых на:

  • 31 байт — stem («ствол»): общая часть пути для группы связанных значений;
  • 1 байт — suffix («хвост»): индекс ячейки внутри этого stem (0..255).

Идея:

  • все значения, относящиеся к одному аккаунту/слоту стореджа, часто делят один и тот же stem и отличаются только суффиксом;
  • это позволяет батчить пруфы по многим значениям одного stem и сильно экономить на witness.

Подробнее о раскладке ключей см. Размётка ключей состояния в Ethereum.

Типы узлов

Обобщённо в Verkle-дереве выделяют:

  • Внутренние узлы (inner nodes)

Хранят векторный коммитмент к массиву из N детей (обычно N = 256):

  • каждый индекс 0..255 — либо коммитмент следующего узла, либо ссылка на листовые данные;
  • узел публикует только один KZG-коммитмент ко всему массиву.
  • Листовые/extension-узлы

Привязаны к конкретному stem и содержат до 256 значений по всем возможным suffix (0..255):

  • для отсутствующих ячеек хранится «пустое» значение;
  • над массивом значений строится KZG-коммитмент.

При глубине в несколько уровней (обычно 2–3) такое дерево покрывает всё состояние Ethereum, оставаясь значительно мельче, чем MPT.

Как работает доказательство (witness) в Verkle

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

  • путь ключа (stem + suffix) и информация, где именно в дереве лежит значение;
  • доказательство для листового узла:
    • массив значений для данного stem (или его кодированное представление);
    • KZG-пруф, что значение на позиции suffix соответствует коммитменту листа;
  • пруфы по внутренним уровням:
    • для каждого уровня — KZG-пруф, что «коммитмент ребёнка» действительно является элементом массива детей родителя в позиции i;
    • цепочка таких пруфов от листа до корня.

Поскольку:

  • пруфы KZG имеют постоянный размер;
  • глубина дерева мала (широкие узлы);

суммарный witness на одно чтение получается компактным. А при батчинге множества чтений (особенно по одним и тем же stems) общий witness для блока остаётся достаточно небольшим для p2p-сети.

Подробнее см. Stateless-клиенты в Ethereum.

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

Критерий Merkle Patricia Trie (сегодня) Verkle tree (переход)
Тип узлов Хеши детей, ниббл-ветвление Векторные коммитменты, байтовое ветвление (256)
Глубина дерева Значительная, особенно при большом состоянии Меньше уровней за счёт широких узлов
Размер пруфа на ключ Логарифмически растёт с глубиной, много хешей Небольшое число KZG-пруфов, почти не зависит от ветвления
Батчинг чтений Частично помогает, но ветки часто дублируются Лучший эффект: много общих частей witness для одного stem
Stateless-валидация Теоретически возможна, но witness слишком велик Практически достижима, witness укладывается в p2p-ограничения
Удобство для zk Большие Merkle-ветки в публичных входах Меньше данных, проще zk-пруфы поверх state

См. Merkle Patricia Trie для деталей текущей структуры.

Verkle и stateless-клиенты

Цель перехода на Verkle — сделать реалистичным сценарий, в котором узел:

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

Варианты:

  • weak statelessness — узел кэширует часто используемые узлы Verkle-дерева, снижая объём необходимых данных;
  • full statelessness — узел почти не хранит состояние и зависит от внешних источников witness.

Verkle-дерево делает оба варианта реалистичными: witness по блоку укладывается в разумные размеры, что позволяет:

  • запускать валидатор на более дешёвом оборудовании;
  • легче синхронизировать новые узлы;
  • интегрировать Ethereum с лёгкими клиентов на основе Portal Network.

Подробнее: Stateless-клиенты.

Влияние на газовую модель и дизайн контрактов

С Verkle возникает возможность лучше связать стоимость газа с реальной ценой доступа к состоянию:

  • чтения, которые «разбросаны» по многим stems, создают больше нагрузки на witness;
  • компактные, «локальные» по ключам структуры данных используют меньше места в witness.

Ожидаемые последствия:

  • возможна корректировка газовых констант для операций чтения/записи в state;
  • разработчики контрактов будут мотивированы:
    • группировать связанные данные по одним stem;
    • минимизировать хаотичный доступ к state.

Практические советы:

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

См. Газовая модель в Ethereum и Размётка ключей состояния.

Миграция Ethereum с MPT на Verkle

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

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

После миграции:

  • архивные узлы продолжают хранить историю в прежнем формате, но актуальное состояние коммитится уже через Verkle;
  • инструменты и RPC постепенно адаптируются к новой структуре.

См. Апгрейды сети Ethereum.

Verkle, danksharding и L2

Verkle-дерево — часть более широкой картины масштабирования Ethereum:

  • Данктшардинг и блобы данных (EIP-4844 и далее) масштабируют доступность данных для L2-роллапов.
  • PeerDAS и EIP-7251 помогают:
    • эффективнее распределять блоб-данные по узлам;
    • упростить консенсусный слой за счёт укрупнения валидаторов.
  • Verkle уменьшает размер state-witness и делает возможной stateless-валидацию.

Совместно эти направления позволяют:

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

Частые вопросы

Verkle — это просто «улучшенный Merkle»? И да, и нет. Схема «дерево → корневой коммитмент» похожа, но вместо хеш-цепочек используются векторные коммитменты, что радикально меняет размер пруфов и дизайн узлов.

Нужна ли доверительная установка (trusted setup)? Для KZG-коммитментов требуется trusted setup. Ethereum уже прошёл общесетевую церемонию установки для блоб-данных (EIP-4844), и те же артефакты могут повторно использоваться для Verkle. Альтернативы без trusted setup существуют, но хуже по параметрам.

Решит ли Verkle все проблемы масштабирования? Нет. Verkle — это «кирпич» в масштабировании слоя состояния. Вопросы доступности данных, MEV, дизайна L2 и экономики газа остаются отдельными направлениями, которые решаются параллельно.

Что поменяется для разработчиков смарт-контрактов? Код на Solidity не нужно переписывать, но:

  • изменится «настоящая» цена разных паттернов доступа к state;
  • выгоднее станет хранить данные более локально и аккуратно, меньше «скакать» по ключам.

См. также

Task Runner