Модель доверия — проверяемые внешние фактаы VS права доступа и административные привилегии
## Инвариант R6 — Модель доверия Доверие в Pheix строится на проверяемых внешних фактах, а не на правах доступа или административных привилегиях. **Fail-fast** поведение: нарушение проверки внешнего факта → ошибка. > Как осуществляется проверка, что за внешний факт? Можешь представить тривиальный пример? --- ## Что означает «доверие на внешних фактах» Если формулировать грубо: система верит не тому, _кто ты_, а тому, _что можно проверить независимо_. Это противопоставление: | Модель | Основание доверия | | ------------ | ------------------ | | Традиционная | Роль / админ / ACL | | R6 | Проверяемый факт | --- ## Что может быть «внешним фактом» Внешний факт — это не мнение системы о пользователе. Это сущность, которую можно проверить независимо от её внутреннего состояния. Примеры: * криптографическая подпись; * хэш документа; * timestamp с подписью; * запись в блокчейне; * commit с GPG-подписью; * webhook с проверяемым HMAC. --- ## Тривиальный пример ### Классическая модель Доверие строится на роли: ```perl if $user.role eq "admin" { publish($article) } ``` ### Модель R6 Предположим, что для публикации должны выполниться следующие условия: * статья подписана владельцем домена; * подпись валидна; * ключ привязан к статье; #### Процесс: 1. Пользователь отправляет статью + цифровую подпись. 2. Pheix проверяет: - подпись валидна? - подпись соответствует публичному ключу? - ключ зарегистрирован как допустимый для этого контента? Если да → **публикация возможна**. Если нет → **fail-fast**. --- ## Пример на минимальном уровне Допустим: ```bash POST /publish ``` В запросе: ```javascript { "content_id": "A1", "signature": "0x98af..." } ``` Система: ```perl if !verify_signature($content_hash, $signature, $public_key) { die "Invalid signature"; } ``` Вот это и есть: **нарушение проверки внешнего факта → ошибка**. --- ## Более простой пример (без криптографии) Допустим, публикация разрешена если: * commit подписан; * CI pipeline прошёл; * линтер не выдал ошибок. Здесь «внешний факт» — результат CI. Pheix не верит роли. Он верит проверяемому событию: ```perl if !ci_status($commit_id) eq "passed" { die "failure"; } ``` --- ## Где это особенно уместно для Pheix Pheix — dCMS с blockchain-направлением. R6 логично применять к: * публикации; * перемещению контента в архив; * изменению контента; * смене состояния жизненного цикла. Например: Переход `Draft → Published` выполняется только если: * есть проверяемая подпись автора; * есть зафиксированная версия; * есть хэш, записанный в immutable storage. --- ## Где нужно быть осторожным Инвариант R6 звучит радикально: > «а не на правах доступа или административных привилегиях» Это красиво, но полностью отказаться от ролей трудно. Чаще всего получается гибрид: * роли определяют, кто может инициировать действие; * внешний факт определяет можно ли завершить действие; Это более реалистичная формулировка. Возможно, стоит переформулировать мягче. Сейчас: > Доверие строится на проверяемых внешних фактах, а не на правах доступа. Более инженерно: > Критические переходы состояния в Pheix подтверждаются проверяемыми внешними фактами, а не только внутренними ролями доступа.
task