Перейти к содержимому
Anon Wallet

Приватный ретранслятор пеймастера

Ретранслятор Anon использует Oblivious HTTP (OHTTP), разделяя сетевую личность кошелька и запрос пеймастеру. Он принимает соединение браузера, но не расшифровывает запрос. Пеймастер расшифровывает и обрабатывает запрос от ретранслятора, а не напрямую от браузера.

Цель конкретна: ни один оператор в одиночку не должен связывать IP пользователя с запросом транзакции пеймастеру. OHTTP не скрывает информацию итоговой транзакции в блокчейне.

Wallet                 Independent relay                 Paymaster
  |                           |                              |
  | HPKE-encrypted request    |                              |
  |-------------------------->| opaque request               |
  |                           |----------------------------->|
  |                           |                    decrypt, validate,
  |                           |                    sponsor, and submit
  |                           |<-----------------------------|
  | encrypted response        |                              |
  |<--------------------------|                              |

sees: request + own IP        sees: client IP + ciphertext  sees: request + relay IP

Содержимое приватного запроса

Кошелёк локально готовит подписанные данные, доказательство с нулевым разглашением, котировку комиссии и выбранный токен. Операция кодируется во внутренний запрос и шифруется текущим публичным ключом HPKE пеймастера.

Ретранслятор получает лишь зашифрованную оболочку OHTTP, не читает транзакцию, доказательство, токен, адреса или ответ. Пеймастер открывает её своим приватным HPKE-ключом. В приватных операциях Railgun доказательство продолжает защищать экранированные детали согласно протоколу, а ретранслятор добавляет разделение соединения браузера и отправки пеймастеру.

Путь запроса

  1. Кошелёк начинает с URL ретранслятора и независимо закреплённого ключа подписи Ed25519. Рабочие значения также опубликованы в документе обнаружения.
  2. Через ретранслятор получает GET /ohttp-configs и проверяет HPKE KeyConfig закреплённым ключом, не позволяя подменить его ключом ретранслятора.
  3. Публичные чтения без идентификаторов, например газ и токены, также идут через ретранслятор. Они разрешены списком и могут кешироваться по Cache-Control пеймастера.
  4. Приватный запрос исполнения или статуса шифруется HPKE и передаётся на POST /gateway как message/ohttp-req.
  5. Ретранслятор пересылает оболочку фиксированному пеймастеру. Цель не берётся из ввода пользователя; это не открытый прокси.
  6. Пеймастер расшифровывает запрос, проверяет доказательство, подписанную котировку, комиссию и транзакцию и отправляет принятые задания в блокчейн.
  7. Ответ шифруется кошельку; ретранслятор возвращает message/ohttp-res, не читая его.

Что видит каждая сторона

Сторона Видит По замыслу не видит
Кошелёк Свой запрос, ключи, ответ и соединение Активность других пользователей
Ретранслятор IP клиента, размер и время шифротекста, разрешённые публичные пути и запросы Открытый текст OHTTP; приватные ключи пеймастера
Пеймастер Расшифрованный запрос, результат, время, IP ретранслятора IP клиента, если ретранслятор и входной узел удаляют его пересылку
Наблюдатель блокчейна Данные и время итоговой транзакции Открытый текст OHTTP при передаче

Гарантии безопасности

  • Конфиденциальность у ретранслятора. HPKE шифрует каждый приватный запрос и ответ; у ретранслятора нет ключа расшифровки или подписи.
  • Разделение сетевой личности. Пеймастер получает соединение ретранслятора, если заголовки с IP клиента не передаются.
  • Защита от подмены ключа. Ротации HPKE проверяются Ed25519-ключом, закреплённым вне канала ретранслятора. Обнаружение не заменяет якорь доверия.
  • Целостность шифротекста. Изменённый текст не проходит аутентификацию. Ретранслятор может удалять, задерживать или повторять трафик; приложение должно безопасно обрабатывать повторы.
  • Ограниченная пересылка. Фиксированная цель, явные публичные пути, лимит 1 МиБ в Go и строгие типы OHTTP не позволяют работать универсальным прокси.
  • Без данных входа браузера. Публичные ответы используют wildcard CORS без cookie, заголовков авторизации и учётных данных браузера.

