Содержание статьи
- Что такое криптокошелек на самом деле
- Приватный ключ = полный контроль
- Seed-фраза: ключ от всего
- Горячие и холодные кошельки
- Кастодиальные и некастодиальные кошельки
- Открытый и закрытый исходный код
- Что такое многоподписные кошельки?
- Особенности аппаратных и программных кошельков
- А если разработчик исчезнет?
- Резервное копирование и восстановление
- Заключение
Цикл «Крипта с нуля»
- Крипта с нуля. Разбираемся с алгоритмами в основе криптовалют
- Крипта с нуля. Выясняем, как устроен блокчейн
- Крипта с нуля. Выясняем, как работает майнинг
- Крипта с нуля. Разбираемся в архитектуре Bitcoin
- Крипта с нуля. Изучаем экосистему криптовалют
- Крипта с нуля. Разбираемся в криптокошельках (эта статья)
Что такое криптокошелек на самом деле
Если ты когда‑либо пользовался электронными деньгами вроде Webmoney или «Яндекс.Денег», то словосочетание «электронный кошелек» наверняка ассоциируется у тебя с программой или мобильным приложением, внутри которого лежит некий эквивалент денежной суммы. При необходимости эти деньги можно обналичить или отправить другому человеку, словно виртуальные монеты или банкноты: разница с обычными деньгами тут, в общем‑то, невелика. Примерно таким же образом мы оперируем средствами на банковском счете, и эти операции уже давно кажутся нам привычными.
Кошельки для работы с криптовалютами устроены иначе. В Bitcoin и других сетях с UTXO-моделью нет отдельного объекта, который можно было бы назвать «монетами в кошельке», вместо этого там используется понятие «неизрасходованного выхода транзакций», которое мы уже разбирали в статье «Крипта с нуля. Разбираемся в архитектуре Bitcoin». Кошелек работает с криптографическими ключами и другими данными, позволяющими выполнить условия расходования выходов транзакций, которыми пользователь может распоряжаться. При этом программное обеспечение кошелька создает (или импортирует существующие) приватные ключи, отслеживает соответствующие им средства и использует ключи для подписи транзакций. Программа, конечно, может показать твой баланс, как какое‑нибудь банковское приложение, но это не физическое количество денег, хранящихся где‑то на твоем счете, а вычисленное значение.
А вот, например, в Ethereum у аккаунта есть поле balance, где отображается количество монет в нативной валюте сети, но при этом сами токены тоже не лежат в кошельке: их балансы хранятся в состоянии соответствующего смарт‑контракта. Поэтому корректнее считать криптокошелек не хранилищем криптовалюты, а инструментом управления доступом к ней. Все средства и денежные активы не копятся в кошельке — они лишь часть состояния блокчейна, а кошелек дает авторизованному пользователю возможность менять это состояние в доступных ему пределах. По той же причине потеря приватных ключей или seed-фразы не удаляет записи о транзакциях из сети — она просто лишает владельца кошелька возможности доказать право распоряжаться соответствующими средствами.
info
В 2009 году британский IT-инженер Джеймс Хауэллс занимался майнингом Bitcoin. Позднее он разобрал свой старый компьютер и хранил два похожих 2,5-дюймовых жестких диска: один собирался выбросить, а на другом находился кошелек примерно с 7500 BTC. В результате диск с криптокошельком по ошибке оказался на свалке в Ньюпорте, где его не могут отыскать до сих пор, хотя теперь он стоит целое состояние. Фактически 7500 биткоинов (примерно 581,8 миллиона долларов США) никуда не делись: информация о них до сих пор записана в блокчейне, но вот воспользоваться этими средствами Хауэллс больше не может, поскольку его приватный ключ хранился на том самом диске, который он выбросил в мусорный бак.
Приватный ключ = полный контроль
Основной элемент, без которого не работает ни один криптокошелек, — приватный ключ. Это секретное число, из которого криптографически вычисляется соответствующий публичный ключ. Публичный ключ можно использовать для проверки подписей, а приватный нужен для создания этих самых подписей.
В Bitcoin кошелек использует приватные ключи для расходования средств. В Ethereum пользовательский аккаунт (EOA) также контролируется парой публичного и приватного ключей: именно приватным ключом подписываются транзакции, именно он дает контроль над средствами, связанными с аккаунтом.
Тут важно понимать, что пароль или ПИН‑код для доступа к программному или аппаратному криптокошельку — это не приватный ключ. Даже сам адрес, который отображается в кошельке, им не является. Адрес можно спокойно сообщать другим людям: он нужен, чтобы определить, куда отправлять средства. А вот секрет, позволяющий подписать расходующую транзакцию, должен оставаться секретом.
Но здесь возникает одна серьезная практическая проблема. Приватный ключ — это длинное случайное число, и запоминать его человеку неудобно. Кроме того, при вводе такого числа можно запросто допустить ошибку. А если кошелек использует не один ключ, а десятки или сотни, резервная копия быстро превращается в коллекцию таких вот малопонятных чисел. Поэтому современные кошельки используют другой подход: пользователя просят записать и сохранить несколько слов, из которых впоследствии можно восстановить все необходимые ключи. Этот набор слов называется seed-фразой.
Seed-фраза: ключ от всего
Когда пользователь впервые запускает на компьютере или смартфоне программу криптокошелька либо настраивает аппаратный кошелек (для работы с которым тоже требуется специальное приложение), эта самая программа генерирует специальный набор из 12 или 24 слов. На первый взгляд это просто странная последовательность вроде apple, river, airplane, lantern и так далее, но именно ее программа предлагает записать на бумаге, и при этом предупреждает, что потеря этой записи означает потерю доступа к деньгам.
Эти слова — мнемоническое представление случайных данных, из которых кошелек получает свои ключи. Такой способ описан в стандарте BIP-39, при этом количество слов зависит от размера исходной случайной последовательности (энтропии): для 128 бит получается 12 слов, для 256 бит — 24. В ряде случаев она может включать 15, 18 или 21 слово. В конце последовательности добавляется контрольная сумма, поэтому набор слов только выглядит случайным, важен даже их правильный порядок.
Здесь есть важная техническая тонкость: seed-фраза и приватный ключ — не одно и то же. Мнемоника seed-фразы преобразуется алгоритмом в 512-битный seed, а уже из него в приватный мастер‑ключ. И вот здесь начинается самое интересное. Стандарт BIP-32 позволяет построить из одного seed целое дерево ключей: сначала из seed получают мастер‑ключ, а затем из него — дочерние ключи. Дочерние ключи, в свою очередь, могут порождать следующие уровни. Таким образом, кошельку не требуется заранее хранить отдельную резервную копию каждого созданного адреса: достаточно сохранить исходный секрет, из которого все это дерево можно получить заново.
Схематически это можно представить так.

