Кросс консенсусный обмен сообщениями (XCM)

Andrey P.
Moonbeam in Russian
10 min readApr 18, 2022

Введение

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

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

Эта страница представляет собой краткое введение и обзор XCM и других связанных с ним элементов. Более подробную информацию можно найти в Wiki Polkadot.

Общие определения XCM

  • XCM — расшифровывается как кросс-консенсусное сообщение, это общий способ общения консенсусных систем друг с другом
  • VMP — означает вертикальную передачу сообщений, она позволяет парачейнам обмениваться сообщениями с релейной цепочкой. UMP (передача сообщений вверх) позволяет парачейнам посылать сообщения своей релейной цепочке, а DMP (передача сообщений вниз) позволяет релейной цепочке передавать сообщения вниз одному из своих парачейнов.
  • XCMP — обозначает передачу сообщений с перекрестным консенсусом, позволяет парачейнам обмениваться сообщениями с другими парачейнами в той же релейной цепи
  • HRMP — обозначает горизонтальную передачу сообщений с релейной маршрутизацией, промежуточный протокол, пока не будет запущена полная реализация XCMP. Тот же интерфейс, что и у XCMP, но сообщения хранятся на релейной цепочке.
  • Multilocation — способ указать точку во всей экосистеме релейной цепочки/парачейна от заданного начала, относительную или абсолютную. Например, он может использоваться для указания конкретного парачейна, актива, аккаунта или даже паллета внутри парачейна. В общих чертах, мультилокация определяется родительской и внутренней локацией. Родительский относится к тому, сколько “прыжков” в родительский блокчейн вам нужно сделать из данного источника. Внутренняя часть означает, сколько полей вам нужно для определения целевой точки. Например, чтобы нацелиться на парачейн с ID 1000 из другого парачейна, мультилокация будет иметь вид {“родители”: 1, “interior”: { “X1”: [{ “Parachain”: 1000 }]}}}

Транспортные протоколы XCM

Polkadot реализует два кросс-консенсуса или транспортных протокола для работы с XCM сообщениями между входящими в него парачейнами, одним из которых является Moonbeam:

  • Вертикальная передача сообщений (VMP) — подразделяется на два вида транспортных протоколов передачи сообщений:
  • Восходящая передача сообщений (UMP) — позволяет парачейнам посылать сообщения в свою релейную цепочку, например, от Moonbeam к Polkadot.
  • Передача сообщений вниз (DMP) — позволяет релейной цепочке передавать сообщения вниз одному из своих парачейнов, например, от Polkadot к Moonbeam.
  • Перекрестная передача сообщений (XCMP) — позволяет двум парачейнам обмениваться сообщениями при условии, что они подключены к одной и той же релейной цепи. Кросс-чейн транзакции разрешаются с помощью простого механизма очередей, основанного на дереве Меркла для обеспечения верности. Коллаторы обмениваются сообщениями между парачейнами, в то время как валидаторы релейной цепи проверяют, что передача сообщения произошла.

Примечание

В настоящее время, пока XCMP находится в стадии разработки, используется промежуточный протокол под названием Horizontal Relay-routed Message Passing (HRMP), в котором сообщения хранятся в релейной цепочке и считываются из нее. В будущем этот протокол будет отменен для полной реализации XCMP.

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

  • Телепортация активов — заключается в перемещении актива с одного блокчейна на другой путем уничтожения передаваемой суммы в исходной цепи и создания клона (той же суммы, что была уничтожена) в целевой цепи. В таких случаях каждая цепочка держит родной актив в качестве резерва, подобно механизму сжигания монетного моста. Эта модель требует определенной степени доверия, поскольку любая из двух цепочек может злонамеренно намайнить больше активов.
  • Удаленные переводы — заключаются в перемещении актива с одной блокчейн-цепочки на другую через промежуточный счет в исходной цепочке, который без доверия принадлежит целевой цепочке. Этот промежуточный счет известен как “суверенный” счет. В таких случаях актив исходной цепочки не уничтожается, а хранится на суверенном счете. Выполнение XCM в целевой цепочке майнит обернутое (также называемое “виртуальным” или “ кросс-чейн” активом) представление на целевой адрес. Обернутое представление всегда взаимозаменяемо 1:1 с исходным активом. Это похоже на механизм блокировки/разблокировки мостов.

Более подробную статью о XCM можно найти в Polkadot Wiki.

Первоначально Moonbeam будет поддерживать только удаленные переводы. Все кросс-чейн активы на Moonbeam будут известны как xc + TokenName. Например, KSM-представление Кусамы на Moonriver будет известно как xcKSM. Подробнее о стандарте XC-20 можно прочитать здесь.

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

