Анализ компенсирующих транзакций, частичного расчёта и ограничений атомарности при межсетевых платежах
Многие организации и разработчики по-прежнему считают, что успешное подтверждение транзакции в сети отправителя доказывает завершение платежа. В межсетевых системах это часто не так.
При изучении технической документации и наблюдении за базовым поведением системы в контролируемых условиях постоянно проявляется одна закономерность: списание в исходной сети может успешно завершиться, а на следующем этапе в сети назначения всё ещё может произойти сбой. В таком случае средства не возвращаются автоматически. Обычно система выполняет **компенсирующую транзакцию**.
Частичная атомарность
В официальной документации Rayls (*Отправка транзакций Enygma* и *Как работает Enygma*) чётко описаны границы атомарности:
- Вызов в исходной сети атомарен: сжигание и запрос на перевод либо завершаются успешно вместе, либо вместе завершаются неудачей.
- Каждое отдельное направление перевода атомарно: выпуск токенов и все программные шаги в рамках этого направления либо завершаются успешно вместе, либо вместе завершаются неудачей.
- Все направления перевода в рамках одного платежа **не являются** атомарными. Они могут завершаться независимо друг от друга.
В документации прямо сказано: «Сбои компенсируются, а не откатываются». Транзакция в Hub и выпуск токенов в сети назначения — это отдельные транзакции. Если выпуск токенов или программный шаг в сети назначения завершается неудачей, ретранслятор запускает компенсирующую транзакцию, чтобы вернуть средства отправителю. Это не одна атомарная транзакция между сетями.
До фактического зачисления возврата баланс отправителя в исходной сети остаётся уменьшенным на сумму, перевод которой завершился неудачей.
Что такое компенсирующая транзакция?
Компенсирующая транзакция — это **новая, отдельная** транзакция, созданная для исправления последствий сбоя. Это не откат исходной транзакции.
Согласно документации RaylsEnygmaHandler, если какой-либо программный шаг откатывается, всё направление перевода (включая выпуск токенов) завершается неудачей. Затем ретранслятор возвращает средства отправителю в исходной сети с помощью компенсирующего механизма. Возврат отображается под **тем же идентификатором ссылки** и записывается в исходной сети со статусом `RECEIVED`, а не как простой откат исходного списания.
Простой пример, соответствующий описанному в документации поведению:
- В исходной сети списывается 10.
- В одну из сетей назначения успешно поступает 4.
- В другой сети назначения выполнение завершается неудачей.
- Отдельная компенсирующая транзакция возвращает отправителю 6.
Итог: доставлено 4 + возвращено 6 = 10. Исходная транзакция в исходной сети по-прежнему записана как успешная.
Схемы
Базовый процесс:

Атомарность и несколько направлений перевода:

Пример частичного расчёта:

Практические риски, на которые стоит обратить внимание
В документации и наблюдениях в контролируемых средах часто упускают из виду несколько моментов:
1. Возврат средств происходит не мгновенно
В самой документации Rayls отмечается, что до зачисления возврата баланс отправителя остаётся уменьшенным. Задержки ретранслятора или проблемы с генерацией доказательства могут привести к тому, что средства останутся в ожидании дольше, чем предполагалось.
2. Сверку необходимо выполнять отдельно для каждого направления
Одной квитанции исходной сети недостаточно. Необходимо сопоставить сумму, списанную в исходной сети, сумму, поступившую в каждую сеть назначения, сумму, перевод которой завершился неудачей, и сумму, фактически возвращённую посредством компенсирующей транзакции (обычно под тем же идентификатором ссылки).
3. Зависимость от внесетевых компонентов
Обнаружение сбоев и инициирование возврата часто зависят от ретрансляторов. Даже при локальном тестировании могут появляться предупреждения, связанные с фиксацией баланса или генерацией доказательства. В продуктивной среде эти риски выше.
4. Результаты контролируемого тестирования ≠ гарантии для продуктивной среды
Стабильная работа в лабораторных условиях при специально вызванных сбоях не гарантирует такого же поведения в продуктивной среде с параллельной нагрузкой, проблемами сети или несогласованностью состояний.
Заключение
Успешная квитанция в исходной сети доказывает лишь то, что списание было зафиксировано. Она не доказывает, что средства поступили в каждую сеть назначения, и не подтверждает, что какая-либо неудавшаяся часть была возвращена.
Успешное выполнение в исходной сети, расчёт в сети назначения и компенсирующий возврат — связанные события, но **это не одно и то же событие**. Понимание этого различия важно при проектировании и эксплуатации межсетевых расчётов.
В официальной документации Rayls этот компенсирующий механизм уже описан открыто. Важно не считать результаты, полученные в контролируемой среде, полным доказательством надёжности в продуктивной среде.
---
Отказ от ответственности:
Эта статья представляет собой анализ, основанный на общедоступной документации Rayls и технических наблюдениях в контролируемых средах. Это не официальный аудит, не инвестиционная рекомендация и не гарантия поведения какой-либо системы в продуктивной среде. Читателям следует проверять сведения непосредственно по официальной документации.
Источники
- Отправка транзакций Enygma: https://docs.rayls.com/docs/send-enygma-transactions
- Как работает Enygma: https://docs.rayls.com/docs/how-enygma-works
- RaylsEnygmaHandler: https://docs.rayls.com/docs/raylsenygmahandler
