Перейти к основному содержанию
Стратегическая дорожная карта. Описанная здесь модель обеспечения — целевая архитектура. Текущие контракты обеспечивают подмножество этих инвариантов; остальные — планируемая работа, отслеживаемая через эту страницу как авторитетная целевая цель дизайна. См. Overview для деталей перехода V1/V2.

Почему Contract Layer не подлежит обсуждению

Strategy Layer определяет что должно произойти. Agent Layer делает это эффективно. Contract Layer — финальная страховка, гарантирующая, что ничего вредоносного не произойдёт, даже если оба других слоя скомпрометированы или несогласованы. Каждая мутирующая инструкция в протоколе выполняет одни и те же три проверки перед исполнением:
1. Проверка подписанта  → является ли вызывающий агентской ролью, допущенной к вызову этой инструкции?
2. Проверка конфига     → уважает ли действие текущие границы StrategyConfig?
3. Проверка инварианта  → нарушит ли действие захардкоженный инвариант?

Если любая проверка падает: отклонение с типизированной ошибкой. Без исключений.
Это обеспечение, не совет. Плохо ведущий себя агент не может произвести состояние вне границ. Вредоносное обновление StrategyConfig всё равно не может обойти инварианты, захардкоженные на уровне контракта.

Захардкоженные инварианты

Они живут в самом коде контракта. Их изменение требует обновления программы, подписанного Upgrade Authority (Team Multisig при запуске; отделена от config и pause authorities). Governance не может изменить их через обновления StrategyConfig сами по себе.

Fund conservation

compress_liquidity не может списать пул vault в отрицательную сумму. grow_liquidity может только добавлять из Nexus. Ребалансировки — преобразования, сохраняющие капитал по построению.

NAV floor

adjust_capital не может снизить total_invested_capital ниже MIN_CAPITAL_FLOOR (1 USDC lamport). Предотвращает NAV = 0 при supply > 0, что заблокировало бы vault.

Неизменность permanent tail

Bin’ы в [permanent_tail_floor_bin .. left_anchor_bin] никогда не списываются никакой инструкцией. Попытка сдвинуть или слить — отклонение.

Эксклюзивность комиссии на mint-пути

Пропуск комиссии на swap мастер-пула применяется только когда инструкция действительно маршрутизирует в mint_rwt. Bin-walk swap’ы всегда платят полную комиссию; swap’ы с маршрутом в mint никогда не платят комиссию DEX. Никакое гибридное состояние недостижимо.

Достижимость kill switch

Каждая мутирующая агентская инструкция читает StrategyConfig.kill_switch_active перед исполнением. Нет обходного пути — проверка компилируется в каждую инструкцию.

Обновления из предложения

update_strategy_config проверяет своего вызывающего против записи разрешённого предложения futarchy. Прямые вызовы multisig после V2 отклоняются с UpdateMustOriginateFromProposal.

Монотонные версии конфига

config_version строго возрастает. Нет понижения. Агенты, читающие старую версию через устаревшие данные аккаунта, отклонятся при несовпадении со state-аккаунтом, который они мутируют.

Обеспечение timelock

apply_strategy_update отклоняется, если now < pending_update_unlock_ts. Никто — ни governance, ни команда — не может сократить окно разблокировки для уже поданного обновления.

Kill switch

Kill switch — аварийный тормоз протокола. Его семантика намеренно асимметрична, чтобы отдавать предпочтение безопасности над удобством.

Полномочия

Три независимых пути могут активировать kill switch. У каждого свой профиль доверия, скорости и стоимости — ни один актор не несущий, и ни один путь не может быть отключён без одновременного обхода двух других.
ПутьКтоСтоимость запускаЗадержка
Halt BondЛюбой держатель ARLСтейк 1% от ARL в обращенииМгновенно (в той же tx, что и стейк)
Pause AuthorityTeam MultisigПорог multi-sig достигнутМгновенно, без залога
GovernanceУспешное аварийное предложение futarchyПредложение + разрешение по TWAP~72ч жизненный цикл предложения, без залога
Три полномочия намеренно отделены друг от друга и от Config и Upgrade authorities. Компрометация одного пути не компрометирует другие.
Почему три пути, а не один. Halt Bond — основной — permissionless, экономически согласованный, самофинансирующийся. Pause Authority — резерв — безусловная скорость в zero-day сценариях, где даже сборка 1% ARL занимает слишком долго. Активация governance — демократический минимум — серьёзные разногласия маршрутизируются через on-chain консенсус без элитных полномочий или требований капитала. Победа над всеми тремя сразу требует компрометации трёх независимых наборов подписантов плюс способности предотвратить любого держателя ARL от стейка — фактически компрометации самого блокчейна.

