Подадрес — это то, что вы используете по умолчанию для получения Monero.
Создавая уникальный подадрес для каждого ожидаемого платежа, вы всегда будете знать, за что вам заплатили.
Этот способ использования роднит подадреса с интегрированными адресами. Подадреса обычно предпочитают использовать по причинам, указанным ниже.
Они не позволяют тому, кто платит, связать ваши платежи вместе. Вы просто каждый раз генерируете новый подадрес. Поэтому службам, подобным Shapeshift, неизвестно, что вы снова получили Monero.
Следует отметить, что это не поможет, если у вас есть свой аккаунт у такой службы. Тогда ваши платежи уже связываются в базе данных службы, независимо от Monero.
Счета являются удобной функцией на уровне самого кошелька и позволяют группировать подадреса под одним ярлыком и балансом.
Вы можете пожелать организовать ваши средства в такие счета, как «наличные», «работа», «трейдинг», «майнинг», «пожертвования» и т. д.
Так как счета являются просто группами подадресов, у самих них нет адреса.
Счета детерминировано выводятся на основе корневого приватного ключа вместе с подадресами.
Счета подобны подсчетам вашего классического банковского счёта. Тем не менее тут есть одно важное отличие. В случае с Monero средства на самом деле находятся не на счетах и не по публичным адресам. Концептуально публичные адреса являются шлюзом или механизмом маршрутизации. Средства находятся в непотраченных выходах транзакций. Таким образом, в одной транзакции, в принципе, могут накапливаться и тратиться выходы с множества адресов (и при расширении — с множества счетов). CLI или GUI-кошелёк может напрямую не поддерживать создание таких транзакций из соображений простоты.
Если говорить коротко, то рассматривайте счета в качестве мягкой группировки ваших средств.
Если сравнивать с процессом создания множества кошельков, то преимущество подадресов состоит в том, что вам приходится иметь дело всего с одной мнемонической фразой. Все подадреса могут быть выведены на основе мнемонической фразы кошелька.
Кроме того, довольно удобно управлять своими подадресами, пользуясь одним интерфейсом пользователя.
Подадреса и счета являются свойством уровня кошелька, позволяющим строить и интерпретировать транзакции. Они не влияют на консенсус.
Подадрес имеет выделенный «сетевой байт»:
Индекс | Размер в байтах | Описание |
---|---|---|
0 | 1 | Указывает тип сети и тип адреса 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 является стандартным адресом. Так как стандартный адрес генерируется по другим правилам, он реализуется просто посредством оператора if
.
Процедура та же, что и в случае со стандартным адресом.