Краткий гайд по скрытым адресам
Сегодня мы будем разбирать том, как в EVM могут повысить уровень конфиденциальности
Ссылка на оригинал от Виталика ТЫК
Начнем!
Одной из самых больших проблем, остающихся в экосистеме Ethereum, является конфиденциальность. По умолчанию всё, что попадает в публичный блокчейн, остается публичным навсегда. Чаще это означает не только деньги и финансовые транзакции, но и имена ENS, POAP, NFT, токены soulbound и многое другое. На практике использование всего набора приложений Ethereum подразумевает обнародование значительной части вашей жизни для всеобщего обозрения и анализа
В этом посте мы опишем механику и примеры использования другой категории инструментов, которые могут улучшить приватность в Ethereum
Что такое система скрытых адресов?
Предположим, что Алиса хочет отправить Бобу актив. Это может быть некоторое количество криптовалюты (например, 1 ETH, 500 RAI), или это может быть NFT. Когда Боб получает актив, он не хочет, чтобы весь мир знал, что именно он его получил. Скрыть факт передачи невозможно, особенно если это NFT, у которого есть только одна копия на блокчейне, но возможность сокрытия того, кто является получателем, может быть гораздо более жизнеспособной. Алиса и Боб также ленивы: они хотят систему, в которой процесс оплаты точно такой же, как и сегодня. Боб посылает Алисе (или регистрирует в ENS) некий "адрес", кодирующий, как кто-то может ему заплатить, и одной этой информации достаточно, чтобы Алиса (или любой другой человек) отправила ему актив
Обратите внимание, что это другой вид конфиденциальности, чем тот, который обеспечивает, например, Tornado Cash. Tornado Cash может скрыть переводы основных взаимозаменяемых активов, таких как ETH или основные ERC20 (хотя он наиболее удобен для приватной отправки самому себе), и он вообще не может добавить конфиденциальности к переводам NFT
Скрытые адреса обеспечивают такую схему. Скрытый адрес - это адрес, который может быть сгенерирован как Алисой, так и Бобом, но контролировать который может только Боб. Боб генерирует и хранит в секрете ключ для расходования средств и использует этот ключ для генерации скрытого мета-адреса. Он передает этот мета-адрес Алисе (или регистрирует его в ENS). Алиса может произвести вычисления на этом мета-адресе, чтобы сгенерировать скрытый адрес, принадлежащий Бобу. Затем она может отправить любые активы на этот адрес и Боб будет иметь полный контроль над ними. Вместе с передачей она публикует в блокчейне некоторые дополнительные криптографические данные (эфемерный публичный ключ), которые помогают Бобу обнаружить, что этот адрес принадлежит ему
Другой способ посмотреть на это так: стелс-адреса обеспечивают те же свойства конфиденциальности, что и генерирование Бобом свежего адреса для каждой транзакции, но не требуют никакого взаимодействия со стороны Боба
Полный рабочий процесс схемы скрытых адресов можно представить следующим образом:
- Боб генерирует свой корневой ключ трат (m) и скрытый мета-адрес (M)
- Боб добавляет запись ENS для регистрации M в качестве скрытого мета-адреса для bob.eth
- Мы предполагаем, что Алиса знает, что Боб - это bob.eth. Алиса ищет его скрытый мета-адрес M в ENS
- Алиса генерирует эфемерный ключ, который известен только ей и который она использует только один раз (для генерации этого конкретного скрытого адреса)
- Алиса использует алгоритм, который объединяет ее эфемерный ключ и мета-адрес Боба для создания скрытого адреса. Теперь она может отправлять активы на этот адрес
- Алиса также генерирует свой эфемерный открытый ключ и публикует его в реестре эфемерных открытых ключей (это может быть сделано в той же транзакции, что и первая транзакция по отправке активов на этот стелс-адрес)
- Чтобы Боб обнаружил принадлежащие ему скрытые адреса, Бобу необходимо просканировать реестр эфемерных открытых ключей на предмет всего списка эфемерных открытых ключей, опубликованных кем-либо по любой причине с момента последнего сканирования
- Для каждого эфемерного открытого ключа Боб пытается объединить его со своим корневым ключом трат для создания скрытого адреса и проверяет, есть ли в этом адресе какие-либо активы. Если есть, Боб вычисляет ключ трат для этого адреса и запоминает его
Все это основано на двух видах криптографической хитрости. Во-первых, нам нужна пара алгоритмов для создания общего секрета: один алгоритм, который использует секретную вещь Алисы (ее эфемерный ключ) и открытый ключ Боба (его мета-адрес), и другой алгоритм, который использует секретную вещь Боба (его корневой ключ траты) и открытый ключ Алисы (ее эфемерный открытый ключ). Это можно сделать многими способами, например обмен ключами Диффи-Хеллмана
Но общего секрета самого по себе недостаточно: если мы просто сгенерируем закрытый ключ из общего секрета, то и Алиса, и Боб смогут тратить с этого адреса. Мы могли бы оставить все как есть, предоставив Бобу возможность самому переводить средства на новый адрес, но это неэффективно и без необходимости снижает безопасность. Поэтому мы также добавляем механизм ослепления ключей (key blinding mechanism): пару алгоритмов, в которых Боб может объединить общий секрет со своим корневым ключом трат, а Алиса может объединить общий секрет с мета-адресом Боба таким образом, что Алиса может сгенерировать скрытый адрес, а Боб может сгенерировать ключ трат для этого скрытого адреса, и все это без создания открытой связи между скрытым адресом и мета-адресом Боба (или между одним скрытым адресом и другим)
Скрытые адреса с использованием криптографии эллиптической кривой
Скрытые адреса с использованием криптографии эллиптических кривых были первоначально представлены в контексте Bitcoin Питером Тоддом в 2014 году. Этот способ работает следующим образом (это предполагает предварительное знание основ криптографии на эллиптических кривых):
- Боб генерирует ключ m и вычисляет M = G * m, где G - общепринятая точка генератора для эллиптической кривой. Скрытый мета-адрес является кодировкой M
- Алиса генерирует эфемерный ключ r и публикует эфемерный открытый ключ R = G * r
- Алиса может вычислить общий секрет S = M * r, а Боб может вычислить такой же общий секрет S = m * R
- В общем, и в Bitcoin, и в Ethereum адрес - это хэш, содержащий открытый ключ, используемый для проверки транзакций с этого адреса. Таким образом, вы можете вычислить адрес, если вычислите открытый ключ. Чтобы вычислить открытый ключ, Алиса или Боб могут вычислить P = M + G * hash(S)
- Чтобы вычислить закрытый ключ для этого адреса, Боб (и только Боб) может вычислить p = m + hash(S)
Это удовлетворяет всем нашим требованиям, изложенным выше, и удивительно просто!
Сегодня даже существует EIP, пытающийся определить стандарт скрытых адресов для Ethereum, который одновременно поддерживает этот подход и дает возможность пользователям разрабатывать другие подходы (например, поддерживающие наличие у Боба отдельных ключей траты и просмотра, или использующие другую криптографию для квантово-устойчивой безопасности). Теперь вы можете подумать: скрытые адреса не так уж сложны, теория уже проработана, и их принятие - это всего лишь деталь реализации. Проблема, однако, в том, что есть несколько довольно крупных деталей реализации
Скрытые адреса и оплата комиссии за транзакции
Предположим, что кто-то посылает вам NFT. Памятуя о вашей конфиденциальности, они отправляют его на скрытый адрес, который вы контролируете. После сканирования эфемерных публичных ключей on-chain, ваш кошелек автоматически обнаруживает этот адрес. Теперь вы можете свободно подтвердить право собственности на NFT или передать его кому-то другому. Но есть проблема! На этом аккаунте 0 ETH, и поэтому нет возможности оплатить комиссию за транзакцию. Вы не можете отправить ETH на него со своего основного кошелька, потому что тогда вы создадите публично видимую ссылку
Есть один "легкий" способ решить проблему: просто использовать ZK-SNARKs для перевода средств, чтобы оплатить комиссию! Но это стоит много газа, дополнительные сотни тысяч газа только для одного перевода
Другой умный подход предполагает доверие к специализированным агрегаторам транзакций ("искателям" на жаргоне MEV). Эти агрегаторы позволят пользователям заплатить один раз, чтобы приобрести набор "билетов", которые можно использовать для оплаты транзакций в блокчейне. Когда пользователю нужно отправить NFT со скрытого адреса, не содержащий ничего другого, он предоставляет агрегатору один из билетов, закодированный с помощью схемы ослепления Чаумиана. Это оригинальный протокол, который использовался в централизованных схемах электронных денег с сохранением конфиденциальности, предложенных в 1980-х и 1990-х годах. Искатель принимает билет и неоднократно бесплатно включает транзакцию в свой бандл, пока транзакция не будет успешно принята в блокчейне. Поскольку количество задействованных средств невелико, и они могут быть использованы только для оплаты транзакций, вопросы доверия и регулирования гораздо ниже, чем при "полной" реализации такого рода централизованной электронной наличности с сохранением конфиденциальности
Скрытые адреса и упрощенное сканирование
Чтобы облегчить сканирование всего набора эфемерных открытых ключей, были добавлены теги просмотра к каждому эфемерному открытому ключу. Один из способов сделать это в приведенном выше механизме - сделать так, чтобы меткой просмотра был один байт общего секрета (например, x-координата S по модулю 256 или первый байт hash(S))
Таким образом, Бобу нужно выполнить только одно умножение эллиптической кривой для каждого эфемерного открытого ключа, чтобы вычислить общий секрет, и только в 1/256 случаев Бобу придется выполнять более сложные вычисления для генерации и проверки полного адреса
Выводы
Базовые стелс-адреса могут быть реализованы довольно быстро уже сегодня и могут стать важной ступенью развития практической конфиденциальности пользователей в Ethereum. Правда, для их поддержки требуется определенная работа со стороны кошелька. Тем не менее, Виталик Бутерин считает, что кошельки должны начать двигаться к более естественной многоадресной модели (например, создание нового адреса для каждого приложения, с которым вы взаимодействуете, может быть одним из вариантов) и по другим причинам, связанным с конфиденциальностью
Надеюсь статья была интересной и понятной!