Приватный ретранслятор пеймастера
Ретранслятор 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 доказательство продолжает защищать экранированные детали согласно протоколу, а ретранслятор добавляет разделение соединения браузера и отправки пеймастеру.
Путь запроса
- Кошелёк начинает с URL ретранслятора и независимо закреплённого ключа подписи Ed25519. Рабочие значения также опубликованы в документе обнаружения.
- Через ретранслятор получает
GET /ohttp-configsи проверяет HPKE KeyConfig закреплённым ключом, не позволяя подменить его ключом ретранслятора. - Публичные чтения без идентификаторов, например газ и токены, также идут через ретранслятор. Они разрешены списком и могут кешироваться по
Cache-Controlпеймастера. - Приватный запрос исполнения или статуса шифруется HPKE и передаётся на
POST /gatewayкакmessage/ohttp-req. - Ретранслятор пересылает оболочку фиксированному пеймастеру. Цель не берётся из ввода пользователя; это не открытый прокси.
- Пеймастер расшифровывает запрос, проверяет доказательство, подписанную котировку, комиссию и транзакцию и отправляет принятые задания в блокчейн.
- Ответ шифруется кошельку; ретранслятор возвращает
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:
- выберите уникальное
nameWorker; - замените доменный
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, оператора, политику логов и целевой пеймастер.