Мы про­дол­жаем изу­чать устрой­ство крип­товалют с инже­нер­ной точ­ки зре­ния и сегод­ня погово­рим о кошель­ках, пред­назна­чен­ных для хра­нения крип­ты. На самом деле они ничего не хра­нят: монеты оста­ются в блок­чей­не, а кошелек управля­ет клю­чами, дающи­ми пра­во рас­поряжать­ся тво­ими акти­вами. Раз­берем­ся, чем отли­чают­ся горячие и холод­ные, кас­тоди­аль­ные и некас­тоди­аль­ные кошель­ки, зачем нужен multisig и почему потеря seed-фра­зы может обер­нуть­ся нас­тоящей катас­тро­фой.
 

Что такое криптокошелек на самом деле

Ес­ли ты ког­да‑либо поль­зовал­ся элек­трон­ными день­гами вро­де 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, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии