Программируемые данные

Спецификация диапазонов

Для взаимодействия со служебными данными реестра Irys во время выполнения смарт-контракта каждая транзакция указывает диапазон требуемых блоков данных (chunk range specifier). Эти диапазоны спроектированы в соответствии с Ethereum EIP-2930 access lists, что обеспечивает совместимость и эффективную интеграцию с существующими инструментами для разработчиков.

Формат задания диапазонов:

<partition_index>:<offset>:<chunk_count>
  • partition_index (26 байт) — индекс раздела в Publish Ledger, содержащего первый блок.

  • offset (4 байта) — смещение первого блока внутри раздела.

  • chunk_count (2 байта) — количество последовательных блоков для выборки начиная с указанного смещения.

Такая структура позволяет точно определять данные, хранящиеся в разделах Irys, и эффективно извлекать их для выполнения.

Дополнительно, программируемые данные поддерживают Byte Read Ranges — механизм поверх диапазонов блоков, упрощающий доступ к определённым частям данных транзакции.

Формат для byte read range:

<index>:<chunk_offset>:<byte_offset>:<length>
  • partition_index (26 байт) — индекс раздела в Publish Ledger, содержащего первый блок.

  • offset (4 байта) — смещение первого блока в разделе.

  • chunk_count (2 байта) — количество последовательных блоков, начиная со смещения.

Стоимость Программируемых данных

Базовая комиссия

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

В тестовой сети:

  • базовая комиссия за 1 МБ Программируемых данных — $0.01;

  • минимальная стоимость транзакции с Программируемыми данными — $0.01.

Это обеспечивает доступность и одновременно сохраняет целостность системы.

Ценообразование при перегрузке / приоритетные комиссии

Стоимость доступа к данным в реестрах Irys динамически изменяется в зависимости от спроса и сетевой загрузки, по аналогии с моделью Ethereum.

При блоках тестнета в 30 секунд сеть может обрабатывать до 7500 блоков (chunk) на блок (≈250 блоков/сек). Каждый блок — это 256 KiB данных.

  • Рост комиссии: если используется более 50% вместимости блока, базовая комиссия линейно увеличивается до +12.5%, когда заполнены все 7500 блоков.

  • Снижение комиссии: если блоки не используются, базовая комиссия падает до -12.5% за блок, с минимальным порогом $0.01 и без верхнего лимита.

Такое ценообразование исключает резкие скачки стоимости и обеспечивает предсказуемую экономику даже при высокой нагрузке.

Доступность и синхронизация данных

Irys гарантирует высокую доступность данных благодаря механизму синхронизации, сочетающему peer-to-peer обмен и поиск на основе майнеров. Это обеспечивает доступность при любых условиях.

P2P-трансляция

  • Узлы транслируют транзакции с Программируемыми данными своим пирами, указывая, какие блоки у них уже есть.

  • Пиры, у которых нет блоков, могут запросить их у отправителя.

Запрос и ответ

  • Отправляющий узел отслеживает, какие пиры нуждаются в блоках, и отправляет их.

  • Получившие пиры повторно транслируют транзакцию, отмечая, у кого не хватает блоков.

Обращение к майнерам

  • Если пир не получил блоки в течение задержки распространения (200 мс в тестнете), он обращается к майнерам, ответственным за соответствующие разделы.

  • Реестр указывает реплики разделов, и узел случайным образом выбирает одну для получения данных.

Проверка данных для выполнения

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

Кэшированные распакованные блоки

Узлы используют ранее кэшированные, проверенные фрагменты, проверенные по их корням Меркла, обеспечивая готовность к выполнению IrysVM.

Локальные упакованные блоки

Если узел сам майнит раздел с нужными блоками, но имеет их только в упакованном виде:

  1. Генерирует энтропию для указанного диапазона.

  2. Распаковывает блоки.

  3. Формирует Merkle-корень.

  4. Находит транзакцию, разместившую блоки, через индекс блока.

  5. Сравнивает рассчитанный Merkle-корень с хранимым в транзакции.

  6. Если он действителен, делится распакованными блоками с пирами, у которых их нет.

Полученные распакованные блоки

При получении данных от пиров узел проверяет их, выполняя шаги 4–5 из процесса «Локальные упакованные блоки».

Запрос блоков у майнеров

Если кэш или пиры не помогли в пределах задержки (200 мс):

  • узел через реестр находит реплики раздела,

  • случайным образом выбирает реплику и запрашивает блоки,

  • при получении в упакованном виде — распаковывает и проверяет их по шагам 4–6.

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

Оригинал статьи: https://docs.irys.xyz/learn/protocol-overview/programmable-data

Последнее обновление