Стелс-адреса простыми словами: как работают одноразовые адреса

· 5 мин чтения

Стелс-адрес позволяет опубликовать один адрес, и при этом каждый платёж вам попадает в блокчейне в новое место. В этом руководстве объясняется, как это работает, что делают ключ просмотра и ключ траты и как кошелёк находит свои платежи, — на примере Blocknet.

Что такое стелс-адрес?

Краткий ответ

Стелс-адрес — это публичный адрес, который никогда не появляется в блокчейне. Он содержит два публичных ключа: ключ траты и ключ просмотра. Для каждого платежа кошелёк отправителя объединяет их с новым случайным числом и создаёт одноразовый адрес, который может распознать и потратить только получатель.

В публичном реестре обычный адрес фигурирует в каждом полученном им платеже. Так работает стандартный адрес Bitcoin: любой, кто его знает, может найти каждый платёж и сложить общую сумму. Поэтому многие кошельки Bitcoin выдают новый адрес для каждого платежа.

Стелс-адрес делает эту работу за вас. Вы сообщаете один адрес — на сайте, в профиле или как @name, — и каждый отправитель получает из него свой одноразовый адрес. Десять платежей вам превращаются в десять выходов, у которых нет ничего видимого общего ни друг с другом, ни с сообщённым вами адресом. Обмениваться сообщениями не нужно: отправитель сам вычисляет одноразовый адрес из вашего публичного адреса и случайного числа.

Откуда взялись стелс-адреса?

Схема одноразовых адресов, которую используют Monero, Blocknet и другие монеты, восходит к вайтпейперу CryptoNote v2.0 Николаса ван Саберхагена, датированному 17 октября 2013 года. В нём эта идея названа «несвязываемыми платежами» и описано, как отправитель генерирует «одноразовый публичный ключ» из адреса получателя. Документация Monero описывает стелс-адреса как способ, позволяющий отправителям создавать «случайные одноразовые адреса для каждой транзакции от имени получателя».

Идея распространилась за пределы приватных монет. BIP 352 «Silent Payments» в Bitcoin позволяет статическому адресу Bitcoin получать платежи, которые нельзя связать в блокчейне, а ERC-5564 для Ethereum, созданный в 2022 году, стандартизирует стелс-адреса для аккаунтов Ethereum. В этих сетях обе функции включаются по желанию. В Blocknet каждый платёж использует одноразовый адрес.

Как работают стелс-адреса?

Краткий ответ

Отправитель выбирает случайное число r, публикует R = r·G в транзакции и объединяет r с публичным ключом просмотра получателя в общий секрет. Прибавив этот секрет к публичному ключу траты, он получает одноразовый ключ. Получатель восстанавливает тот же секрет из R и своего приватного ключа просмотра, поэтому только он находит платёж.

Ваш кошелёк хранит две пары ключей. Каждый приватный ключ — это секретное число (s для траты, v для просмотра), а каждый публичный ключ — это число, умноженное на фиксированную точку кривой G. Ваш адрес — это просто два публичных ключа, S и V. Вот весь обмен целиком:

Receiver publishes:   S = s·G   and   V = v·G
Sender picks r:       R = r·G                 (stored in the transaction)
One-time key:         P = H(r·V)·G + S
Receiver checks:      H(v·R)·G + S == P       (true because r·V = v·R)
Key to spend it:      x = H(v·R) + s          (so P = x·G)

Весь фокус — в обмене Диффи — Хеллмана. Отправитель вычисляет r·V, а получатель вычисляет v·R, и оба приходят к одной и той же точке, потому что каждое из этих значений равно r·v·G. Больше никто не знает ни r, ни v, поэтому больше никто не может её вычислить. Хеширование этой точки (H) даёт общий секрет, а одноразовый ключ P — это этот секрет в виде точки, прибавленный к вашему публичному ключу траты.

При сканировании вы заново вычисляете секрет из R и своего приватного ключа просмотра и проверяете, получается ли P. Если да, выход ваш. Чтобы его потратить, кошелёк прибавляет тот же секрет к вашему приватному ключу траты, и получается приватный ключ x для этого одного выхода.

Blocknet следует этой схеме на группе Ristretto поверх Curve25519, хешируя с помощью SHA-256 с доменным тегом, специфичным для Blocknet. Кроме того, он подмешивает в хеш позицию каждого выхода в транзакции, поэтому два выхода одному и тому же человеку в одной транзакции всё равно получают не связанные ключи. Из того же общего секрета получаются и ослепляющий множитель, который скрывает сумму выхода, и ключ, которым шифруется его мемо, — так получатель читает и то, и другое.

Что делают ключ просмотра и ключ траты?

Разделение ключей даёт два уровня доступа:

