POLO — это формат кодирования, который используется в протоколе MOI.. Он означает Prefix O. strong>rded Lookup Offset Encoding и был разработан в Sarva Labs для преодоления некоторых основных недостатков других схемы кодирования, такие как JSON и буферы протокола.

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

В протоколе MOI POLO используется для всех обменов сообщениями p2p между децентрализованными узлами и для сохранения данных о состоянии в сети. Он был разработан с учетом приоритетов согласованности и эффективности проводных соединений и идеально подходит для критически важных приложений, таких как блокчейн-сети.

На ранних этапах разработки протокола MOI мы использовали схему кодирования Protocol Buffers для сериализации данных как для обмена сообщениями, так и для сохранения. Для непосвященных Protocol Buffersбыл стандарт сериализации данных, разработанный в Google, в котором приоритет отдавался скорости. , эффективность подключения, расширяемость и нейтральность во время выполнения. Текущий стандарт реализации протокольных буферов определяется его спецификацией proto3.

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

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

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

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

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

Так родилась идея…

Начало POLO

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

Это было началом POLO. Но зачем останавливаться на достигнутом?

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

Проводная форма POLO в значительной степени опирается на Protocol Buffers и, таким образом, столь же эффективна с размером проводника, а иногда даже меньше из-за различных оптимизаций в различных форматах представления данных.

Как и в сериале HBO Силиконовая долина, в котором разработка мощной схемы сжатия прокладывает путь к существованию Нового Интернета, высокие Эффективность проводов важна для протокола MOI из-за огромного объема обмена сообщениями в высокопараллельной децентрализованной сети, особенно с ее способностью генерировать источник энтропии на уровне сети, известный как Поток в результате всего этого шума обмена сообщениями.

Особенности ПОЛО

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

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

2 Атомарное кодирование — POLO может представлять простые данные, такие как строки и целые числа, в виде атомарных объектов без необходимости их кодирования как части более крупной структуры, что позволяет повысить и без того превосходную эффективность проводов для простых данных.

3 Эффективная частичная распаковка — модель кодирования на основе смещения POLO обеспечивает эффективный доступ к глубоко вложенным данным в составных структурах, таких как последовательности, сопоставления и структуры (совместно называемые упакованными объектами).

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

Текущая реализация в Golang (v0.1.0) поддерживает первые две из этих функций, а две другие находятся в активной разработке в рамках этапа v0.2.0.

Набор функций POLO также позволяет использовать его на вычислительном уровне MOI для управления объектами времени выполнения и схемами их хранения в нескольких средах выполнения, таких как PISA и MERU. В частности, объектная модель PISA на основе регистров, которая позволяет составным объектам высокого уровня выражать сложные функции в своем байт-коде, возможна только благодаря возможностям частичной распаковки и атомарного кодирования POLO.

Оставайтесь с нами, чтобы узнать больше о возможностях вычислительного уровня MOI.

Форма провода POLO

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

Он по-прежнему использует целые числа переменной длины Base-128 (Varints), указанные в стандарте кодирования LEB-128 для сериализации целых чисел произвольной длины, точно так же, как буферы протокола, но этот метод используется только для кодирования информации о смещении и типе провода для каждого фрагмента данных как его «метка».

Классификация типов проводов POLO определяется 4 битами (16 типов), что вдвое больше, чем в протокольных буферах. Он использует это дополнительное пространство типа проводника, чтобы определить больше информации в самом теге, а не зависеть от методов кодирования, которые потенциально растягивают проводник для представления тех же данных. Примером этого является использование зигзагообразного кодирования как части стандарта LEB-128 для представления отрицательных чисел. В POLO отрицательные числа кодируются как их абсолютное значение, а тип провода указывает на полярность.

Точно так же логические значения в POLO требуют только тега и представлены 0 байтами (1 байт в буферах протокола), потому что существует два различных типа проводов для значений True и False. Эта система использования большего пространства типа проводника для более детального различения данных позволяет нам более эффективно кодировать информацию, делегируя большую часть информации о контексте данных типу проводника этих данных.

Оставайтесь с нами для получения дополнительной информации о форме провода с официальным выпуском спецификации для схемы кодирования POLO.

ПОЛО на практике

Итак, как выглядит использование POLO в Go? Он работает так же, как и большинство форматов сериализации, используемых в языковой экосистеме, таких как JSON, Protocol Buffers или Борш, со своей собственной уникальной номенклатурой Процесс сериализации и десериализации.

Полоризация – это процесс преобразования объекта данных в его проводное представление POLO (сериализация/кодирование).

Деполоризация — это процесс преобразования провода POLO в объект данных (десериализация/декодирование).

Вот пример того, как это выглядит в коде:

Обратите внимание, что для структуры Fruit не требуются теги структуры, потому что информация об имени поля не сохраняется в сети в POLO, т. е. она не является самоописательной, но в отличие от Protocol Buffers, которые также удаляют информацию об имени поля, POLO поддерживает постоянный порядок полей структуры. и делает вывод о поддержке типа данных на основе типа проводника и выдает ошибку, если, например, выполняется попытка декодирования строковых данных проводника в целочисленное поле.

Однако можно добавить тег поля структуры `polo: ”-”`, чтобы пропустить экспортированное поле из проводника (неэкспортированные поля в любом случае пропускаются). Это полезно для пропуска полей в структуре, которые являются частью специфичных для языка функций, таких как мьютексы или каналы.

Проблемы реализации

POLO был разработан из-за потребности в безопасной, последовательной и эффективной схеме кодирования для протокола MOI, которая была реализована на языке программирования Go в Sarva Labs, что побудило нас также разработать первую реализацию спецификации POLO для Golang, в результате чего с рядом проблем, которые мы должны были преодолеть.

1Первой технической проблемой, с которой мы столкнулись, была монументальная задача согласования скорости сериализации буферов протокола, что было почти невозможно, учитывая, что это был скомпилированный формат сериализации, допускающий промежуточное представление, которое определялось самой спецификацией сериализации. Мы отказались от этого и решили вместо этого соответствовать скорости других форматов сериализации во время выполнения, таких как Borsh (NEAR) и RLP (Ethereum).

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

В настоящее время POLO реализован только для Go, а реализации для JavaScript и Rust находятся в стадии разработки.

Версия go-polo недавно была обновлена ​​до версии 0.1.0 после ряда дополнений функций и продолжительного использования текущей спецификации для внутренней разработки. v0.2.0 активно разрабатывается и добавляет поддержку частичной распаковки, дифференциального обмена сообщениями и встроенного дизассемблера проводов для отладки.

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

Проверьте это Twitter Space на POLO для получения дополнительной информации: https://twitter.com/i/spaces/1mnGeddzDDaKX?s=20

Мы с нетерпением ждем возможности вовлечь сообщество в наше путешествие. Присоединяйтесь к нашим сообществам Telegram, Discord, Twitter и общайтесь с нами прямо сейчас!

Справочные ссылки

  1. Сайт МВД: https://www.moi.technology/
  2. Валидаторы MOI: https://validator.moi.technology/
  3. Документы МВД: https://info.moi.technology/