Почему Contract Layer не подлежит обсуждению
Strategy Layer определяет что должно произойти. Agent Layer делает это эффективно. Contract Layer — финальная страховка, гарантирующая, что ничего вредоносного не произойдёт, даже если оба других слоя скомпрометированы или несогласованы. Каждая мутирующая инструкция в протоколе выполняет одни и те же три проверки перед исполнением:Захардкоженные инварианты
Они живут в самом коде контракта. Их изменение требует обновления программы, подписанного 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 Authority | Team Multisig | Порог multi-sig достигнут | Мгновенно, без залога |
| Governance | Успешное аварийное предложение futarchy | Предложение + разрешение по TWAP | ~72ч жизненный цикл предложения, без залога |
Почему три пути, а не один. 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. Никаких промежуточных вердиктов; никаких согласованных возвратов.
Поток активации
Обнаружена аномалия
Любой участник наблюдает что-то не так через on-chain мониторы, каналы сообщества, отчёты bug bounty, аудит-события или собственный анализ.
Залог внесён, остановка включена
Вызывающий отправляет
activate_kill_switch_with_bond(rationale_uri), переводящий 1% от ARL в обращении в PDA HaltBondEscrow. Та же транзакция выставляет kill_switch_active = true. Все инструкции агентов в RWT Vault, Nexus и Treasury начинают отклоняться с KillSwitchActive на следующем вызове. Пользовательские операции продолжаются не затронутыми.Окно обзора (7 дней)
Вызывающий публикует детальное обоснование (on-chain memo-поле или off-chain с закреплённым хешем). Ревьюер изучает доказательства — Team Multisig во время V1, futarchy во время V2. Сообщество может отправлять дополнительные доказательства в on-chain запись в этом окне.
Вердикт вынесен
В пределах 7-дневного окна ревьюер публикует вердикт on-chain:
HaltVerdictJustified или HaltVerdictNotJustified. Событие включает хеш обоснования и применимый бонус (если оправдан). Механизма обжалования нет — вердикт обязателен.Разрешение залога
Оправдан →
HaltBondEscrow освобождает залог обратно вызывающему; событие BountyDisbursement, если бонус назначен. Не оправдан → HaltBondForfeit переводит весь залог в Казначейство Areal; вызывающий добавляется в HaltCooldownRegistry (30-дневный cooldown кошелька).Повторная активация
Деактивация
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). Модель залога оказалась строго проще по каждому важному измерению:| Проблема | Выборный Council | Halt Bond |
|---|---|---|
| Авторизация запуска | 7 конкретных людей | Любой с 1% ARL |
| Накладные расходы выборов | Ежегодно на место, правила правомочности | Нет |
| Личное раскрытие | Требуется (разнообразие, аффилиации) | Не нужно |
| Требуемая координация | 4 из 7 соглашаются в 30 мин | Сольный стейк, атомарно |
| Устойчивость к griefing | Только ставка репутации | 1% от supply ARL под риском |
| Модель компенсации | Ежемесячная стипендия из Treasury | Нет — останавливающий финансирует свой стейк |
| Исход плохой остановки | Ущерб репутации, будущее удаление | Treasury получает 1% от supply |
| Согласованность стимулов | Личная ответственность | Прямая экономическая ставка в игре |
| Переход V1/V2 | Требует построения инфраструктуры выборов | Работает с Team Multisig как ревьюером V1 сразу |
| Самофинансирование | Нет — стоит Treasury в стипендиях | Да — плохие акторы финансируют Treasury |
Почему не чистое «любой может остановить» без залога
Бесплатная permissionless остановка создаёт griefing-атаку: gas тривиален для атакующего, в то время как 7-дневный timelock повторной активации накладывает массивные асимметричные расходы на протокол. Залог закрывает эту асимметрию — атакующий теперь платит 1% от supply ARL за каждую ложную попытку остановки, и вердикт «не оправдан» отправляет эту ценность в Treasury, которому атака должна была навредить.Страховка Pause Authority
Pause Authority (Team Multisig) сохраняет независимую способность мгновенной остановки без залога для сценариев, где даже Halt Bond слишком медленный:- Zero-day эксплойты контрактов, наблюдаемые во время активной атаки
- Сбои внешних зависимостей (сбой oracle, дефолт эмитента стейблкоина), требующие немедленного вмешательства
- Скоординированные аномалии на нескольких поверхностях, где секунды важнее процесса
Компенсация
Никаких стипендий, никакого Council, никаких постоянных ролей для финансирования. Единственный поток компенсации — бонус за оправданные остановки:| Событие | Источник | Сумма (задаётся governance) |
|---|---|---|
| Оправданная остановка | Казначейство Areal | Масштабируется к предотвращённому ущербу, потолок 5% |
| Неоправданная остановка | (потеря в Treasury) | Стоимость залога переводится от вызывающего |
| Остановка Pause Authority | n/a | Team Multisig действует в операционной роли |
| Остановка governance | n/a | Индивидуальная компенсация отсутствует |
Что останавливает kill switch
Когдаkill_switch_active = true, каждая инструкция агента отклоняется с KillSwitchActive:
vault_swap— никаких приобретений OTgrow_liquidity/compress_liquidity— никакой ребалансировкиnexus_swap/nexus_add_liquidity/nexus_remove_liquidity— никаких изменений LPclaim_yieldпри вызове Yield Harvester — приостановлен (пользователи всё ещё могут забирать свою собственную доходность напрямую)
Что остаётся operational
- Пользовательские чтения (запросы NAV, проверки балансов)
- Пользовательские swap’ы на DEX (торговля никогда не останавливается — ликвидность это капитал пользователей, не капитал протокола)
- Пользовательские
mint_rwtиclaim_lp_fees - Claim’ы доходности пользователей (собственные merkle-доказательства пользователя)
- Предложения governance (kill switch не останавливает governance)
remove_liquidityдля LP-холдеров в пулах StandardCurve (выход всегда разрешён)
Деактивация
Выключение kill switch — это обновление critical-уровня с 7-дневным timelock. Даже если активация была случайной, повторная активация требует полного окна выхода для сообщества. Безопасность склоняется к осторожности.Практическое следствие: если kill switch запущен по ошибке в 10:00 утра, агенты остаются неактивны до 10:00 утра через неделю. Протокол деградирует плавно — пользователи по-прежнему могут взаимодействовать, доходность по-прежнему накапливается на уровне OT, но автономная оптимизация не работает. Это намеренный режим отказа: операционная медленность приемлема, тихая компрометация — нет.
Circuit Breakers
Помимо kill switch, Contract Layer обеспечивает несколько circuit breakers на действие, срабатывающих автоматически без вмешательства governance.По объёму
По slippage
По концентрации
По резерву
По cooldown
Цели формальной верификации
Несколько инвариантов — цели механического доказательства (через 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 минут)
Классифицировать серьёзность
- Sev-1: потеря средств, живой эксплойт, попытка обхода kill switch → Pause Authority действует немедленно
- Sev-2: паттерн срабатываний circuit breaker, плохое поведение агента внутри границ → обзор governance
- Sev-3: проблема UX, некритическая аномалия → нормальный поток предложений
Sev-1: Аварийная остановка
Pause Authority (Team Multisig) подписывает транзакцию
activate_kill_switch. Все агенты замораживаются в следующем блоке. Пользовательские операции продолжаются.Публичное раскрытие
Status page и social-каналы обновлены в пределах 30 минут остановки. Охват, наблюдаемое влияние и следующие шаги опубликованы.
Сдерживание (T + 30 минут до T + дни)
- Скомпрометированный keypair: ротация через governance-предложение (24ч operational timelock); откат любого восстанавливаемого состояния через компенсирующие транзакции
- Использованная инструкция: подготовить обновление программы; деплой через Upgrade Authority
- Плохой конфиг: подать встречное предложение с активацией kill switch на мгновенном уровне, critical-уровень для исправления конфига
- Проблема внешней зависимости (oracle, эмитент стейблкоина): остановить агентов, переключить на резерв, коммуницировать
Post-mortem
Каждый инцидент Sev-1 и Sev-2 производит публичный post-mortem в течение 14 дней:- Хронология со ссылками на блоки
- Анализ первопричины
- Охват влияния (средства, пользователи, длительность)
- Применённое восстановление
- Инварианты, добавленные или усиленные как результат
- Оправдан ли новый захардкоженный инвариант для следующего обновления программы
/changelog/ как YYYY-MM-DD-incident-<short-name>.mdx.
Компенсация
Протокол не гарантирует компенсацию пользователям за потери, возникшие из эксплойтов. Однако Казначейство Areal держит резервы, явно отложенные (через governance) для восстановления после инцидентов. Governance может предложить компенсацию затронутым держателям, если позиция Treasury и охват инцидента это оправдывают. Это дискреционное решение от случая к случаю, не обещание страхования.Глубокая оборона — резюме
Каждый вертикальный класс контроля останавливает разный вектор атаки:| Контроль | Адресует угрозу | Слой |
|---|---|---|
| Границы StrategyConfig | Скомпрометированный агент, несогласованный агент | Strategy |
| Проверка подписанта на инструкцию | Украденный keypair агента, вызывающий неправильную функцию | Contract |
| Захардкоженные инварианты | Вредоносное governance-предложение | Contract |
| Timelock | Спешный / вынужденный governance | Contract |
| Kill switch (мгновенно вкл) | Активный эксплойт, zero-day | Contract + Pause Authority |
| Kill switch (7д выкл) | Социально-инженерное «всё чисто» | Contract |
| Circuit breakers | Убежавший агент внутри границ | Contract |
| Аудит-события | Необнаруженная аномалия | Наблюдаемость |
| Ротация агента | Компрометация keypair | Strategy + Contract |
| Разделение Pause Authority | Компрометация multisig | Управление ключами |
| Разделение Upgrade Authority | Уязвимость кода | Управление ключами |
| Формальная верификация | Баг логики | Слой доказательств |
| Bug bounty | Внешнее обнаружение | Сообщество |
| Надзор governance | Системный дрейф | Сообщество + Strategy |
Что этот раздел НЕ утверждает
Нет утверждения о нулевом риске
Глубокая оборона снижает поверхность атаки и радиус поражения. Не устраняет риск 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, цикл усиления инвариантов
Глубокая оборона
Каждое критическое свойство обеспечивается несколькими независимыми механизмами — никакого единого несущего контроля