Skip to content

Norito

Norito - это Iroha Канонический слой сериализации. Это формат байтов, используемый, когда сверстники, SDKs, CLI инструменты, Torii, Kura, и генерируемые артефакты должны быть согласны на точно такую же полезную нагрузку.

Использование Norito когда данные являются частью консенсуса, подписания, хэширования, настойчивости или перекрестного SDK Совместимость. JSON когда конечная точка явно предлагает человекочитаемую проекцию для операторов, панелей управления или быстрого дебгугирования.

Где появляется Norito

Поверхность .Как Norito используется
Транзакции и запросыПодписанные транзакции и полезные загрузки запросов, представленные через Torii, шифруются как Norito.
Бытие .kagami genesis sign производит подписанный блок .nrt, который совпадает с загрузкой при запуске.
Torii ответы, напечатанныеКонечные точки, которые поддерживают типовые бинарные ответы используют Accept: application/x-norito.
SDKsRust, Python, JavaScript, Kotlin/Java, Swift, и Android клиенты используют Norito сооружения или связывания вместо ручной работы байтов.
Kura хранилищеБлоковые полезные нагрузки, боковые машины для восстановления, списки и маркеры обязательств хранятся в виде данных с рамкой Norito.
МанифестыNexus, доступность данных, SoraFS, трансляция и приложение-ориентированные манифесты используют Norito при подписании или хэшировании манифеста.
ПотокNorito В потоковой передаче используются манифесты Norito, заголовки сегментов, системы управления и устройства соответствия.

Norito - это не язык умных контрактов. Это детерминистический конверт и кодек, который осуществляет транзакции, контрактные звонки, манифестует и печатает полезные нагрузки API.

Модель полезной нагрузки

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

Поле заголовкаРазмер .Цель .
Магия .4 байтаASCII NRT0, используется для раннего отказа от данных, не относящихся к Norito.
Майор .1 байтФормат основной версии. текущие полезные нагрузки используют 0.
Младший1 байтДекодируйте подсказку для v1. Текущая стоимость - 0x00. Флаги описывают планировку.
Схема хеш16 байтовИдентификация типа, используемая типовыми декодерами для отказа от неожиданных полезных нагрузок.
Сжатие1 байт0 = None, 1 = Zstd. Неизвестные значения отвергаются.
Длина полезной нагрузки8 байтовНекомпрессированная длина полезной нагрузки, как минимум u64.
CRC648 байтовCRC64-XZ контрольная сумма некомпрессированного полезного груза.
Флаги1 байтЛейтенантные флаги для компактных длин, упакованных последовательностей и упакованной строчки.

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

Вкладные флаги

