Стелс-адреса дає змогу опублікувати одну адресу, і при цьому кожен платіж вам потрапляє в ланцюзі на нове місце. Цей посібник пояснює, як це працює, що роблять ваш ключ перегляду й ключ витрачання і як гаманець знаходить власні платежі, на прикладі Blocknet.
Що таке стелс-адреса?
Стелс-адреса — це публічна адреса, яка ніколи не з’являється в блокчейні. Вона містить два публічні ключі: ключ витрачання й ключ перегляду. Для кожного платежу гаманець відправника поєднує їх із новим випадковим числом і створює одноразову адресу, яку може розпізнати й з якої може витрачати лише одержувач.
У публічному реєстрі звичайна адреса з’являється в кожному отриманому нею платежі. Так працює стандартна адреса Bitcoin: будь-хто, хто її знає, може переглянути кожен платіж і підсумувати загальну суму. Саме тому багато гаманців Bitcoin видають нову адресу для кожного платежу.
Стелс-адреса робить це за вас. Ви поширюєте одну адресу — на вебсайті, у профілі чи як @name, — і кожен відправник виводить із неї іншу одноразову адресу. Десять платежів вам стають десятьма виходами, які не мають нічого видимо спільного ні між собою, ні з адресою, якою ви поділилися. Жодного обміну повідомленнями не потрібно: відправник сам обчислює одноразову адресу з вашої публічної адреси й випадкового числа.
Звідки взялися стелс-адреси?
Схема одноразових адрес, яку використовують Monero, Blocknet та інші монети, походить від whitepaper 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. Він також додає до хешу позицію кожного виходу в транзакції, тож два виходи одній людині в одній транзакції все одно отримують не пов’язані між собою ключі. З того самого спільного секрету також виводяться маскувальний множник, що приховує суму виходу, і ключ, що шифрує його мемо, — саме так одержувач читає і те, і інше.
Що роблять ключ перегляду й ключ витрачання?
Розділення ключів дає два рівні доступу:
- Приватний ключ перегляду знаходить платежі. Маючи v і ваш публічний ключ витрачання, гаманець може розпізнати кожен вихід, надісланий вам, розшифрувати його суму й прочитати мемо.
- Приватний ключ витрачання їх витрачає. Лише s перетворює знайдений вихід на приватний ключ x, яким можна підписати витрачання.
Таке розділення робить можливими гаманці лише для перегляду. У гаманці командного рядка 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.