Halt Bond — детальный дизайн

Вместо выборного органа стражей протокол использует чисто экономическую модель: любой может запустить аварийную остановку, но должен внести реальную стоимость ARL как залог под легитимность вызова остановки. Хорошие вызовы зарабатывают бонус; плохие теряют весь стейк в Treasury.

Залог — 1% от ARL в обращении

Рассчитывается на момент транзакции относительно on-chain total_supply − protocol_held_balance. Блокируется в замороженном PDA HaltBondEscrow на всё окно обзора. Размер существенен, чтобы отпугнуть ложные остановки, но достижим для скоординированного ответа на реальные угрозы.

Мгновенный on-chain эффект

Инструкция activate_kill_switch_with_bond выполняет стейк и переключение флага атомарно. В пределах одного блока: залог заблокирован, kill_switch_active = true, все инструкции агентов отклоняются. Никакого окна координации, никакого ожидания multi-sig.

7-дневное окно обзора

Ревьюер изучает доказательства и выносит вердикт: Оправдан или Не оправдан. Вердикт обзора должен быть опубликован on-chain с обоснованием. Ревьюер V1: Team Multisig. Ревьюер V2: предложение futarchy «Был ли halt X оправдан?».

Асимметричные исходы

Оправдан → залог возвращается вызывающему + опциональный бонус из Treasury, масштабируемый к предотвращённому ущербу (потолок, заданный governance, 5%). Не оправдан → весь залог уходит в Казначейство Areal. Никаких промежуточных вердиктов; никаких согласованных возвратов.

Поток активации

1

Обнаружена аномалия

Любой участник наблюдает что-то не так через on-chain мониторы, каналы сообщества, отчёты bug bounty, аудит-события или собственный анализ.
2

Залог внесён, остановка включена

Вызывающий отправляет activate_kill_switch_with_bond(rationale_uri), переводящий 1% от ARL в обращении в PDA HaltBondEscrow. Та же транзакция выставляет kill_switch_active = true. Все инструкции агентов в RWT Vault, Nexus и Treasury начинают отклоняться с KillSwitchActive на следующем вызове. Пользовательские операции продолжаются не затронутыми.
3

Окно обзора (7 дней)

Вызывающий публикует детальное обоснование (on-chain memo-поле или off-chain с закреплённым хешем). Ревьюер изучает доказательства — Team Multisig во время V1, futarchy во время V2. Сообщество может отправлять дополнительные доказательства в on-chain запись в этом окне.
4

Вердикт вынесен

В пределах 7-дневного окна ревьюер публикует вердикт on-chain: HaltVerdictJustified или HaltVerdictNotJustified. Событие включает хеш обоснования и применимый бонус (если оправдан). Механизма обжалования нет — вердикт обязателен.
5

Разрешение залога

ОправданHaltBondEscrow освобождает залог обратно вызывающему; событие BountyDisbursement, если бонус назначен. Не оправданHaltBondForfeit переводит весь залог в Казначейство Areal; вызывающий добавляется в HaltCooldownRegistry (30-дневный cooldown кошелька).
6

Повторная активация

Деактивация kill_switch_active следует стандартному 7-дневному timelock уровня critical с момента подачи предложения повторной активации governance’ом. Это идёт независимо от вердикта залога — даже оправданная остановка с полным бонусом всё равно занимает 7 дней для размотки. Безопасность склоняется к осторожности.

Параметры

ПараметрПо умолчаниюНастраивается governance?
Размер залога1% от ARL в обращенииДа (critical-уровень)
Окно обзора7 днейДа (critical-уровень)
Потолок бонуса5% от предотвращённого ущербаДа (critical-уровень)
Cooldown кошелька после потери30 днейДа (operational-уровень)
Деноминация залогаARLНет — захардкоженный инвариант
Полномочия вердиктаTeam Multisig (V1) / Futarchy (V2)Структурно — задаётся деплоем V2

Почему экономический залог лучше выборного совета