При восстановлении кошелька происходит обратная операция: программа превращает введенные пользователем слова в исходные данные и с помощью описанного в стандарте BIP-39 алгоритма получает из них 512-битный seed. А уже seed используется для построения ключей. Поэтому одна и та же seed-фраза способна восстановить не один конкретный адрес, а всю иерархию ключей детерминированного кошелька. Именно в этом и заключается ее практическая ценность: резервировать приходится не десятки или сотни отдельных приватных ключей, а один исходный секрет.
При этом BIP-39 предусматривает еще один нюанс: к мнемонической фразе может добавляться дополнительная passphrase. Она участвует в процедуре получения seed, поэтому изменение этой строки приводит уже к другому seed и, соответственно, к другому набору ключей. Причем для любой введенной passphrase получится некоторый валидный seed — протокол не предоставляет способа определить по самому результату, была ли введена «правильная» фраза, вот только на выходе получится уже новый кошелек, а доступ к средствам на старом будет утрачен, пока пользователь не введет правильную passphrase. По этой причине passphrase нужно хранить так же надежно, как и seed-фразу.
И это принципиальное отличие криптокошелька от обычного банковского счета. Если потерять пароль от банковского приложения, существует банк, который после проверки личности может восстановить доступ. Если потерять единственную копию секретов некастодиального кошелька, обращаться за восстановлением будет не к кому: сеть не знает владельца и не располагает его резервной копией. Именно поэтому фраза из нескольких слов может быть значительно важнее самого приложения, на экране которого пользователь видит свой баланс. Приложение можно удалить и установить заново. Телефон можно заменить, аппаратный кошелек можно потерять. Если секреты сохранены, доступ к ключам без проблем восстанавливается совместимым программным обеспечением. Если же потерян единственный экземпляр необходимого секрета, новый телефон или новая установка программы сами по себе ничего не вернут.
Горячие и холодные кошельки
Условно все криптокошельки можно разделить на горячие и холодные. Разница заключается, конечно же, не в температуре устройства, а в том, где находится приватный ключ в момент, когда кошелек используется, и требуется ли, чтобы само устройство было подключено к сети.
Горячий кошелек работает на девайсе, подключенном к интернету: это может быть смартфон или обычный компьютер. Программа кошелька хранит ключи на этом устройстве и одновременно получает из сети информацию, необходимую для работы с блокчейном. При отправке средств она формирует транзакцию и подписывает ее соответствующим приватным ключом.

Некоторые горячие кошельки работают в браузере в виде веб‑приложения или плагина, а на чем именно запущен этот браузер по большому счету не имеет особого значения. Самый простой пример — MetaMask, расширение, которое устанавливается в браузер и становится интерфейсом для работы с блокчейнами и децентрализованными приложениями. Похожую роль играют мобильные кошельки, только вместо браузера ключи и интерфейс находятся в приложении на смартфоне.
У такой схемы есть очевидное достоинство: кошелек всегда под рукой, не нужно подключать отдельное устройство, переносить транзакцию на другой компьютер или проходить дополнительную процедуру подписи, поэтому горячие кошельки хорошо подходят для регулярных операций.
Обратная сторона этой простоты тоже вполне конкретна: если компьютер или смартфон с ключами скомпрометирован, например подцепил трояна, ворующего приватные ключи, у злоумышленника появляется возможность получить доступ к кошельку или вмешаться в процесс создания транзакции. Шифрование файла кошелька помогает защитить ключи, когда они не используются, но не спасает от ситуации, когда вредоносная программа получает доступ к уже расшифрованным ключам.
Это не означает, что горячий кошелек обязательно небезопасен, просто если через кошелек регулярно проходят небольшие суммы, удобство постоянного доступа может быть важнее максимальной изоляции ключей.
С холодным хранением идея обратная: приватный ключ стараются вообще не держать в среде, постоянно подключенной к сети. Интернет по‑прежнему нужен для получения информации о транзакциях и отправки готовых операций в блокчейн, но сам секрет, которым подписывается транзакция, остается изолированным.
Самый распространенный современный вариант — аппаратный кошелек: отдельное устройство, предназначенное для хранения ключей и выполнения операций подписи. Сценарий работы выглядит примерно так: на компьютере или смартфоне пользователь создает транзакцию в специальном приложении, она передается аппаратному кошельку, который получает необходимые данные, показывает пользователю параметры операции и после подтверждения создает цифровую подпись внутри самого устройства. Назад возвращается уже подписанная транзакция, а сам приватный ключ при этом не передается компьютеру или смартфону.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
