Слой доступности данных Celestia
Last updated
Last updated
Celestia — это слой доступности данных (DA), который предоставляет масштабируемое решение проблемы доступности данных. Из-за инклюзивной природы блокчейн-сетей слой DA должен предоставлять механизм для уровней выполнения и урегулирования, позволяющий проверять доступность данных транзакций с минимальным доверием.
Два ключевых аспекта слоя DA Celestia — это выборочное тестирование доступности данных (DAS – data availability sampling) и деревья Меркла с именованными пространствами (NMTs – Namespaced Merkle trees). Оба аспекта представляют собой новые решения для масштабирования блокчейнов: DAS позволяет легким узлам проверять доступность данных без необходимости загружать весь блок; NMTs позволяют уровням выполнения и урегулирования на Celestia загружать только те транзакции, которые им действительно нужны.
В общем, легкие узлы загружают только заголовки блоков, содержащие обязательства (т.е. корни Меркла) данных блока (т.е. списка транзакций).
Чтобы сделать DAS возможным, Celestia использует двухмерную схему кодирования Рида-Соломона для кодирования данных блока: каждый блок данных делится на k x k части, располагается в матрице k x k и расширяется с помощью данных четности в матрицу 2k x 2k с помощью многократного применения кодирования Рида-Соломона.
Затем вычисляется 4k отдельных корней Меркла для строк и столбцов расширенной матрицы; корень Меркла этих корней используется как обязательство данных блока в заголовке блока.
Чтобы проверить, что данные доступны, легкие узлы Celestia выполняют выборочное тестирование данных.
Каждый легкий узел случайным образом выбирает набор уникальных координат в расширенной матрице и запрашивает у полных узлов (full nodes) о частях данных и соответствующих доказательствах Меркла на этих координатах. Если легкие узлы получают достоверный ответ на каждый запрос выборочного тестирования, то с высокой вероятностью можно гарантировать, что все данные блока доступны.
Дополнительно, каждая полученная часть данных с правильным доказательством Меркла передается в сеть. В результате, пока легкие узлы Celestia выполняют выборочное тестирование достаточно большого количества частей данных (т.е. по крайней мере k x k уникальных частей), полный блок может быть восстановлен честными полными узлами.
Для более подробного ознакомления с DAS вы можете обратиться к оригинальной статье.
DAS позволяет Celestia масштабировать слой DA. DAS может выполняться легкими узлами с ограниченными ресурсами, так как каждый легкий узел тестирует только небольшую часть данных блока. Чем больше легких узлов в сети, тем больше данных они могут коллективно загрузить и сохранить.
Это означает, что увеличение числа легких узлов, выполняющих DAS, позволяет использовать большие блоки (т.е. с большим количеством транзакций), при этом сохраняя возможность DAS для легких узлов с ограниченными ресурсами. Однако для проверки заголовков блоков легкие узлы Celestia должны загружать 4k промежуточных корней Меркла.
Для данных блока размером n^2 байт это означает, что каждый легкий узел должен загрузить O(n) байт. Следовательно, любое улучшение пропускной способности узлов Celestia оказывает квадратичное влияние на пропускную способность слоя DA.
Требование загрузки 4k промежуточных корней Меркла является следствием использования двухмерной схемы кодирования Рида-Соломона. В качестве альтернативы, DAS можно было бы разработать с использованием стандартного (т.е. одномерного) кодирования Рида-Соломона, где исходные данные делятся на k части и расширяются на дополнительные k частей данных четности. Поскольку обязательство данных блока является корнем Меркла из 2k результирующих частей данных, легкие узлы больше не должны загружать O(n) байт для проверки заголовков блоков.
Недостатком стандартного кодирования Рида-Соломона является работа с вредоносными производителями блоков, которые неверно генерируют расширенные данные.
Это возможно, так как Celestia не требует от большинства консенсуса (т.е. производителей блоков) честности для гарантии доступности данных. Таким образом, если расширенные данные недействительны, исходные данные могут быть невосстановимыми, даже если легкие узлы тестируют достаточное количество уникальных частей (т.е. по крайней мере k для стандартного кодирования и k x k для двухмерного кодирования).
В качестве решения проблемы используются доказательства мошенничества в отношении неверно сгенерированных расширенных данных, позволяющие легким узлам отклонять блоки с неверными расширенными данными. Такие доказательства требуют реконструкции кодирования и проверки несоответствия. При стандартном кодировании Рида-Соломона это означает загрузку исходных данных, т.е. n^2 байт. Напротив, при двухмерном кодировании Рида-Соломона требуется только O(n) байт, так как достаточно проверить только одну строку или один столбец расширенной матрицы.
Celestia разделяет данные блока на несколько именованных пространств, одно для каждого приложения (например, роллапа), использующего слой DA. В результате каждому приложению необходимо загружать только свои данные, а данные других приложений могут игнорироваться.
Для этого слой DA должен уметь доказывать, что предоставленные данные полны, т.е. все данные для данного именованного пространства возвращены. С этой целью Celestia использует деревья Меркла с именованными пространствами (NMTs).
NMT — это дерево Меркла с листьями, упорядоченными по идентификаторам именованных пространств, и функцией хеширования, модифицированной таким образом, чтобы каждый узел в дереве включал диапазон именованных пространств всех своих потомков. Следующая диаграмма показывает пример NMT с высотой три (т.е. включающего восемь частей данных). Данные разделены на три именованных пространства.
Когда приложение запрашивает данные для именованного пространства 2, слой DA должен предоставить части данных D3
, D4
, D5
и D6
, а также узлы N2
, N8
и N7
в качестве доказательства (учитывая, что приложение уже имеет корень N14
из заголовка блока).
В результате приложение может проверить, что предоставленные данные являются частью данных блока. Более того, приложение может проверить, что все данные для именованного пространства 2 были предоставлены. Если слой DA предоставляет, например, только части данных D4
и D5
, он также должен предоставить узлы N12
и N11
в качестве доказательства. Однако приложение может определить, что данные неполные, проверяя диапазон именованных пространств двух узлов, т.е. и N12
, и N11
имеют потомков, часть из которых относится к именованному пространству 2.
Для более подробного ознакомления с NMTs обратитесь к оригинальной статье.
Слой DA Celestia состоит из блокчейна PoS. Celestia называет этот блокчейн celestia-app, приложением, которое предоставляет транзакции для обеспечения слоя DA и построено с использованием Cosmos SDK. Следующая диаграмма показывает основные компоненты celestia-app.
celestia-app построен поверх celestia-core, модифицированной версии алгоритма консенсуса Tendermint. Среди наиболее важных изменений по сравнению со стандартным Tendermint, celestia-core:
Позволяет кодировать данные блока с помощью двухмерной схемы кодирования Рида-Соломона.
Заменяет обычное дерево Меркла, используемое Tendermint для хранения данных блока, на дерево Меркла с именованными пространствами, что позволяет вышестоящим слоям (т.е. выполнение и урегулирование) загружать только необходимые данные (для получения более подробной информации см. раздел ниже, описывающий варианты использования).
Для более подробного ознакомления с изменениями в Tendermint ознакомьтесь с ADRs. Обратите внимание, что узлы celestia-core все еще используют p2p сеть Tendermint.
Подобно Tendermint, celestia-core соединяется с уровнем приложения (т.е. машиной состояний) через ABCI++, являющейся значительной модификацией ABCI (Application Blockchain Interface).
Машина состояний celestia-app необходима для выполнения логики PoS и для обеспечения управления слоем DA.
Однако celestia-app не зависит от данных — машина состояний не проверяет и не хранит данные, доступные через celestia-app.