Прошлый дизайн рассматривал выборный сообществом Safety Council (7 членов, supermajority 4-of-7). Модель залога оказалась строго проще по каждому важному измерению:
ПроблемаВыборный CouncilHalt Bond
Авторизация запуска7 конкретных людейЛюбой с 1% ARL
Накладные расходы выборовЕжегодно на место, правила правомочностиНет
Личное раскрытиеТребуется (разнообразие, аффилиации)Не нужно
Требуемая координация4 из 7 соглашаются в 30 минСольный стейк, атомарно
Устойчивость к griefingТолько ставка репутации1% от supply ARL под риском
Модель компенсацииЕжемесячная стипендия из TreasuryНет — останавливающий финансирует свой стейк
Исход плохой остановкиУщерб репутации, будущее удалениеTreasury получает 1% от supply
Согласованность стимуловЛичная ответственностьПрямая экономическая ставка в игре
Переход V1/V2Требует построения инфраструктуры выборовРаботает с Team Multisig как ревьюером V1 сразу
СамофинансированиеНет — стоит Treasury в стипендияхДа — плохие акторы финансируют Treasury
Модель залога согласуется с остальной философией economic-first дизайна Areal: заменять социальную координацию рыночными механизмами везде, где возможно. Так же как futarchy заменяет голосование prediction markets, Halt Bond заменяет выборы стражей на обеспеченную залогом уверенность.

Почему не чистое «любой может остановить» без залога

Бесплатная permissionless остановка создаёт griefing-атаку: gas тривиален для атакующего, в то время как 7-дневный timelock повторной активации накладывает массивные асимметричные расходы на протокол. Залог закрывает эту асимметрию — атакующий теперь платит 1% от supply ARL за каждую ложную попытку остановки, и вердикт «не оправдан» отправляет эту ценность в Treasury, которому атака должна была навредить.

Страховка Pause Authority

Pause Authority (Team Multisig) сохраняет независимую способность мгновенной остановки без залога для сценариев, где даже Halt Bond слишком медленный:
  • Zero-day эксплойты контрактов, наблюдаемые во время активной атаки
  • Сбои внешних зависимостей (сбой oracle, дефолт эмитента стейблкоина), требующие немедленного вмешательства
  • Скоординированные аномалии на нескольких поверхностях, где секунды важнее процесса
Pause Authority не замещает Halt Bond — она дополняет его. Governance сохраняет полномочия удалять или заменять набор Pause Authority. От любого держателя ARL также ожидается независимая активация Halt Bond, если он наблюдает что-то, что Pause Authority упустила.

Компенсация

Никаких стипендий, никакого Council, никаких постоянных ролей для финансирования. Единственный поток компенсации — бонус за оправданные остановки:
СобытиеИсточникСумма (задаётся governance)
Оправданная остановкаКазначейство ArealМасштабируется к предотвращённому ущербу, потолок 5%
Неоправданная остановка(потеря в Treasury)Стоимость залога переводится от вызывающего
Остановка Pause Authorityn/aTeam Multisig действует в операционной роли
Остановка governancen/aИндивидуальная компенсация отсутствует
Механизм спроектирован как самофинансирующийся. Через разумный горизонт потери от остановок недобросовестной веры ожидаются существенно превосходящими выплаты бонусов за остановки добросовестной веры — потому что ложные срабатывания гораздо чаще подтверждённых эксплойтов.

Что останавливает kill switch

Когда kill_switch_active = true, каждая инструкция агента отклоняется с KillSwitchActive:
  • vault_swap — никаких приобретений OT
  • grow_liquidity / compress_liquidity — никакой ребалансировки
  • nexus_swap / nexus_add_liquidity / nexus_remove_liquidity — никаких изменений LP
  • claim_yield при вызове Yield Harvester — приостановлен (пользователи всё ещё могут забирать свою собственную доходность напрямую)

Что остаётся operational

  • Пользовательские чтения (запросы NAV, проверки балансов)
  • Пользовательские swap’ы на DEX (торговля никогда не останавливается — ликвидность это капитал пользователей, не капитал протокола)
  • Пользовательские mint_rwt и claim_lp_fees
  • Claim’ы доходности пользователей (собственные merkle-доказательства пользователя)
  • Предложения governance (kill switch не останавливает governance)
  • remove_liquidity для LP-холдеров в пулах StandardCurve (выход всегда разрешён)
Остановка агентов не блокирует пользователей вне протокола — она приостанавливает автономные операции, пока governance решает следующий шаг.

Деактивация

Выключение kill switch — это обновление critical-уровня с 7-дневным timelock. Даже если активация была случайной, повторная активация требует полного окна выхода для сообщества. Безопасность склоняется к осторожности.
Практическое следствие: если kill switch запущен по ошибке в 10:00 утра, агенты остаются неактивны до 10:00 утра через неделю. Протокол деградирует плавно — пользователи по-прежнему могут взаимодействовать, доходность по-прежнему накапливается на уровне OT, но автономная оптимизация не работает. Это намеренный режим отказа: операционная медленность приемлема, тихая компрометация — нет.

Circuit Breakers