Ограничения и предпосылки

Это инструмент разделённого доверия, а не полноценная сеть анонимности.

  • Операторы должны быть разными и не вступать в сговор: объединение наблюдений связывает IP с запросами.
  • Глобальный наблюдатель может сопоставить размер и время на двух сторонах. Защиты от анализа уровня mixnet нет.
  • Ретранслятор может записывать IP и метаданные. Выбирайте независимость и политику хранения под свою модель угроз.
  • Прямые вызовы раскрывают сетевой адрес. Конфигурация, котировки, исполнение и статус должны идти через ретранслятор.
  • Публичные метаданные блокчейна, время, повторное использование адресов и раскрытые значения не скрываются.
  • Доступность не гарантирована: возможны блокировка, задержка, ограничения и выборочный отказ.

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

Anon предоставляет совместимый с браузером https://relay.anon.inc. URL и ключ подписи публикуются в https://anon.inc/.well-known/anon-paymaster.json.

Другой публичный ретранслятор подходит, если он:

  • направлен на нужный пеймастер;
  • реализует /ohttp-configs, /gateway, маршруты газа и поддерживаемых токенов;
  • разрешает источник клиента или совместимый CORS;
  • управляется независимо от пеймастера;
  • имеет приемлемые доступность, журналирование и сроки хранения.

Клиент не может направить публичный ретранслятор на произвольную цель. Фиксированная цель предотвращает открытое проксирование; оператор разворачивает совместимый экземпляр для каждого пеймастера.

Собственный ретранслятор

Полные реализации Go, Docker и Cloudflare Worker открыты в github.com/anondotinc/paymaster-relay, включая тесты, конфигурацию, проверки здоровья и браузерного preflight.

Go и Docker

Go обеспечивает наиболее сильное отделение IP: создаёт новые исходящие запросы без клиентских заголовков. Работает в контейнерах, ВМ или Kubernetes:

git clone https://github.com/anondotinc/paymaster-relay.git
cd paymaster-relay
docker build -t anon-ohttp-relay .
docker run --rm -p 8080:8080 \
  -e OHTTP_GATEWAY_URL="https://paymaster.example.com" \
  anon-ohttp-relay

Завершайте TLS перед контейнером, открывайте только маршруты ретранслятора, ограничивайте размер и частоту запросов, не записывайте тела запросов.

Cloudflare Worker

Можно развернуть в своём аккаунте Cloudflare с зоной и доменом. Сделайте fork и измените worker/wrangler.toml:

  • выберите уникальное name Worker;
  • замените доменный routes[].pattern;
  • задайте TARGET как HTTPS-шлюз OHTTP нужного пеймастера.

Из корня репозитория выполните развёртывание и проверку:

make cloudflare-login
make deploy RELAY_URL=https://relay.example.com

Cloudflare управляет DNS домена и сертификатом при развёртывании.

Оговорка об IP в Cloudflare: для подзапросов Worker к origin вне Cloudflare заголовок CF-Connecting-IP содержит адрес клиента и не может быть изменён Worker. Входной узел пеймастера должен удалить такие заголовки до записи логов и обработки. Если это нельзя гарантировать, используйте Go. См. справочник заголовков Cloudflare.

Проверки оператора

  • Работайте независимо от организации пеймастера.
  • Указывайте только нужный HTTPS-шлюз.
  • Не передавайте cookie, авторизацию, user agent или IP клиента.
  • Отключите журналирование тел и минимизируйте хранение метаданных.
  • Сохраняйте точные типы запросов и ответов OHTTP.
  • Ограничивайте список публичных чтений и соблюдайте сроки кеша upstream.
  • Ограничивайте частоту без стабильных идентификаторов пользователей.
  • Следите за /health и проверяйте браузерный preflight /gateway после развёртывания.
  • Публикуйте URL, оператора, политику логов и целевой пеймастер.

Ссылки