Регистрация каналов

Прежде чем две цепи начнут взаимодействовать, необходимо открыть канал обмена сообщениями. Каналы являются однонаправленными, то есть канал от цепи А к цепи Б будет передавать сообщения только от А к Б. Следовательно, передача активов будет возможна только от цепи А к Б. Поэтому для отправки сообщений (или передачи активов) туда и обратно необходимо открыть два канала.

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

  • Место назначения, где будет выполнено сообщение (в данном случае релейная цепочка)
  • Счет, который будет оплачивать сборы (оплачивается токеном релейной цепочки)
  • Сборы, которые транзакция может израсходовать при выполнении
  • Закодированные данные вызова, полученные путем подражания внешним признакам на релейной цепочке. Сюда входит следующая закодированная информация:
  • Метод, который будет вызван в релейной цепочке (открытый канал)
  • Парачейн ID целевой цепочки (парачейн B в данном примере)
  • Максимальное количество сообщений в очереди назначения
  • Максимальный размер отправляемых сообщений

Плата за транзакцию вносится в кросс-чейн (xc) представление актива релейной цепи (xcRelayChainAsset). Например, для Kusama/Moonriver комиссии за транзакции будут оплачиваться в xcKSM. Поэтому счет, оплачивающий комиссию, должен иметь достаточно xcRelayChainAsset. Эта проблема может быть решена в Moonbeam/Moonriver, если комиссии от входящих сообщений XCM, которые оплачиваются в активе цепочки происхождения, будут отправляться в казначейство, а счет казначейства будет использоваться для оплаты внешней регистрации канала.

Даже если парачейн А выразил намерение открыть XCM-канал с парасейном Б, последний не сигнализировал релейной цепочке о своем намерении получать сообщения от парачейна А. Поэтому, чтобы иметь установленный канал, парачейн Б должен также послать экстринсик (который также является XCM) релейной цепочке. Внешнее сообщение о принятии канала аналогично предыдущему. Однако закодированные данные вызова включают только новый метод (принять канал) и идентификатор парачейна отправителя (парачайна A в данном примере). Как только оба парачейна соглашаются, канал открывается в течение следующей смены эпохи.

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

Как только канал установлен, активы должны быть зарегистрированы перед передачей через XCMs, либо путем встраивания в среду исполнения в качестве константы, либо через паллет. Процесс регистрации активов для Moonbeam объясняется в следующем разделе.

Регистрация активов в XCM

После установления канала между парачейнами (или релейной цепочкой-парачайном) можно приступить к регистрации активов.

В целом, регистрация актива может происходить на уровне времени выполнения, что означает, что требуется обновление времени выполнения, после чего актив регистрируется и поддерживается XCM. Однако компания Moonbeam включила паллет Substrate для регистрации активов без необходимости обновления среды выполнения, что значительно упрощает процесс.

При регистрации актива XCM внешняя информация должна включать (среди прочего):

  • Парачейный идентификатор места, где находится исходный актив
  • Тип актива. На момент написания статьи вы можете зарегистрировать либо родной токен парачейна, либо актив, созданный через Pallet Assets, предоставив его индекс
  • Название актива, символ и десятичное число
  • Минимальный баланс

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

После успешного установления канала, регистрации актива XCM в целевом парачейне и установки единиц в секунду исполнения пользователи могут приступать к переводу активов.

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

Moonbeam и XCM

Поскольку Moonbeam является парачейном в экосистеме Polkadot, одна из самых прямых реализаций XCM — это возможность передачи активов из Polkadot и других парачейнов из/в Moonbeam. Это позволит пользователям приносить свои токены в Moonbeam и все его dApps.

Расширяя уникальные возможности Moonbeam по совместимости с Ethereum, иностранные активы будут представлены через стандартный интерфейс ERC-20 посредством предварительно скомпилированного контракта. Активы XCM на Moonbeam называются XC-20, чтобы отличать собственные активы XCM от ERC-20, генерируемых через EVM. Предварительно скомпилированный контракт получит доступ к необходимым функциям субстрата для выполнения требуемых действий. Тем не менее, с точки зрения разработчика, XC-20s — это токены ERC-20 с дополнительным преимуществом в виде кросс-чейн актива XCM, и dApps могут легко поддерживать их через знакомый интерфейс ERC-20.

Сама прекомпиляция не поддерживает кросс-чейн транзакции, чтобы максимально приблизиться к оригинальному интерфейсу ERC-20. Следовательно, разработчикам придется полагаться на Substrate API и XCM для перемещения активов обратно на исходную цепь, или на другой контракт прекомпиляции для доступа к функциям на базе XCM из Ethereum API.

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