Помимо kill switch, Contract Layer обеспечивает несколько circuit breakers на действие, срабатывающих автоматически без вмешательства governance.

По объёму

// Проверяется на каждом vault_swap / nexus_swap / nexus_add_liquidity
require!(
    amount_in_usdc <= strategy.max_single_swap_volume_usdc,
    CircuitBreaker::SingleTxCapExceeded
);

// Дневной счётчик хранится в StrategyConfig, сбрасывается в UTC midnight любым
require!(
    daily_volume_used + amount_in_usdc <= strategy.max_daily_swap_volume_usdc,
    CircuitBreaker::DailyCapExceeded
);

По slippage

// Вычисляется против oracle / TWAP reference price
let slippage_bps = compute_slippage(expected_out, actual_out);
require!(
    slippage_bps <= strategy.max_slippage_bps,
    CircuitBreaker::SlippageExceeded
);

По концентрации

// Перед принятием новой OT-позиции
let projected_alloc = (current_ot_value + new_buy_value) / total_vault_value;
require!(
    projected_alloc <= strategy.max_alloc_per_ot_bps,
    CircuitBreaker::ConcentrationExceeded
);

По резерву

// Перед любой операцией, снижающей резерв USDC
let projected_reserve = (current_usdc - outflow) / total_vault_value;
require!(
    projected_reserve >= strategy.min_reserve_usdc_bps,
    CircuitBreaker::ReserveFloorBreached
);

По cooldown

// Rebalancer — предотвращает thrashing
require!(
    now - pool.last_rebalance_ts >= strategy.rebalance_cooldown_secs,
    CircuitBreaker::CooldownNotElapsed
);
Каждый circuit breaker эмитирует событие при срабатывании, чтобы операторы и держатели могли видеть причину отказа без инспекции логов транзакции.

Цели формальной верификации

Несколько инвариантов — цели механического доказательства (через Coq, Isabelle или Solana-специфичные инструменты верификации по мере их созревания):

Fund conservation

Утверждение: Для всех достижимых состояний и всех последовательностей вызовов grow_liquidity / compress_liquidity, sum(pool.vault_a_balance + pool.vault_b_balance) по всем мастер-пулам монотонно неубывающая по модулю swap’ов и выводов, инициированных пользователями.

Безопасность kill switch

Утверждение: Пока kill_switch_active == true, ни одна инструкция агента не исполняется до конца. Формально: инвариант каждой мутирующей инструкции агента включает !kill_switch_active.

Обеспечение timelock

Утверждение: apply_strategy_update требует now >= pending_update_unlock_ts. Никакой путь в коде не обходит эту проверку. Доказуемо символическим исполнением по обработчику инструкции.

Монотонность конфига

Утверждение: config_version строго возрастает в любой последовательности успешных обновлений. Никакая инструкция не декрементирует и не присваивает равную версию.

Неизменность permanent tail

Утверждение: BinArray[i].liquidity_b для i ∈ [permanent_tail_floor_bin, left_anchor_bin] никогда не декрементируется в любой достижимой последовательности вызовов, кроме явной governance-предписанной инструкции retire_permanent_tail (требующей Upgrade Authority).

Изоляция полномочий агентов

Утверждение: Ни один keypair агента не может удовлетворить проверку подписанта для любой инструкции вне его опубликованной поверхности. Формально: signer_check(instruction, signer) инъективна на парах (agent_role, instruction).
Работа по верификации ограничена зрелостью инструментов и бюджетом аудита. Пока формальные доказательства не существуют, это намерения дизайна, задокументированные для будущей верификации — не гарантии.

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

Обнаружение

Несколько независимых каналов выявляют аномалии:
  • On-chain мониторы — индексеры помечают срабатывания circuit breaker, неожиданные переводы ценности, необычную частоту действий агента
  • Надзор governance — держатели ARL могут подавать предложения IncidentReport для флагирования наблюдаемых проблем
  • Аудит-события — каждое действие агента наблюдаемо; статистические аномалии (напр. сдвиг распределения slippage) детектируемы механически
  • Внешний bug bounty — действующая программа для раскрытий, нарушающих инварианты

Triage (T + 0 до T + 30 минут)

1

Классифицировать серьёзность

  • Sev-1: потеря средств, живой эксплойт, попытка обхода kill switch → Pause Authority действует немедленно
  • Sev-2: паттерн срабатываний circuit breaker, плохое поведение агента внутри границ → обзор governance
  • Sev-3: проблема UX, некритическая аномалия → нормальный поток предложений
2

Sev-1: Аварийная остановка

