Приватность
Запрос, отправленный в Нейронет, проходит через несколько рук: шлюз, который его маршрутизирует, пиры сети, через которые он едет, процесс майнера, который запускает модель, и оператора машины, где этот процесс живёт. Уровень приватности задачи описывает, сколько содержимого запроса каждому из них положено видеть. Здесь разобраны модель приватности протокола, допущения за ней и те места, где код ещё не догнал замысел.
Приватность задаётся для каждой задачи и выбирается владельцем вместе с моделью и уровнем проверки. Где она стоит среди прочих настроек, показано в Конфигурации задачи.
Что спрятать нельзя
Инференсу нужен вход в открытом виде прямо в памяти GPU. Прямой проход работает с настоящими значениями токенов, а не с шифротекстом. Любой, у кого есть полный контроль над машиной и достаточно мотивации, эту память прочитает, и никакое программное шифрование этого не меняет. Это жёсткое ограничение, вокруг которого построена вся модель.
Криптографические альтернативы, которые сняли бы ограничение, для продакшен-инференса непрактичны. Полностью гомоморфное шифрование увеличивает стоимость матричного умножения на несколько порядков, а защищённые многосторонние вычисления и стоимость увеличивают, и требуют нескольких майнеров на запрос. Ни то, ни другое не тянет пропускную способность обслуживающей сети.
Остаётся лестница: каждый уровень сужает круг тех, кто видит запрос, а верхняя ступень требует поддержки со стороны железа.
Уровни
P0: шифрование транспорта
Трафик шифруется на каждом хопе: TLS между потребителем и шлюзом, libp2p Noise между шлюзом и майнером. Открытый текст по сети не идёт никогда, даже на базовом уровне. Чего P0 не делает, так это не прячет ничего от тех, через кого запрос проходит: шлюз, процесс майнера и оператор майнящей машины видят и промпт, и ответ.
P0 - базовый вариант для открытых моделей и публичных данных. Стоимость нулевая, оба слоя шифрования и так есть в транспорте.
P1: запечатано под майнера
Промпт запечатывается под того конкретного майнера, который будет его считать: согласование ключей X25519 плюс AES-256-GCM против 32-байтного публичного ключа, который этот майнер опубликовал в цепи. Открыть его может только он. Майнера без зарегистрированного ключа шифрования пропускают, а не шлют ему открытый текст, и по сети едет уже запечатанная нагрузка, поэтому промежуточные пиры на маршруте запроса не видят.
Одна оговорка здесь важна, и замысел с нынешней реализацией на ней расходятся. По замыслу промпт запечатывает сам потребитель, и это вывело бы владельца из числа сторон, держащих содержимое запроса, полностью. В нынешнем шлюзе запечатывает шлюз: он получает промпт в открытом виде и запечатывает его под каждого майнера прямо перед отправкой. То есть сегодня P1 защищает запрос от всех на маршруте, но не от самого шлюза. Если в вашей модели угроз есть сторона, которая держит шлюз, этот разрыв реален, и P1 его пока не закрывает.
Майнера P1 тоже не ослепляет. Процесс майнера расшифровывает промпт, чтобы запустить модель, и оператор той машины может заглянуть в процесс. Стоимость пренебрежимая: согласование ключей и симметричное шифрование занимают заметно меньше миллисекунды против инференса, измеряемого сотнями миллисекунд.
P2: изоляция процесса
P2 добавляет поверх P1 укрепление на уровне хоста вокруг процесса инференса: контейнер с корневой файловой системой только для чтения, профиль seccomp, блокирующий системные вызовы для подключения отладчика или чтения памяти чужого процесса, шифрованный swap, чтобы страницы памяти не попадали на диск в открытом виде, и временные файлы в памяти, а не на постоянном хранилище.
Это поднимает цену чтения промпта с майнящей машины. Недоступным промпт не становится. Оператор с правами root может загрузить модуль ядра или прочитать память GPU через устройства, и на этом слое такому ничто не мешает. P2 - эшелонированная защита от беглого любопытства, а не гарантия против решительного оператора. Накладные расходы порядка процента.
P3: конфиденциальные вычисления
P3 - единственный уровень, который должен держаться против оператора машины. Он опирается на железо: GPU в режиме конфиденциальных вычислений (поколение H100 и новее) вместе с доверенной средой исполнения на CPU, так что промпт расшифровывается внутри анклава и в открытом виде за его пределами не появляется. Майнер аттестует состояние своего железа, и отчёт аттестации сверяется с требованиями задачи, прежде чем майнера начнут считать конфиденциальным.
Аттестация покрывает и то, что загружено, закрывая щель, которую на нижних уровнях проверка латает статистически: подменённая модель видна прямо в отчёте, а не только через перепроверки. Заявленная стоимость конфиденциального режима на нынешнем железе составляет 4-8 процентов пропускной способности.
Сводка
| Уровень | Механизм | Маршрут по сети | Шлюз | Процесс майнера | Оператор майнера | Накладные расходы |
|---|---|---|---|---|---|---|
| P0 | TLS плюс libp2p Noise | слеп | видит промпт | видит промпт | видит промпт | нет |
| P1 | печать X25519 + AES-256-GCM | слеп | сегодня видит, по замыслу не должен | видит промпт | может заглянуть | меньше 0,01% |
| P2 | P1 плюс контейнер, seccomp, шифрованный swap | слеп | как в P1 | видит промпт | трудно, но возможно | около 1% |
| P3 | конфиденциальные вычисления с аттестацией | слеп | как в P1 | внутри анклава | слеп | 4-8% |
| P4 | луковая маршрутизация | слеп, плюс кто с кем говорит | как в P1 | как в P3 | как в P3 | не замерялось |
P4 целится в метаданные, а не в содержимое: он прячет, какой потребитель обращается к какому майнеру, что нижние уровни оставляют видимым. Это проектная заготовка, а не поставленный код.
Как выбрать уровень
Уровень определяется вопросом «кого нужно ослепить», а не тем, насколько чувствительными данные кажутся.
- Если беспокоит сетевой путь, хватает P0.
- Если беспокоят другие пиры на маршруте, это закрывает P1. Если беспокоит сторона, которая держит шлюз, P1 нацелен именно на это, но пока не дотягивает, потому что запечатывает шлюз.
- Если беспокоит кто-то, без особых усилий копающийся на майнящем хосте, планку поднимает P2.
- Если беспокоит оператор машины, действующий против вас намеренно, честный ответ только один - P3, и он ограничивает задачу аттестованным железом.
- Если беспокоит не содержимое, а анализ трафика, это P4, и его пока нет.
Чем выше уровень, тем уже круг майнеров, способных обслуживать задачу, а это влияет на мощность и цену. Именно этот размен, а не проценты в таблице, и есть настоящая стоимость верхних уровней.
Приватность и проверка
Проверка пересчитывает работу на втором майнере, а значит, проверяющему нужен тот же вход, что был у исполнителя. Печать промпта под одного майнера конфликтует с передачей его другому позже. В нынешней реализации проблемы нет: промпт держит шлюз и запечатывает его заново под того майнера, которого попросили пересчитать.
Проблема появляется в той схеме, где запечатывает потребитель, а у шлюза только шифротекст. Выходов тут два. Конверт для пересчёта: потребитель при отправке запечатывает промпт отдельно под каждого майнера в пуле задачи, шлюз хранит все конверты, не имея возможности открыть ни один, и отдаёт нужный, если запрос попал в выборку. Для пула от 5 до 20 майнеров это добавляет к запросу несколько сотен байт, и потребителю не нужно быть онлайн позже. Альтернатива - попросить потребителя запечатать заново под выбранного проверяющего в момент перепроверки: это снимает плату вперёд, но требует, чтобы потребитель был доступен. Как устроена сама перепроверка, описано в статье Проверка инференса.
Хэши артефактов не шифруются никогда. Проверка сравнивает хэши, и они должны читаться в цепи кем угодно.
Что хранит цепь
Цепь держит хэши, отчёты аттестации и ключи шифрования майнеров, по которым адресуется запрос. Промпты, ответы и артефакты остаются вне цепи. Ни один ИИ-запрос не пишется в блокчейн ни на каком уровне приватности, включая P0.