Allow-list маршрутов: политика разрешённых направлений A→B для межсети

Allow-list маршрутов — это публичная политика протокола, которая чётко определяет, какие межсетевые направления A→B разрешены, в каких режимах переноса актива и при каких ограничениях (лимиты, окна финальности, паузы). Такой список — основа канона маршрутов и обязательный элемент безопасной интероперабельности: он ограничивает поверхность риска, упрощает аудит и делает поведение протокола предсказуемым для пользователей.

Allow-list маршрутов: политика разрешённых направлений A→B для межсети

Allow-list маршрутов тесно связан с архитектурами:

  • Каноничный мост — «официальный» путь переноса активов между сетями.
  • CCT — омничейн-модель токена с единой линией обращения.
  • CCIP — транспорт сообщений и «программируемых переводов» между сетями.
  • Программируемый перевод — перенос ценности + вызов логики в целевом домене.
  • Интероперабельность — системное проектирование сообщений, активов и данных.

Allow-list маршруты

  • Allow-list — это явный список разрешённых маршрутов A→B с параметрами безопасности.
  • Для каждого маршрута фиксируются: режим (*burn/mint* или *lock/mint*), лимиты, порог финальности, режимы паузы и политика «только возвраты».
  • Политика публикуется как версионируемый манифест и используется контрактами/офчейн-сервисами для валидации.
  • SRE-управление опирается на метрики SLA (latency P95/P99, success ratio, retry rate) и плейбуки инцидентов.

Зачем нужен allow-list маршрутов

Проблема Что даёт allow-list
Фрагментация ликвидности (много «диких» мостов) Единый канон: один «официальный» путь для актива
Непредсказуемый риск (разные финальности/цепочки) Пер-маршрутные пороги финальности и лимиты
Эскалация инцидентов (blast radius) Быстрое отключение маршрута: «пауза/только возвраты»
Неочевидные комиссии и задержки Публичные параметры SLA и окна доставки
Юзабилити-хаос Предсказуемый UX и статусы по каждому направлению

Что входит в политику allow-list

Параметр Назначение Пример значения
source_chain / dest_chain Откуда и куда разрешён маршрут ethereum → arbitrum, solana → base
token / asset class Какой актив/класс активов разрешён USDC, WETH, CCT:XYZ
mode Режим переноса ценности burn/mint или lock/mint
max_tx_amount Лимит на одну операцию 50,000 USDC
max_interval_amount Лимит на окно времени 1,000,000 USDC / 1h
finality_threshold Порог финальности в исходной сети L1=18 блоков, L2=challenge window 7d
deadline/TTL Максимальное время на доставку/исполнение 30 мин
price_requirements Условия цены/проскакивания для «программируемых переводов» slippage ≤ 0.5%
pause_state Текущий режим маршрута active / paused / only-returns
allowed_receivers Белый список контрактов-получателей (опционально) vault_X, lending_Y
version Версия манифеста и схемы v1.3.2

Дата-модель манифеста allow-list

Манифест публикуется в репозитории/реестре и дублируется ончейн через геттеры. Ключевые поля:

  • route_id — стабильный идентификатор маршрута (source:dest:token).
  • policy — объект с mode, лимитами, финальностью, TTL, ценовыми требованиями.
  • governance — роли, timelock и процедура обновлений.
  • statusactive / paused / only-returns.
  • updated_at и version — для воспроизводимости и отката.

Требование: манифест должен быть машиночитаемым (для ботов/валидаторов) и человеко-читабельным (для пользователей/аудита).

Взаимодействие с контрактами и транспортом сообщений

Получатель в целевой сети обязан:

  • сверить source_chain, sender, route_id с allow-list манифестом;
  • проверить режим и лимиты (max_tx_amount, max_interval_amount);
  • применить финальность: не исполнять до достижения порога в исходной сети;
  • соблюдать TTL/deadline и ценовые условия (если payload зависит от цены);
  • поддерживать идемпотентность (см. Идемпотентность): один messageID → один эффект;
  • уважать pause_state: в paused — отклонять новые, в only-returns — обрабатывать только возвраты.

Режимы переноса: burn/mint и lock/mint

Режим Когда выбирать Комментарии
Burn/Mint Быстрая надёжная финальность в исходной сети Чистый учёт предложения; меньше кастодиальных рисков
Lock/Mint «Длинная» финальность, особые регуляторные/кастодиальные требования Нужен аудит «замков», учёт хранителя, повышенная стоимость

Режим задаётся пер-маршрутно и фиксируется в манифесте allow-list, см. Каноничный мост и CCT.

Лимиты и окна

  • Per-tx: ограничивает размер одной операции.
  • Per-interval: ограничивает суммарный объём в окне (1h/24h).
  • Burst-limit: защищает от «гребка» коротких пиков.
  • Large-tx policy: крупные операции исполняются отложенно после дополнительных подтверждений.

Лимиты — основной предохранитель на время инцидента и часть SRE-регламента.

