Перейти к основному контенту
Change page

Стратегии хранения данных в блокчейне

Существует несколько способов хранения информации либо непосредственно в блокчейне, либо таким образом, чтобы она была защищена блокчейном:

  • Блобы EIP-4844
  • Данные вызова (calldata)
  • Офчейн с механизмами уровня 1 (l1)
  • «Код» контракта
  • События
  • Хранилище EVM

Выбор метода зависит от нескольких критериев:

  • Источник информации. Информация в данных вызова не может поступать непосредственно из самого блокчейна.
  • Назначение информации. Данные вызова доступны только в той транзакции, которая их включает. События вообще недоступны ончейн.
  • Какой уровень сложности приемлем? Компьютеры, на которых запущен полномасштабный полный узел, могут выполнять больше вычислений, чем легкий клиент в приложении, работающем в браузере.
  • Необходимо ли обеспечить легкий доступ к информации с каждого узла?
  • Требования к безопасности.

Требования к безопасности

В целом, информационная безопасность состоит из трех атрибутов:

  • Конфиденциальность — неавторизованные субъекты не имеют права читать информацию. Это важно во многих случаях, но не здесь. В блокчейне нет секретов. Блокчейны работают потому, что любой может проверить переходы состояний, поэтому их невозможно использовать для прямого хранения секретов. Существуют способы хранения конфиденциальной информации в блокчейне, но все они полагаются на какой-либо офчейн-компонент для хранения хотя бы ключа.

  • Целостность — информация верна, она не может быть изменена неавторизованными субъектами или несанкционированными способами (например, перевод токенов ERC-20 (opens in a new tab) без события Transfer). В блокчейне каждый узел проверяет каждое изменение состояния, что обеспечивает целостность.

  • Доступность — информация доступна любому авторизованному субъекту. В блокчейне это обычно достигается за счет того, что информация доступна на каждом полном узле (opens in a new tab).

Все представленные здесь решения обладают отличной целостностью, поскольку хеши публикуются на уровне 1 (l1). Однако они имеют разные гарантии доступности.

Предварительные требования

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

Блобы EIP-4844

Начиная с хардфорка Денкун (opens in a new tab), блокчейн Эфириума включает EIP-4844 (opens in a new tab), который добавляет в Эфириум блобы данных с ограниченным сроком жизни (изначально около 18 дней (opens in a new tab)). Эти блобы тарифицируются отдельно от газа за выполнение, хотя и используют аналогичный механизм. Это дешевый способ публикации временных данных.

Основной вариант использования блобов EIP-4844 — публикация транзакций роллапами. Оптимистичные роллапы должны публиковать транзакции в своих блокчейнах. Эти транзакции должны быть доступны любому желающему в течение периода оспаривания (opens in a new tab), чтобы позволить валидаторам (opens in a new tab) исправить ошибку, если секвенсор (opens in a new tab) роллапа опубликует неверный корень состояния.

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

Роллапы с нулевым разглашением также публикуют данные своих транзакций, чтобы позволить другим узлам реплицировать существующее состояние и проверять доказательства валидности, но опять же, это краткосрочное требование.

На момент написания статьи публикация в EIP-4844 стоит один Wei (10-18 ETH) за байт, что ничтожно мало по сравнению с 21 000 газа за выполнение, которые стоит любая транзакция, включая ту, которая публикует блобы (opens in a new tab). Вы можете посмотреть текущую цену EIP-4844 на blobscan.com (opens in a new tab).

Вот адреса, по которым можно посмотреть блобы, опубликованные некоторыми известными роллапами.

Данные вызова

Данные вызова — это байты, отправляемые как часть транзакции. Они хранятся как часть постоянной записи блокчейна в блоке, который включает эту транзакцию.

Это самый дешевый метод постоянного размещения данных в блокчейне. Стоимость за байт составляет либо 4 газа за выполнение (если байт равен нулю), либо 16 газа (любое другое значение). Если данные сжаты, что является стандартной практикой, то каждое значение байта равновероятно, поэтому средняя стоимость составляет примерно 15.95 газа за байт.

На момент написания статьи цены составляют 12 Gwei/газ и 2300 $/ETH, что означает, что стоимость составляет примерно 45 центов за килобайт. Поскольку до EIP-4844 это был самый дешевый метод, именно его роллапы использовали для хранения информации о транзакциях, которая должна быть доступна для оспаривания ошибок (opens in a new tab), но не должна быть доступна напрямую ончейн.