Pause Authority (Team Multisig) подписывает транзакцию activate_kill_switch. Все агенты замораживаются в следующем блоке. Пользовательские операции продолжаются.
3

Публичное раскрытие

Status page и social-каналы обновлены в пределах 30 минут остановки. Охват, наблюдаемое влияние и следующие шаги опубликованы.
4

Уведомление governance

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

Сдерживание (T + 30 минут до T + дни)

  • Скомпрометированный keypair: ротация через governance-предложение (24ч operational timelock); откат любого восстанавливаемого состояния через компенсирующие транзакции
  • Использованная инструкция: подготовить обновление программы; деплой через Upgrade Authority
  • Плохой конфиг: подать встречное предложение с активацией kill switch на мгновенном уровне, critical-уровень для исправления конфига
  • Проблема внешней зависимости (oracle, эмитент стейблкоина): остановить агентов, переключить на резерв, коммуницировать

Post-mortem

Каждый инцидент Sev-1 и Sev-2 производит публичный post-mortem в течение 14 дней:
  • Хронология со ссылками на блоки
  • Анализ первопричины
  • Охват влияния (средства, пользователи, длительность)
  • Применённое восстановление
  • Инварианты, добавленные или усиленные как результат
  • Оправдан ли новый захардкоженный инвариант для следующего обновления программы
Post-mortem’ы фиксируются в /changelog/ как YYYY-MM-DD-incident-<short-name>.mdx.

Компенсация

Протокол не гарантирует компенсацию пользователям за потери, возникшие из эксплойтов. Однако Казначейство Areal держит резервы, явно отложенные (через governance) для восстановления после инцидентов. Governance может предложить компенсацию затронутым держателям, если позиция Treasury и охват инцидента это оправдывают. Это дискреционное решение от случая к случаю, не обещание страхования.

Глубокая оборона — резюме

Каждый вертикальный класс контроля останавливает разный вектор атаки:
КонтрольАдресует угрозуСлой
Границы StrategyConfigСкомпрометированный агент, несогласованный агентStrategy
Проверка подписанта на инструкциюУкраденный keypair агента, вызывающий неправильную функциюContract
Захардкоженные инвариантыВредоносное governance-предложениеContract
TimelockСпешный / вынужденный governanceContract
Kill switch (мгновенно вкл)Активный эксплойт, zero-dayContract + Pause Authority
Kill switch (7д выкл)Социально-инженерное «всё чисто»Contract
Circuit breakersУбежавший агент внутри границContract
Аудит-событияНеобнаруженная аномалияНаблюдаемость
Ротация агентаКомпрометация keypairStrategy + Contract
Разделение Pause AuthorityКомпрометация multisigУправление ключами
Разделение Upgrade AuthorityУязвимость кодаУправление ключами
Формальная верификацияБаг логикиСлой доказательств
Bug bountyВнешнее обнаружениеСообщество
Надзор governanceСистемный дрейфСообщество + Strategy
Никакой единый контроль не несущий. Каждый критический инвариант обеспечивается как минимум дважды — обычно проверкой StrategyConfig и захардкоженным инвариантом и circuit breaker.

Что этот раздел НЕ утверждает

Нет утверждения о нулевом риске

Глубокая оборона снижает поверхность атаки и радиус поражения. Не устраняет риск smart-контракта, риск oracle или риск захвата governance. См. Risk Disclosure.

Нет завершённого аудита

Цели формальной верификации — стремления. Текущие контракты имеют внутренний обзор; внешние аудиты — предпосылка для деплоя агентов в mainnet.

Нет обещания компенсации

Резервы Treasury могут финансировать восстановление по усмотрению governance. Никакого автоматического покрытия, никакого страхового продукта, никакой гарантии пользователю.

Нет несломаемой системы

Любая система, включающая людей, код и экономические стимулы, может упасть. Цель дизайна — сделать режимы отказа ограниченными, наблюдаемыми и восстанавливаемыми — не полностью предотвратить отказ.

Резюме

Три точки обеспечения

Проверка подписанта, границы StrategyConfig, захардкоженные инварианты — каждая мутация проверяет все три

Мгновенно-включающийся kill switch

Активация с нулевой задержкой Pause Authority или governance; 7-дневный timelock на деактивацию

Circuit breakers

На транзакцию, на день, slippage, концентрация, резерв, cooldown — автоматические срабатывания без governance

Цели формальной верификации

Fund conservation, достижимость kill switch, обеспечение timelock, монотонность конфига — цели механического доказательства

Публичное реагирование на инциденты

Классификация серьёзности, цель 30-минутного раскрытия, 14-дневный post-mortem, цикл усиления инвариантов

Глубокая оборона

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