Паузы и режим «только возвраты»

  • paused — новые межсетевые операции отклоняются; уже «в полёте» — обрабатываются по правилам.
  • only-returns — разрешены только возвраты активов/состояний; новые переводы запрещены.
  • resume — постепенное включение по канареечным лимитам и мониторингу SLA.

Эти режимы публикуются в манифесте и дублируются в ончейн-геттерах для фронтов/ботов.

SLA и метрики эксплуатации

Связь allow-list и SLA раскрывается в наборе метрик. Базовый профиль см. в SLA: latency P95/P99; здесь — контур именно маршрутов:

  • Latency P50/P95/P99 доставки A→B и «время до исполнено» в B.
  • Success ratio успешных доставок/исполнений по маршруту.
  • Retry rate и duplicate hit rate (эффективность идемпотентности).
  • Queue length: глубина очередей по маршруту.
  • Rate-limit triggers: частота/длительность срабатываний лимитов.
  • Equivalence drift (для CCT): сводки «сожжено/под замком ↔ сочеканено».

Срыв SLA — повод автоматически понизить лимиты или перевести маршрут в paused/only-returns.

Плейбуки инцидентов для маршрутов

  • Деградация транспорта: рост latency/ретраев → понижаем лимиты, включаем отложенное исполнение крупных сумм.
  • Аномалия финальности: reorg/длинное окно L2 → повышаем подтверждения, задерживаем «большие» переводы.
  • Дисбаланс CCT: расхождение эквивалентности → paused + «только возвраты», ручная сверка.
  • Сигнал о компрометации домена: срочная пауза маршрута, отзыв доверия, публикация advisory.

После инцидента — пост-мортем: корректируем allow-list, лимиты, финальность и SLA.

Проектирование UX и документации

  • Публикуйте таблицу маршрутов на сайте/в репозитории: сети, токены, режимы, лимиты, финальность, статусы.
  • Обновления делайте через версионирование манифеста и timelock на критичные изменения.
  • В интерфейсе показывайте ожидаемое окно доставки и текущий status маршрута (active/paused/only-returns).

Пример табличного представления

Маршрут Режим Порог финальности Per-tx Per-interval Статус
ethereum → arbitrum (USDC) burn/mint 18 блоков 50k 1m/1h active
solana → base (CCT:XYZ) lock/mint L1: 32 блока 20k 200k/1h paused
bsc → polygon (USDT) burn/mint 15 блоков 30k 500k/1h only-returns

Интеграция с программируемыми переводами

В сценариях программируемого перевода allow-list задаёт не только путь ценности, но и разрешённые получатели/действия:

  • белый список контрактов-получателей (vault/AMM/lending);
  • допустимые типы операций (deposit, repay, mint_to, redeem);
  • параметры цены/дедлайна для предотвращения «плохых» исполнений.

Идемпотентность и allow-list

Для каждого маршрута требуется строгая идемпотентность:

  • журнал globalMessageID → исполнено/хэш;
  • no-op на повторы, отказ устаревших версий payload;
  • геттер статуса для клиентов и офчейн-сервисов.

Анти-паттерны

  • «Разрешены все маршруты» — непредсказуемые траектории, отсутствие контроля риска.
  • Скрытые изменения лимитов/финальности — пользователи теряют доверие; фиксируйте version и делайте публичные изменения.
  • Нет режима only-returns — во время инцидента продолжаете принимать риск.
  • Отсутствие мониторинга P95/P99 — «средние» метрики маскируют хвосты и реальные просадки SLA.
  • Не валидируете получателей — уязвимость к «чужим» контрактам в целевой сети.

Чек-лист внедрения allow-list

  • Определён канон: сети, токены/классы, режимы переноса.
  • Заданы лимиты per-tx/per-interval/burst и пороги финальности.
  • Реализованы режимы paused и only-returns, описаны триггеры переходов.
  • Манифест машинo/человеко-читабелен, с version и route_id.
  • Контракты валидируют маршруты и идемпотентны.
  • Дашборды SLA и алерты по маршрутам подключены.
  • Плейбуки инцидентов протестированы.

FAQ

Чем allow-list отличается от block-list? Block-list запрещает частные случаи, но по умолчанию «всё остальное разрешено». Allow-list наоборот: по умолчанию запрещено всё, кроме явно разрешённых маршрутов с параметрами.

Можно ли иметь несколько разрешённых мостов для одного маршрута? Технически да, но для UX и ликвидности обычно фиксируют канон — один «официальный» путь. Альтернативы возможны как резерв, но с меньшими лимитами.

Как часто обновлять пороги финальности и лимиты? При изменении риска/нагрузки и по итогам пост-мортемов. Изменения делайте через версионирование и timelock, публикуйте diff.

Что показывать пользователю? Цепочки A→B, режим, ожидаемое окно доставки, текущий статус, лимиты по сумме и по окну, коды причин отказа.

Связанные материалы

Task Runner