Кошельки, сид-фраза и адреса
Что на самом деле хранит кошелёк Monero и почему у него два ключа
Кошелёк Monero хранит не монеты, а ключи. Всё начинается с одного случайного числа — оно записывается как сид-фраза из 25 слов. Из него получаются два секретных ключа: ключ траты (может тратить) и ключ просмотра (может только видеть входящие). Из них — ваш публичный адрес.
Монеты лежат не в кошельке
Ваши монеты записаны в блокчейне — в общем журнале, копия которого есть у каждого узла. Кошелёк хранит только секрет, который позволяет (а) находить в журнале выходы, принадлежащие вам, и (б) тратить их. Потеряли секрет — потеряли деньги. Кто-то узнал секрет — он может их потратить.
Сид-фраза: 25 слов
При создании кошелька генерируется случайное 256-битное число. Его неудобно записывать, поэтому кошелёк превращает его в 25 слов из словаря: 24 слова несут само число, 25-е — контрольная сумма, чтобы поймать опечатку. Эти слова и есть ваш кошелёк. Из них в любой программе можно восстановить всё остальное.
Некоторые кошельки (например, Feather) используют более новый формат Polyseed — 16 слов, в которых дополнительно закодирована дата создания кошелька (чтобы не сканировать блокчейн с самого начала). Суть та же: слова — это и есть ваши деньги.
Зачем два ключа?
В Bitcoin один секретный ключ делает всё. В Monero обязанности разделены:
| Ключ | Что умеет | Кому можно отдать |
|---|---|---|
| ключ просмотра | Находить входящие платежи и видеть их суммы | Бухгалтеру, аудитору, «часовому» кошельку на сервере магазина |
| ключ траты | Тратить деньги (и, косвенно, видеть исходящие) | Никому |
Это разделение нужно потому, что в Monero кошелёк не может просто «спросить у блокчейна баланс адреса» — адреса в блокчейне нет. Кошельку приходится сканировать каждую новую транзакцию и проверять: не мне ли это? Для проверки достаточно ключа просмотра. Поэтому сканирование можно доверить серверу, не давая ему права тратить.
С одним ключом просмотра кошелёк видит входящие платежи, но не может надёжно понять, какие из них уже потрачены: для этого нужно вычислить key image, а он требует ключа траты. Поэтому view-only кошелёк показывает завышенный баланс, пока ему не импортируют key images. В Carrot (вместе с FCMP++) для этого появится отдельный ключ.
Основной адрес и подадреса
Основной адрес начинается с 4 и имеет длину 95 символов. Но делиться им со всеми — не лучшая идея: тот, кому вы дали один и тот же адрес, сможет понять, что два платежа шли одному человеку (например, если две площадки сравнят адреса для выплат).
Поэтому кошельки Monero умеют создавать подадреса — они начинаются с 8. Их можно создавать сколько угодно, все они принадлежат одному кошельку, и по самим подадресам нельзя понять, что они связаны. Хорошая привычка: новый подадрес на каждого плательщика.
Какие бывают кошельки
- Полный узел + кошелёк (официальный GUI/CLI с собственным
monerod) — максимальная приватность: вы сами скачиваете и проверяете блокчейн. - Кошелёк с удалённым узлом (Feather, Cake, Monerujo и др.) — кошелёк скачивает блоки с чужого узла, но сканирует их сам. Узел не узнаёт ваших ключей, но видит ваш IP и время отправки транзакций.
- Легковесный (light wallet) — серверу передаётся ключ просмотра, и он сканирует за вас. Удобно, но сервер видит все входящие платежи.
- Аппаратный (Ledger, Trezor) — ключ траты не покидает устройство.
Хотите посмотреть, как это работает изнутри? Откройте генератор ключей — он проделывает все шаги со схемы выше прямо у вас в браузере.