ERC-5564 (Stealth Addresses) — это стандарт для неинтерактивных приватных переводов на Ethereum. Получатель публикует stealth meta-address (набор публичных ключей), а отправитель по нему локально рассчитывает уникальный одноразовый stealth-адрес и отправляет активы туда. Параллельно отправитель делает анонс события в едином контракте-ретрансляторе, чтобы получатель мог найти «свой» перевод. Сканирование выполняется оффчейн по view-тегам и эфемерному публичному ключу из события.
Зачем это нужно: классические переводы раскрывают привязку к «основному» адресу получателя (ENS, история транзакций). Stealth-адреса развязывают публичную идентичность и приём средств: сторонний наблюдатель видит лишь одноразовый адрес, а только получатель (и отправитель) могут доказуемо сопоставить его с реципиентом.
Ключевые понятия ERC-5564
Stealth meta-address.
Пара (иногда единичка) публичных ключей, из которой любой отправитель может вычислить одноразовый stealth-адрес для конкретного получателя. Формат для Ethereum:
st:eth:0x
Spending / viewing ключи. *Spending key* — приватный ключ, которым тратятся средства, пришедшие на stealth-адрес. *Viewing key* — приватный ключ «наблюдателя»: по нему получатель находит свои stealth-поступления, не раскрывая трат.
Эфемерный ключ отправителя. Отправитель генерирует одноразовый приватный ключ, публикует соответствующий эфемерный публичный ключ в событии-анонсе и использует его в ECDH-обмене для вывода общего секрета.
View-tag (байтовая метка просмотра). Однобайтовый «фильтр» из хэша общего секрета. Позволяет в ~255 из 256 случаев мгновенно отсеять «чужие» события без дорогих операций. Это ускоряет сканирование в кошельках почти в 6 раз при мизерной потере криптографического запаса.
ERC5564Announcer (singleton). Контракт-ретранслятор, в котором интеграторы публикуют событие Announcement(schemeId, stealthAddress, caller, ephemeralPubKey, metadata). Получатель слушает эти события и ищет «своё».
schemeId. Идентификатор криптосхемы. Базовая реализация стандарта описывает schemeId = 1 для secp256k1 + view-tags (расширяемо для альтернатив).
Как «рождается» stealth-адрес (высокоуровневый поток)
1) Получатель публикует meta-address. Кошелёк генерирует пару ключей (*spending/viewing*), выводит соответствующие публичные ключи и формирует строку st:eth:…. Её можно показать QR-кодом, поместить в профиль/сайт, а также зарегистрировать в реестре (см. ERC-6538).
2) Отправитель считывает meta-address и локально вычисляет stealth-адрес.
- Генерируется эфемерный приватный ключ и публичный ключ P_ephemeral.
- Вычисляется общий секрет с viewing-публичным ключом получателя (ECDH), хэшируется, из старшего байта берётся view-tag.
- К общему секрету «прибавляется» spending-публичный ключ получателя → получается stealth-публичный ключ и одноразовый stealth-адрес.
3) Отправитель переводит активы на stealth-адрес и публикует анонс. В контракте ERC5564Announcer вызывается announce(...) с schemeId, stealthAddress, ephemeralPubKey и metadata, где первый байт — view-tag, а далее — нормализованные поля о типе актива и сумме (для ETH и для токенов структура метаданных различается).
4) Получатель находит перевод и извлекает ключ для траты. Кошелёк получает поток Announcement-событий, по view-tag быстро отбрасывает «чужие», а для подходящих событий:
- рекомпьютит общий секрет по viewingKey × ephemeralPubKey;
- восстанавливает stealth-публичный/адрес и сверяет его с stealthAddress из события;
- при совпадении вычисляет stealth-приватный ключ: p_stealth = p_spend + H(shared_secret) и получает полный контроль над средствами на stealth-адресе.
Итог: наблюдатели видят обычную транзакцию на новый адрес, но не могут сопоставить его с реципиентом. Отправитель знает, кому заплатил; получатель — единственный, кто может потратить.
Формат событий и метаданных
Событие Announcement содержит:
- schemeId — идентификатор криптосхемы;
- stealthAddress — рассчитанный адрес получателя;
- caller — интегратор/контракт, вызвавший анонс (для аудита);
- ephemeralPubKey — эфемерный публичный ключ отправителя;
- metadata — произвольные данные, первый байт обязательно = view-tag.
Рекомендуемая структура metadata:
- Для ETH: байт 1 — view-tag; байты 2-5 — константа-идентификатор ETH; 6-25 — адрес 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; 26-57 — сумма.
- Для ERC-20/721: байт 1 — view-tag; 2-5 — function selector действия (например, transfer); 6-25 — адрес токена; 26-57 — сумма (FT) или tokenId (NFT).
Стандартизованный формат облегчает индексаторам и кошелькам понимание «что именно пришло на stealth-адрес», без лишних эвристик.
Стелс-мета-адреса и реестр ERC-6538
Проблема «где хранить meta-address». Если держать его только на визитке/сайте, интеграторам неудобно. ERC-6538 описывает реестр (Registry) для публикации и получения stealth meta-address по обычному адресу/идентификатору получателя. Регистрация может происходить как самим владельцем, так и «по доверенности» (подписанный EIP-712/EIP-1271 запрос).
Что это даёт:
- кошельки и dApp’ы могут автоматически находить meta-address контрагента;
- получатель явно сигнализирует «готовность» принимать stealth-платежи;
- один стандартный источник правды сокращает UX-трение и ошибки.
Приватность и её пределы
Что скрывается:
- Связь «основной идентичности» получателя с конкретным платежом;
- Граф входных переводов на «основной» адрес (если аккуратно расходовать stealth-UTXO/балансы);
- Дополнительные метаданные получателя (если использовать blinded рутину комм-каналов в dApp’ах).
Что не скрывается:
- Сумма и актив — они видны на L1/L2;
- Связь «stealth-адрес ↔ получатель» известна отправителю;
- Во многих сценариях заметны тайминги (паттерны публикации событий, эхом видны ретраи).
Практические выводы:
- Для «самофинансирования газа» на stealth-адрес лучше использовать внешние источники (спонсор, релейер) — перевод с «основного» адреса может деанонимизировать связь;
- Делайте новый stealth-адрес на каждый платёж (так и задумано стандартом);
- В UI полезно явно предупреждать о «утечках по суммам/таймингу».
Сочетайте с базовыми практиками приватности и, при необходимости, с доказуемыми схемами (например, ZK-доказательства) на уровне приложений.
Взаимодействие с L2 и Account Abstraction
Роллапсы и комиссии. На роллапсах (L2) дешевле публиковать анонсы и обслуживать входящие переводы. Логика ERC-5564 полностью совместима: событие Announcement эмитится на целевой сети, кошельки слушают нужный эндпоинт.
Account Abstraction (AA). В связке с AA получатель может автоматизировать:
- сканирование событий и «подъем» средств на «основной» аккаунт;
- спонсирование газа (paymaster), чтобы тратить из stealth-адреса без самофинансирования;
- батч-операции (claim → swap → отправка), сохраняя приватность «кто получатель».
Сценарии использования
1) Пожертвования и донаты. Публикуете один meta-address в профиле — любой желающий отправляет активы, не раскрывая ваш основной адрес. Для разных сетей (st:eth:…, st:…) можно держать отдельные строки.
2) Корпоративные выплаты/зарплаты. Поставщики/сотрудники сообщают meta-address; бухгалтерия платит на stealth-адреса → аудитор видит выплаты, но не может связать их с публичными адресами сотрудников. Контрагент при необходимости доказывает принадлежность перевода по viewing-ключу.
3) NFT-подарки и POAP. Отправляете NFT на stealth-адрес — получатель остаётся приватным до момента раскрытия/перевыпуска.
4) Airdrop без «охоты на адреса». Проекты могут предлагать «заявки» через meta-address; начисление идёт на stealth-адреса, уменьшая токсичность повторного анализа.
Производительность сканирования: роль view-tag
Сканирование «в лоб» требует на каждое событие несколько EC-операций и хэшей. View-tag (1 байт из хэша общего секрета) позволяет с вероятностью 255/256 сразу отбросить «не мои» события: кошелёк делает одну ecMUL + HASH, проверяет байт-совпадение — и только затем (при совпадении) продолжает тяжёлые шаги (ecADD, повторный HASH). В итоге в 6 раз меньше работы на поток событий при минимальном ослаблении (124-битный запас вместо 128-битного на приватную часть секрета).
Разработчикам: как интегрировать ERC-5564
Архитектура кошелька:
- храните spending/viewing пары (seed-деривация рекомендована);
- поддержите формат st:eth:… и импорт из реестра ERC-6538;
- реализуйте быстрый фильтр по view-tag и парсер Announcement;
- обеспечьте вычисление stealth-ключа и безопасный «claim» (подписание/расходование).
Отправка платежа:
- вычислите stealthAddress по meta-address;
- оформите перевод (ETH/ERC-20/721) на stealth-адрес;
- вызовите announce(schemeId, stealthAddress, ephemeralPubKey, metadata) в ERC5564Announcer;
- логируйте caller (ваш контракт/бэк-энд) для аудита.
Поддержка токенов:
- для FT указывайте в метаданных function selector (transfer/transferFrom) + адрес токена + количество;
- для NFT — selector + адрес токена + tokenId;
- для ETH придерживайтесь рекомендованного шаблона метаданных.
Безопасность ключей:
- *Viewing key* можно хранить в «тёплой» зоне (он не даёт тратить);
- *Spending key* — под полной защитой (HSM/secure enclave);
- для UX: поддержите «watch-only» режим (только сканирование).
Схемы и совместимость:
- соблюдайте schemeId;
- при необходимости реализуйте альтернативные криптосхемы (стандарт расширяем);
- проверяйте, что первый байт metadata = view-tag.
Риски и меры предосторожности
Газ и самофинансирование. Чтобы потратить с stealth-адреса, на нём должны быть ETH для газа. Перевод с «основного» адреса может раскрыть связь; используйте paymaster/релэй или «чужие» источники газа.
Адресное «отравление». Злоумышленник может отправлять на ваши известные адреса «пыль», чтобы мешать анализу. На стороне stealth-адресов это менее критично, но кошельки всё равно должны уметь скрывать/чернить подозрительные поступления.
Корреляция по времени/суммам. Большие «круглые» суммы и синхронные анонсы облегчают эвристику. Практика — распределять крупные начисления, использовать разные окна публикации событий.
Отправитель знает связь. Скрывается только получатель от публики. Если критично скрывать и отправителя, потребуется отдельный уровень приватности в приложении (миксинг маршрутов, приватные месседжи и т.п.).
Контракты vs EOAs. Stealth-адрес — обычный EOA. Для интеракций со смарт-контрактами используйте AA/абстракцию аккаунтов, мультиколлы и спонсирование газа.
Сравнение подходов к приватности перевода получателю
| Подход | Взаимодействие при публикации реквизитов | Что видно публике | Кто знает связь с получателем | Плюсы/минусы |
|---|---|---|---|---|
| ERC-5564 Stealth | Не требуется (meta-address статичен) | Адрес-одноразка, сумма, актив, событие анонса | Отправитель и получатель | Простая интеграция, быстрое сканирование; суммы не скрываются |
| Классический адрес | Нужен обмен адресом | Публичен адрес получателя | Все | Прозрачно, но нулевая приватность |
| Миксеры / shielded-пулы | Разный (в т.ч. депозиты в пул) | Зависит от протокола | Никто/лишь участники | Глубокая приватность, но комплаенс-риски |
| Off-chain платежи | Нужны провайдеры | Почти ничего (off-chain) | Провайдер | Централизация, доверие посреднику |
Лучшие практики для внедрения
- Публикуйте meta-address в проверяемых источниках (ENS-текст-рекорды, сайт, соцсети) и/или в ERC-6538 Registry.
- Для UX храните QR с st:eth:… и кнопку «Скопировать» в один тап.
- В кошельке включайте watch-only режим (по viewing-ключу) и уведомления о новых анонсах.
- Реализуйте paymaster/relayer для трат со stealth-адреса без самофинансирования газа.
- Ведите журнал анонсов (caller, schemeId, metadata) для аудита.
- Делайте фолбэки: если анонс не эмитирован (сбой), повторяйте с RBF/ретраями.
- Обучайте пользователя: суммы видны, приватность — про «кто получатель», а не про «сколько».
FAQ
Нужно ли согласование с получателем? Нет. Достаточно его meta-address — отправитель сам производит вычисления и публикует анонс.
Можно ли переиспользовать один stealth-адрес? Не рекомендуется. Смысл — одноразовость. Для каждого платежа вычисляется новый stealth-адрес.
Что если анонс не опубликован? Получатель не увидит перевод. Интеграторам важно публиковать Announcement перед или сразу после отправки средств и ретраить при сбоях.
Скрываются ли суммы? Нет. Сумма и актив публичны. Скрывается связь с основным адресом получателя.
Как связать stealth-платёж с человеком/компанией? Через проверяемую публикацию meta-address (сайт, ENS) или регистрацию в ERC-6538. Для бухгалтерии можно хранить сопоставление «инвойс → анонс».
Совместимо ли с L2? Да. События-анонсы излучаются в той сети, где идёт перевод (L1/L2), кошельки слушают нужный RPC.
