Древовидная структура Веркле

Дерево Веркла — это схема обязательств, которая работает аналогично дереву Меркла, но имеет гораздо меньшие свидетели. Он работает, заменяя хэши в дереве Меркла векторным обязательством, что делает более широкие факторы ветвления более эффективными.

Спасибо Kevaundray Wedderburn за отзыв о публикации.

Обзор

Подробнее о том, как работают деревья верклей, см.:

  • Запись в блоге Данкрада
  • Запись в блоге Виталика
  • Посмотрите EIP на попытках Verkle

Цель этого поста — объяснить конкретную компоновку черновика дерева верклей EIP. Он предназначен для разработчиков клиентов, которые хотят внедрить верклевные деревья и ищут введение, прежде чем углубляться в EIP.

Деревья Веркле вносят ряд изменений в древовидную структуру. Наиболее существенные изменения:

  • переключение с 20-байтовых ключей на 32-байтовые ключи (не путать с 32-байтовыми адресами, которые являются отдельным изменением);
  • объединение попыток учетной записи и хранилища; и, наконец,
  • Появление самого Verkle Trie, в котором вместо хэшей используются векторные обязательства.

В качестве схемы векторных обязательств для дерева Веркла мы используем обязательства Педерсена. . Обязательства Педерсена основаны на эллиптических кривых. Общие сведения об обязательствах Педерсена и о том, как использовать их в качестве полиномиальных или векторных обязательств с использованием аргументов внутреннего продукта, см. здесь.

Кривая, которую мы используем, называется Bandersnatch. Эта кривая была выбрана потому, что она является производительной, а также потому, что она позволит эффективным SNARK в BLS12_381 рассуждать о дереве верклей в будущем. Это может быть полезно для накопительных пакетов, а также позволяет выполнить обновление, при котором все свидетели могут быть сжаты в один SNARK, как только это станет практичным, без необходимости дальнейшего обновления обязательств.

Порядок кривой/скалярный размер поля bandersnatch составляет p =13108968793781547619861935127046491459309155893440570251786403306729687672801 , что является 253-битным простым числом. В результате мы можем безопасно фиксировать только битовые строки длиной не более 252 бит, иначе поле переполнится. Мы выбрали коэффициент ветвления (ширину) 256 для дерева вершин, что означает, что каждое обязательство может фиксировать до 256 значений по 252 бита каждое (или, если быть точным, целые числа до p - 1 ). Мы записываем это как Commit(v₀, v₁, …, v₂₅₅) чтобы зафиксировать список v длины 256.

Макет дерева верклей

Одна из целей разработки EIP дерева верклеров — сделать доступ к соседним позициям (например, хранилищу с почти таким же адресом или соседним фрагментам кода) дешевым. Для этого ключ состоит из основы из 31 байта и суффикса одного байта, всего 32 байта. Схема ключей разработана таким образом, что «близкие» места хранения сопоставляются с одной и той же основой и другим суффиксом. Подробности см. в черновике EIP.

Таким образом, само дерево вершин состоит из двух типов узлов:

  • Узлы расширения , которые представляют 256 значений с одной основой, но с разными суффиксами.
  • Внутренние узлы , у которых может быть до 256 дочерних узлов, которые могут быть либо другими внутренними узлами, либо узлами расширения.

Привязка к узлу расширения — это привязка к 4-элементному вектору; остальные позиции будут 0. Это:

C₁ и C₂ — еще два обязательства, которые фиксируют все значения, основа которых равна основе. . Причина, по которой нам нужны обязательства, заключается в том, что значения имеют 32 байта, но мы можем хранить только 252 бита на элемент поля. Таким образом, одного обязательства недостаточно для хранения 256 значений. Поэтому вместо этого C₁ хранит значения для суффикса от 0 до 127, а C₂ хранит значения от 128 до 255, где значения разделены на две части, чтобы соответствовать размеру поля (мы вернемся к этому позже).

Расширение вместе с обязательствами C₁ и C₂ называется «деревом расширений и суффиксов» (сокращенно EaS).