В следующих разделах представлен обзор двух первоначальных вариантов использования XCM на Moonbeam: передача активов с/на Polkadot (через VMP) и передача активов с/на другие парачейны (через XCMP). Эта страница будет расширяться по мере появления новых возможностей взаимодействия, таких как перемещение токенов ERC-20 с Moonbeam на другие парачейны или перемещение других активов на Moonbeam в виде представлений ERC-20.

Moonbeam и Polkadot

Поскольку Moonbeam является парачейном в экосистеме Polkadot, XCM + VMP позволяет осуществлять DOT-переводы из/в Polkadot/Moonbeam. В этом разделе приводится высокоуровневый обзор всех действий, связанных с выполнением таких XCM-сообщений.

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

Алиса (Polkadot) хочет перевести определенное количество DOTs с Polkadot на свой счет на Moonbeam, названный Alith. Поэтому она инициирует XCM, в котором выражает свои намерения. Для таких переводов Moonbeam владеет суверенным счетом на Polkadot.

Следовательно, выполнение сообщения XCM на Polkadot переведет сумму DOTs на суверенный счет Moonbeam на Polkadot. Как только активы будут депонированы, вторая часть сообщения будет отправлена в Moonbeam.

Moonbeam локально выполнит действие, на которое запрограммировано сообщение XCM. В данном случае это майнинг и перевод такого же количества xcDOTs (межцепочечных DOTs) на счет, определенный Алисой, которым в данном случае является Alith. Комиссия за выполнение XCM в целевом парачейне оплачивается в переводимом активе (xcDOTs в данном примере).

Обратите внимание на следующее:

  • Счета Alice и Alith могут быть разными. Например, счета Polkadot — это счета SR25519 (или ED25519), а счета Moonbeam — это счета ECDSA (в стиле Ethereum). У них также могут быть разные владельцы.
  • Существует определенная степень доверия, когда одна цепочка полагается на другую в выполнении своей части сообщения XCM. Это запрограммировано на уровне выполнения, поэтому может быть легко проверено.
  • В данном примере кросс-чейн ДОТы (xcDOTS) являются обернутым представлением оригинальных ДОТов, хранящихся на счету Суверена Moonbeam на Polkadot. xcDOTы могут быть переданы внутри Moonbeam в любое время, и их также можно обменять на ДОТы по принципу 1:1.

Alith вложила свои xcDOTs в пул ликвидности. Далее, Charleth приобретает некоторое количество xcDOTs путем свопинга против этого пула ликвидности, и он хочет перевести некоторое количество xcDOTs на счет Polkadot Чарли. Поэтому он инициирует XCM, который выражает его намерения.

Следовательно, в результате выполнения сообщения XCM на Moonbeam будет сожжено определенное количество xcDOTs. Как только активы будут сожжены, вторая часть сообщения будет отправлена в Polkadot.

Polkadot выполнит локально действие, на которое запрограммировано сообщение XCM. В данном случае, это перевести такое же количество сожженных xcDOT со счета Суверена Moonbeam на счет, определенный Charleth, который в данном случае является Charley.

Moonbeam и другие парачейны

Поскольку Moonbeam является парачейном в экосистеме Polkadot, XCM + XCMP позволяет передавать активы от/к Moonbeam и другим парачайнам. В этом разделе приводится высокоуровневый обзор основных различий по сравнению с XCM от/к Polkadot/Moonbeam.

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

Затем, когда Alith (Moonbeam) переводит определенное количество GLMRs с Moonbeam на другой счет (Alice) в целевой парачейне, токены отправляются на суверенный счет, принадлежащий целевому парачейну на Moonbeam.

Ожидается, что по мере выполнения сообщения XCM в целевом парачейне будет майниться и переводиться такое же количество xcGLMRs (межцепочечных GLMRs) на счет, определенный Alith, которым в данном случае является Alice. Плата за выполнение XCM в целевом парачейне оплачивается в переведенном активе (xcGLMRs в данном примере).

Процесс аналогичен процессу перемещения xcGLMR обратно в Moonbeam, как описано в предыдущем разделе. Сначала при выполнении сообщения XCM сжигается количество xcGLMR, возвращаемых в Moonbeam. После сжигания остаточная часть сообщения отправляется в Moonbeam через релейную цепочку. Moonbeam локально выполнит XCM-сообщение и переведет GLMRs (такое же количество сожженных xcGLMRs) с целевого счета Суверена Парачейна на указанный адрес.

--

--