Norito Сохраняет варианты расположения в последнем байте заголовка. COMPACT_LEN (0x02Явные префиксы с фиксированной шириной длины остаются читаемыми, когда звонки кодируют flags = 0x00.

Флаг .Хекс .СтатусВлияние
PACKED_SEQ0x01ПоддержкаКодирует коллекции переменного размера с таблицей офорта плюс соседним блоком данных.
COMPACT_LEN0x02По умолчаниюИспользует канонические неподписанные варианты для префиксов длины на значение.
PACKED_STRUCT0x04ПоддержкаКодируются производные строки в виде упакованных полевых нагрузок.
VARINT_OFFSETS0x08Резервировано .Отклоняется в v1; компенсации упакованной последовательности являются фиксированной шириной u64.
COMPACT_SEQ_LEN0x10Резервировано .Отклоняется в v1; заголовки высокого уровня длины последовательности являются фиксированной шириной u64.
FIELD_BITSET0x20Поддерживается требованиямиДобавляет набор битов для упакованных строков, так что только поля, которые требуют выраженных размеров, имеют префиксы размера. PACKED_STRUCT и COMPACT_LEN.

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

Правила кодирования

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

  • Стриги [len][utf8-bytes]; при включении len следует за COMPACT_LEN.
  • При установке COMPACT_LEN длина на значение используется компактный варинт.
  • Когда COMPACT_LEN отсутствует, протяженность по значению - это 8-байтный небольшой эндиан u64.
  • Заголовки длины последовательности фиксируются на 8-байтном небольшом эндианском u64 в v1.
  • Vec<u8> кодируется как [len_u64][raw-bytes] вместо одной длины на байт.
  • В упакованных последовательностях используются монотонные (len + 1) компенсации u64, за которыми следуют полезные нагрузки соединенных элементов.
  • Карты кодируют учетные записи с фиксированными u64 и использовать детерминистический порядок ключей. HashMap записи сортируются по ключам перед кодированием; BTreeMap использует свой естественный порядок.
  • BigInt использует небольшие байты пополнения двойки с длиной байта u32 и крышкой в 512 бит.
  • Numeric кодируется как (mantissa, scale), где мантисса хранит целое число, а масштаб хранит количество фракционных цифр.

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

Схема Hashes

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

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

Сжатие и ускорение

Norito поддерживает явное и адаптивное сжатие без изменения логической полезной нагрузки:

ОсобенностьЦель .
to_bytesЗашифровка заголовка последует за некомпрессированной полезной нагрузкой.
to_compressed_bytesЗашифровать с помощью Zstd и записать тег на сжатие в заголовок.
to_bytes_autoПрименить детерминистическую эвристику, чтобы решить, стоит ли сжатие.
Ускорение CRC64Использует портативный CRC64-XZ везде, с CLMUL на x86_64 или PMULL на aarch64, когда это доступно.
GPU CRC64 и сжатиеОпциональные металлические или CUDA вспомогательные устройства могут ускорять большие полезные нагрузки, а затем возвращаться на пути CPU.

Ускорение аппаратного обеспечения никогда не изменяет декодированное содержание. Ускорители CRC и JSON должны совпадать с портативными выпускными битами по битам. Байты фрема Zstd могут отличаться между кодерами CPU и GPU, но декодируемая полезная нагрузка и метаданные заголовка Norito остаются определяющими для проверки.

JSON Поддержка

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

JSON функцияСлучай использования
norito::json::{to_json, from_json}Детерминистический тип JSON кодирование/декодирование.
Красивые и писательские помощникиCLI выход, установки и интеграция потока std::io.
Значения DOMПрограммная манипуляция с помощью модели значения JSON Norito.
Быстрый тип JSONСтруктурная лента для декодирования/кодирования горячих DTO путей.
Читатель нулевой копииСканирование токенов, которое по возможности заимствует строки из ввода.
Ускорители стадии 1Факультативное AVX2, NEON, металлическое или CUDA структурное индексирование с скалярным отказом.

Iroha код должен быть предпочтен norito::json помощники для печатания API полезные нагрузки, добавление простых serde_json к производственным путям риски, отличающиеся от схемы и поведения по обработке полевых работ, ожидаемого SDKs и Torii экстракторы.

Поддержка по производству

Rust типы данных, как правило, используют производные макрос вместо ручного кодекса. Norito двойные кодеки, схемы и JSON Помощники.

Общими атрибутами поля являются:

АтрибутВлияние
#[norito(rename = "other")]Использует стабильное сериализированное название для схемы и совместимости JSON.
#[norito(skip)]Кодер исключает поле. Декодер указывает его значение Default.
#[norito(default)]Использует Default, когда декодированная полезная нагрузка не несет поля.
#[norito(skip_serializing_if = "...")]Выключает поля из JSON при совпадении предиката, сохранив при этом дефолты детерминистического декодирования.

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

Семьи с коробками

При создании связей Iroha или SDK из источника, функции Norito выбирают, какие помощники и ускорители доступны:

Семья особенностейЧто это делает возможным ?
deriveРеэкспортированные процессуальные макро для двойных, схемы и JSON производных.
compressionZstd поддержка полезных нагрузок с заголовками.
packed-seqУпакованные макеты коллекции с использованием оффсетных таблиц.
packed-structЗапакованные производные структуры.
compact-lenПрефиксы Varint на длину значения.
columnarNorito Колонновые блоки, адаптивные кодеки строков AoS/NCB и заимствованные просмотра для сканирующих путей; включены в набор функции по умолчанию node-codec.
strict-safeПреобразует панику в ошибочных путях в структурированные ошибки.
simd-accelCPU ускорение, где это возможно, с детерминистическим отступлением.
jsonНативный JSON анализатор, писатель, DOM, напечатанные производные и быстрые пути.
json-std-ioПомощники читателя и писателя, слоированные на стеке JSON.
metal-stage1, cuda-stage1Функциональные GPU JSON структурные индексы обратных источников.
metal-stage2Необходимо классифицировать метаданные по металлу для структурной ленты JSON.
metal-crc64, cuda-crc64Факультативные помощники GPU CRC64 для больших полезных грузов.
gpu-compressionФакультативное металлическое или CUDA Zstd ускорение для больших полезных нагрузок.
stage1-validateПроверка дебага, которая сравнивает ускоренные структурные индексы JSON с масштабным выходом.

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

Torii и Norito RPC

Torii раскрывает JSON для многих маршрутов операторов, но типовые бинарные маршруты используют Norito. Тип средств массовой информации для тока типа Norito HTTP тела является application/x-norito.

Используйте эти заголовки, когда конечная точка принимает или возвращает Norito:

http
Content-Type: application/x-norito
Accept: application/x-norito

Когда конечная точка поддерживает оба представления, клиенты могут отправить четкий список предпочтений:

http
Accept: application/x-norito, application/json

Ошибки декодирования обнаружены как указано в тексте Torii Обычные причины включают в себя недействительную магию, не поддерживаемая версия, не поддерживаемый флаг функций, несовместимость сумм проверки, неправильный формат UTF-8, недействительная тег Enum, и несоответствие схемы.

Транспорт Norito RPC выбирается посредством конфигурации транспорта. панели оператора должны отслеживать задержку запроса, неисправности, активные соединения, байты ответа и torii_norito_decode_failures_total отдельно от трафика JSON.

Norito Поток

Norito Стриминг расширяет тот же детерминистический подход к средствам массовой информации и транспортным поверхностям в режиме реального времени.

Качество потоковой передачиЦель .
МанифестыОбъявить обязательства сегмента, маршруты конфиденциальности, возможности, профиль кодека, пакет шифрования и метаданные ключевого содержания.
Заголовки сегментаБинд номер сегмента, продолжительность, количество частей, сроки, режим энтропии, звуковой резюме и корни Меркеля.
Частичные обязательстваПусть зрители и релеи проверят части полезной нагрузки с манифестом перед подачей или расшифровкой.
Управляющие кадрыПроводить объявления, отзывы, ключевые обновления и переговоры о возможностях.
HPKE ключевые обновленияПереключите транспортные секреты с использованием переговорного комплекта и монотонно увеличивающихся счетчиков.
Переговоры о возможностяхПересекает поддерживаемые биты функций, границы датаграмма, каденцию обратной связи и требования к конфиденциальности.
FEC и обратная связьИспользует детерминистические отчеты получателей и решения о паритете для траекторий потери в режиме реального времени.
Векторы соответствияРазличные языковые устройства доказывают, что SDKs расшифровывает те же манифесты, сегменты и потоки энтропии.

Специфические для потока кодеки и антропические профили отделены от основного формата транзакции/запроса Norito, но их манифесты и контрольные данные все еще используют Norito, так что маршрутизация, расчет, повторное воспроизведение и аудит доказательств остаются воспроизводимо.

Руководство по эксплуатации

  • Предпочтительнее SDK конструкторы и генерируемые связывания, чем ручной работы Norito байтов.
  • Обращайтесь с несовместимостью схемы как с проблемой версии или фиксации, а не как с проходящей сетью.
  • Архив .nrt, .norito, и манифестирующие артефакты в выпуске или пакете происшествий, которые их создали.
  • Использование Norito в качестве источника истины для подписанных, хэшированных или сохранившихся данных. JSON проекции для панелей управления и ручной проверки.
  • При добавлении нового конечного пункта Torii, записывайте, принимает ли он JSON, Norito или оба, и выставьте поддерживаемые типы содержания в /openapi.
  • Прежде чем включить ускоритель, выполните тесты паритета с скалярным выходом. Если ускоритель провалится, используйте детерминистический скалярный откат. Семантика полезной нагрузки должна оставаться неизменной.

Ссылки вверх