Подадрес (Субадрес)​


Подадрес — это то, что вы используете по умолчанию для получения Monero.

Узнайте, за что вам заплатили.

Создавая уникальный подадрес для каждого ожидаемого платежа, вы всегда будете знать, за что вам заплатили.

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

Не позволяйте связывать ваши платежи

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

Следует отметить, что это не поможет, если у вас есть свой аккаунт у такой службы. Тогда ваши платежи уже связываются в базе данных службы, независимо от Monero.

Групповое перечисление средств на счета​

Счета являются удобной функцией на уровне самого кошелька и позволяют группировать подадреса под одним ярлыком и балансом.

Вы можете пожелать организовать ваши средства в такие счета, как «наличные», «работа», «трейдинг», «майнинг», «пожертвования» и т. д.

Так как счета являются просто группами подадресов, у самих них нет адреса.

Счета детерминировано выводятся на основе корневого приватного ключа вместе с подадресами.

Счета подобны подсчетам вашего классического банковского счёта. Тем не менее тут есть одно важное отличие. В случае с Monero средства на самом деле находятся не на счетах и не по публичным адресам. Концептуально публичные адреса являются шлюзом или механизмом маршрутизации. Средства находятся в непотраченных выходах транзакций. Таким образом, в одной транзакции, в принципе, могут накапливаться и тратиться выходы с множества адресов (и при расширении — с множества счетов). CLI или GUI-кошелёк может напрямую не поддерживать создание таких транзакций из соображений простоты.

Если говорить коротко, то рассматривайте счета в качестве мягкой группировки ваших средств.

А почему просто не использовать множество кошельков?​

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

Кроме того, довольно удобно управлять своими подадресами, пользуясь одним интерфейсом пользователя.

Свойство на уровне кошелька​

Подадреса и счета являются свойством уровня кошелька, позволяющим строить и интерпретировать транзакции. Они не влияют на консенсус.

Структура данных​

Подадрес имеет выделенный «сетевой байт»:

ИндексРазмер в байтахОписание
01Указывает тип сети и тип адреса 42 - основная сеть; 36 - отладочная сеть; 63 - тестовая сеть

В ином случае структура данных будет той же, что и у стандартного адреса.

Как генерируется​

Концептуально у каждого подадреса есть:

  • индекс счёта (также известен как «основной» индекс);
  • индекс подадреса в самом счёте (также известен как «младший» индекс).

Индексы имеют нулевую основу. По умолчанию кошельки используют индекс счёта с нулевым значением.

Индексы включаются в структуру данных подадресов не напрямую. Вместо этого они используются в качестве входа при генерировании ключей подадресов.

Приватный ключ просмотра​

Скаляр для подадреса m выводится следующим образом:

m = Hs("SubAddr" || a || account_index || subaddress_index_within_account)

Где:

  • Hs является хеш-функцией Keccak-256, интерпретированной как целое число и модуль 1 (максимальная скалярная величина edwards25519);
  • || является операцией конкатенации множества байтов;
  • SubAddr является фиксированной строкой с 0 на конце (всего 8 байт);
  • a является приватным ключом просмотра стандартного адреса (неподписанным 32-байтовым целым числом с обратным порядком байтов);
  • account_index является индексом счёта (неподписанным 32-байтовым целым числом с обратным порядком байтов);
  • subaddress_index_within_account является индексом подадреса внутри счёта (неподписанным 32-байтовым целым числом с обратным порядком байтов).

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

Публичный ключ траты​

Публичный ключ траты D для подадреса выводится следующим образом:

D = B + m*G

Где:

  • B является публичным ключом траты для стандартного адреса;
  • m является скаляром для каждого подадреса, полученным из приватного ключа траты;
  • G является «базовой точкой» - это просто специфическое для edwards25519 константное значение.

Публичный ключ просмотра​

Публичный ключ просмотра C для подадреса выводится следующим образом:

C = a*D

Где:

  • a является приватным ключом просмотра стандартного адреса;
  • D является публичным ключом траты для подадреса.

Особый случай для (0, 0)

Подадрес #0 счёта #0 является стандартным адресом. Так как стандартный адрес генерируется по другим правилам, он реализуется просто посредством оператора if.

Построение адресной строки​

Процедура та же, что и в случае со стандартным адресом.

Внимание!​

  • Не рекомендуется переводить весь баланс с подадреса на стандартный адрес в рамках одной транзакции. В результате такого действия подадреса связываются в блокчейне. Тем не менее это угрожает анонимности только в случае с определённым отправителем, и ситуация едва ли будет хуже, как если бы подадреса не использовались вовсе. Если вам необходимо объединить средства и сохранить максимальную анонимность, то это следует делать отдельными транзакциями (по одной на подадрес).
  • Ярлыки, используемые для удобства, не сохраняются при повторном создании на основе мнемонической фразы.

Ссылки