Это разделение делает возможными кошельки только для просмотра. В консольном кошельке Blocknet команда viewkeys создаёт отдельный файл кошелька из ваших ключей просмотра. Справка кошелька описывает его как файл, который «может отслеживать, но не может тратить», полезный, когда «вам нужен доступ только для просмотра на другой машине». При запуске кошелёк объясняет, что создаёт:

# View Keys
  This will create a view-only wallet that can monitor incoming
  funds but CANNOT spend. Anyone with this file can see your
  balance and transaction history.

Передавайте кошелёк только для просмотра лишь тому, кому показали бы свою историю, например бухгалтеру, или держите его на втором собственном компьютере. В любом случае он может следить за поступлением средств, пока ваш ключ траты остаётся на машине, которой вы доверяете.

Как кошелёк находит свои платежи?

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

Сканер Blocknet делает это быстро. Дорогостоящий шаг — умножение R на ваш ключ просмотра — выполняется один раз на транзакцию, а затем каждый выход этой транзакции проверяется по результату. Когда выход совпадает, кошелёк расшифровывает сумму и сверяет её с обязательством Педерсена этого выхода, прежде чем добавить её к вашему балансу.

Сканирование также упрощает восстановление. Обе пары ключей Blocknet получаются из вашей сид-фразы из 12 слов, поэтому восстановление сид-фразы на новом компьютере воссоздаёт ключи, а кошелёк заново сканирует блокчейн и находит все принадлежащие вам выходы. Руководство по кошельку Blocknet показывает, как сделать резервную копию сид-фразы и восстановить её.

Стелс-адреса в Blocknet

В Blocknet стелс-адрес — это просто ваш адрес. Это кодировка base58 вашего публичного ключа траты, публичного ключа просмотра и 4-байтовой контрольной суммы, всего 92 или 93 символа. Каждый платёж вам использует его, потому что у формата транзакций нет прозрачного режима. Награды за блоки тоже идут на одноразовые ключи, поэтому coinbase-выход соло-майнера находится тем же сканированием.

Стелс-адреса сочетаются с остальными средствами приватности Blocknet: кольцо из 16 скрывает, из какого выхода идёт трата, обязательства скрывают суммы, а Dandelion++ скрывает, где транзакция вошла в сеть. Руководство по приватности Blocknet разбирает каждый уровень.

Они работают и с именами. Короткое имя Blocknet ID, например @yourname, публично сопоставлено с вашим адресом, так что отправители могут найти его на blocknet.id. Сами платежи при этом по-прежнему идут на новые одноразовые ключи, поэтому ваше имя ничего не говорит о том, что вы получили.

Поэтому короткое имя — удобный адрес для выплат при майнинге. Запустите seine, введите свой адрес или @yourname в ответ на запрос и примите пул по умолчанию, bntpool.com. Остальное описано в руководстве по майнингу, а ваш кошелёк найдёт заработанные BNT тем же сканированием с ключом просмотра, которое описано выше.

Часто задаваемые вопросы

Стелс-адрес и одноразовый адрес — это одно и то же?

Это две половины одной системы. Стелс-адрес — это адрес, который вы публикуете; он состоит из публичного ключа траты и публичного ключа просмотра. Одноразовый адрес — это новый ключ, который отправитель получает из него для одного платежа. В блокчейне появляются только одноразовые адреса, а опубликованный вами адрес — никогда.

Может ли кто-то увидеть мой баланс, если знает мой стелс-адрес?

Нет. Знание вашего опубликованного адреса не позволяет никому найти ваши платежи, потому что каждый из них попадает на одноразовый ключ, который выглядит не связанным с адресом. Чтобы их найти, нужен ваш приватный ключ просмотра, поэтому перечислить полученное может только ваш кошелёк. В Blocknet суммы тоже скрыты, так что даже сами выходы не показывают значения.

Что можно сделать с моим приватным ключом просмотра?

Приватный ключ просмотра позволяет его владельцу находить отправленные вам платежи и читать их суммы и мемо. Потратить он ничего не может, потому что для траты нужен приватный ключ траты. В Blocknet команда viewkeys превращает ваш ключ просмотра в кошелёк только для просмотра, что удобно для наблюдения за средствами на втором компьютере. Передавайте его только тем, кому доверяете.

Нужно ли включать стелс-адреса в Blocknet?

Нет. Каждый платёж в Blocknet автоматически идёт на одноразовый стелс-адрес, потому что у формата транзакций нет прозрачного режима. Ваш кошелёк создаёт одноразовый ключ, когда вы отправляете, и находит входящие платежи с помощью ключа просмотра при синхронизации. Настраивать ничего не нужно, платите ли вы на адрес или на @name.