Вот адреса, по которым можно посмотреть транзакции, опубликованные некоторыми известными роллапами.

Офчейн с механизмами уровня 1 (l1)

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

  1. Опубликовать хеш (opens in a new tab) данных в блокчейне, называемый входным коммитментом. Это может быть одно 32-байтовое слово, поэтому это недорого. Пока входной коммитмент доступен, целостность гарантируется, потому что невозможно найти какие-либо другие данные, которые хешировались бы в то же значение. Поэтому, если будут предоставлены неверные данные, это можно будет обнаружить.

  2. Иметь механизм, обеспечивающий доступность. Например, в Redstone (opens in a new tab) любой узел может отправить запрос на проверку доступности. Если секвенсор не ответит ончейн до истечения крайнего срока, входной коммитмент отбрасывается, поэтому считается, что информация никогда не публиковалась.

Это приемлемо для оптимистичного роллапа, потому что мы уже полагаемся на наличие хотя бы одного честного верификатора для корня состояния. Такой честный верификатор также убедится, что у него есть данные для обработки блоков, и отправит запрос на проверку доступности, если информация недоступна офчейн. Этот тип оптимистичного роллапа называется Плазма.

Код контракта

Информация, которую нужно записать только один раз, которая никогда не перезаписывается и должна быть доступна ончейн, может храниться как код контракта. Это означает, что мы создаем «смарт-контракт» с данными, а затем используем EXTCODECOPY (opens in a new tab) для чтения информации. Преимущество заключается в том, что копирование кода обходится относительно дешево.

Помимо стоимости расширения памяти, EXTCODECOPY стоит 2600 газа за первый доступ к контракту (когда он «холодный») и 100 газа за последующие копирования из того же контракта плюс 3 газа за 32-байтовое слово. По сравнению с данными вызова, которые стоят 15.95 за байт, это дешевле, начиная примерно с 200 байт. Исходя из формулы стоимости расширения памяти (opens in a new tab), до тех пор, пока вам не требуется более 4 МБ памяти, стоимость расширения памяти меньше, чем стоимость добавления данных вызова.

Конечно, это только стоимость чтения данных. Создание контракта стоит примерно 32 000 газа + 200 газа/байт. Этот метод экономичен только тогда, когда одну и ту же информацию нужно читать много раз в разных транзакциях.

Код контракта может быть бессмысленным, если он не начинается с 0xEF. Контракты, которые начинаются с 0xEF, интерпретируются как объектный формат Эфириума (opens in a new tab), к которому предъявляются гораздо более строгие требования.

События

События (opens in a new tab) генерируются смарт-контрактами и считываются офчейн-программным обеспечением. Их преимущество в том, что офчейн-код может прослушивать события. Стоимость составляет газ (opens in a new tab), 375 плюс 8 газа за байт данных. При 12 Gwei/газ и 2300 $/ETH это переводится в один цент плюс 22 цента за килобайт.

Хранилище

Смарт-контракты имеют доступ к постоянному хранилищу (opens in a new tab). Однако это очень дорого. Запись 32-байтового слова в ранее пустой слот хранилища может стоить 22 100 газа (opens in a new tab). При 12 Gwei/газ и 2300 $/ETH это составляет около 61 цента за операцию записи, или 19.5 долларов за килобайт.

Это самая дорогая форма хранения в Эфириуме.

Краткое изложение

В этой таблице обобщены различные варианты, их преимущества и недостатки.

Тип хранилищаИсточник данныхГарантия доступностиДоступность ончейнДополнительные ограничения
Блобы EIP-4844ОфчейнГарантия Эфириума на ~18 дней (opens in a new tab)Доступен только хеш
Данные вызоваОфчейнГарантия Эфириума навсегда (часть блокчейна)Доступно только при записи в контракт и в этой транзакции
Офчейн с механизмами уровня 1 (l1)ОфчейнГарантия «одного честного верификатора» в течение периода оспариванияТолько хешГарантируется механизмом оспаривания, только в течение периода оспаривания
Код контрактаОнчейн или офчейнГарантия Эфириума навсегда (часть блокчейна)ДаЗаписывается по «случайному» адресу, не может начинаться с 0xEF
СобытияОнчейнГарантия Эфириума навсегда (часть блокчейна)Нет
ХранилищеОнчейнГарантия Эфириума навсегда (часть блокчейна и текущего состояния до перезаписи)Да