Рисунок 1 Представление обхода дерева вершин для ключа 0xfe0002abcd..ff04 :путь проходит через 3 внутренних узла с 256 дочерними узлами в каждом (254, 0, 2), один узел расширения представляет abcd..ff и два обязательства дерева суффиксов, включая значение для 04 , в₄. Обратите внимание, что основа на самом деле это первые 31 байт ключа, включая путь через внутренние узлы.

Приверженность конечным узлам значений

Каждый узел дерева расширений и суффиксов содержит 256 значений. Поскольку значение имеет ширину 256 бит, и мы можем безопасно хранить только 252 бита в одном элементе поля, четыре бита будут потеряны, если мы просто попытаемся сохранить одно значение в одном элементе поля.

Чтобы обойти эту проблему, мы решили разделить группу из 256 значений на две группы по 128 значений в каждой. Каждое 32-байтовое значение в группе разбивается на два 16-байтовых значения. Таким образом, значение V ᵢ∈ 𝔹₃₂ превращается в V⁽ˡᵒʷᵉʳ⁾ᵢ ∈ 𝔹₁₆ и v⁽ᵘᵖᵖᵉʳ⁾ᵢ∈ 𝔹₁₆ такое, что v⁽ˡᵒʷᵉʳ⁾ᵢ ++ v⁽ᵘᵖᵖᵉʳ⁾ᵢ =vᵢ.

К v⁽ˡᵒʷᵉʳ⁾ᵢ добавляется «маркер листа», чтобы различать лист, к которому никогда не обращались, и лист, который был перезаписан нулями. Ни одно значение не удаляется из дерева верклей . Это необходимо для предстоящих схем истечения срока действия. Этот маркер установлен на 129-м бите, т.е. v⁽ˡᵒʷᵉʳ ᵐᵒᵈⁱᶠⁱᵉᵈ⁾ᵢ =v⁽ˡᵒʷᵉʳ⁾ᵢ + 2¹²⁸ если vᵢ доступен до доступа ранее, и v⁽ˡᵒʷᵉʳ ᵐᵒᵈⁱᶠⁱᵉᵈ⁾ᵢ =0, если vᵢ никогда не доступен.

Затем два обязательства C₁ и C₂ определяются как

Обязательство узлов расширения

Обязательство к узлу расширения состоит из «маркера расширения», который представляет собой просто число 1, двух обязательств поддерева C₁ и C₂ и основы. ключа, ведущего к этому узлу расширения.

В отличие от узлов расширения в дереве Меркла-Патриции, которые содержат только раздел ключа, соединяющий родительский внутренний узел с дочерним внутренним узлом, стебель покрывает весь ключ до этой точки. Это связано с тем, что деревья верклов разработаны с учетом доказательств без сохранения состояния:если вставляется новый ключ, который «разделяет» расширение на две части, более старый родственный элемент не нужно обновлять, что позволяет получить меньшее доказательство.

Обязательство внутренних узлов

Внутренние узлы имеют более простой метод расчета своих обязательств:узел рассматривается как вектор из 256 значений, которые являются (полевое представление) корневым обязательством каждого из их 256 поддеревьев. Обязательство для пустого поддерева равно 0. Если поддерево не пусто, то обязательство для внутреннего узла равно

где Cᵢ — дочерние элементы внутреннего узла, и 0, если дочерний элемент пуст.

Вставка в дерево

На рис. 2 показан процесс вставки нового значения в дерево, который становится интересным, когда стволы сталкиваются в нескольких начальных байтах.

Рисунок 2 Значение v₁₉₂ вставляется по адресу 0000010000...0000 в дереве верклей, содержащем только значение v₁₂₇ по адресу 0000000000...0000 . Поскольку основы различаются в третьем байте, два внутренних узла добавляются до отличающегося байта. Затем вставляется другое дерево «расширение-и-суффикс» с полным 31-байтовым стволом. Начальный узел остается нетронутым, а C²₀ имеет то же значение, что и C⁰₀ перед вставкой.

Меньше деревьев, меньше доказательств

Структура вертикального дерева делает деревья более мелкими, что уменьшает объем хранимых данных. Однако его реальная сила исходит из способности производить меньшие доказательства, т. е. свидетелей. Это будет объяснено в следующей статье.


Ethereum
  1. Блокчейн
  2. Биткойн
  3. Ethereum
  4. Обмен цифровой валюты
  5. Добыча полезных ископаемых