У меня вчера прошла Биткойн пати. Кто знает, тот в курсе, о чём я 🙂 Теперь надо бы как-то описать некоторые моменты Биткойна с точки зрения понимания человека, который как либо косвенно связан с программированием и администрированием. Итак, попробую
Биткойн адрес может быть получен в оффлайне. Делается это так. Генерится случайное число (софт добавляет события пользователя — мышки, клавы — для генерации энтропии) длиной 256 бит. Это становится закрытым ключом. Им будут подписываться ваши траты денег. Затем из него по криптоалгоритмам получается также 256-битовой число — открытый ключ. Затем открытый ключ хешируется до 160 бит. Эти 160 бит плюс контрольная сумма, и всё это кодированное для удобности читабельности и есть Биткойн адрес для получения денег. Чтобы отличать адрес от других потенциальных криптовалют, Биткойн адреса начинаются на ‘1’ или на ‘3’ (вторые вас пока не должны интересовать :))
Траты происходят через транзакции. Транзакция — это такая сущность, которая имеет 256 битный хеш всего, что в неё заключено, у которой есть входы и выходы. Входы указывают на хеши предыдущих транзакций, в которым деньги передавались на ваш адрес, а выходы имеют адреса, куда деньги идут. Сумма денег выходов не должна превышать сумму денег входов. Разница между входом и выходом — комиссия тем, кто подтверждает транзакции (майнеры). Комиссия определяется вами, но как правило, она «забита» фиксировано в софт (сейчас около одной кроны). Это сделано как защита от спама биткойн сети мелкими суммами. Всё перемещение денег в Биткойне — это такие связи из транзакций, одна с другой. Транзакция содержит публичные ключи потратившего деньги и цифровые подписи для всех выходов (суммы и адресов Биткойна), куда идёт дальше трата.
Маленький итог. Биткойн адрес не содержит публичный ключ. Это только его хеш. Публичный ключ выходит на сцену только тогда, когда вы тратите биткойны. По публичному ключу можно проверить подпись, сделанную закрытым ключом, но получить закрытый ключ из публичного нельзя. Другие участники могут легко проверить — реальный ли владелец тратит Биткойн. Зная ваш публичный ключ, вашу подпись на трату денег, они вычисляют хеш из вашего публичного ключа и сверяют его — он совпадёт с вашим адресом, на который вы до этого получили биткойны. Всё это делается для всех входов и выходов вашей транзакции. То есть в транзакции ваш софт тратит только те кусочки денег, которые вы получили, формируя для вас один платёж (внутри он состоит из кучи кусочков пришедших монет) на тот адреса или адреса, на которые вы указали и подписали.
В Биткойне всё должно быть чётко — сколько пришло, столько должно уйти. Если вы получили один платёж на 5 биткойнов, а тратите 1 биткойн, то ваш софт формирует «сдачу» — 4 биткойна. Она идёт на один из ваших адресов — может на тот, с которого вы тратите, или на новый сгенерированный адрес (улучшает секьюрность)
Немного о термине. Кошельком называют одну совокупность всех ваших адресов (с приватными ключами, разумеется). Обычно софт предгенерирует сразу, скажем 100 адресов, но показывает их вам по мере вашего запроса. Тем самым, когда вы делаете бэкап — у вас сразу бэкапятся приватные ключи для всех адресов с запасом. В Биткойне всегда рекомендуется новый платёж получать на новый адрес — так сложнее узнать, сколько вы денег имеете всего. Только ваша программа суммирует все деньги с ваших адресов и показывает как одну сумму.
Новые адреса для получения денег просто запрашиваются вами у софта («Получить платёж»). По этой же причине, ради безопасности, «сдача» обычно идёт на новый ваш неиспользованный адрес (по которому не было сделок в сети). То есть большинство транзакций имеют минимум два выхода — один адрес, куда тратите, а другой — ваша сдача.
Не так давно в сообществе Биткойна придумали замечательную штуку — детерминистические кошельки. До них, софт генерировал, скажем 100 адресов, затем предупреждал что надо сделать бэкап (чтобы вы не потеряли закрытые ключи) и по мере пользования уже выдавал вам ваши новые адреса. Как они заканчивались, он снова по random генерировал 100 адресов и 100 приватных ключей, снова просил сделать бэкап и так далее…
Сейчас, все программы стараются перейти на детерминистические кошельки. У кошелька пользователя есть один секретный 256-битный ключ — seed (зерно). Из него довольно простыми алгоритмами, примерно как хеширование (хотя позже я скажу, почему не просто хеширование) — софт получает ваш первый, второй и так далее адреса. Это может происходить до бесконечности. Но, обычно, софт «заглядывает» вперёд на 20-ть адресов. Точнее на 20 адресов от последнего адреса, который имел транзакции.
Тем самым, пользователь бэкапит только seed, из которого всегда получаются все случайные приватные ключи и ваши адреса получения денег. Этот стандарт называется BIP32 и есть ещё BIP44. Что такое BIP — следующий пункт 🙂
Простая аналогия с BIP — это RFC для интернета. BIP — свод стандартов, выработанных сообществом разработчиков, для сети Биткойн. После этого стало легко стандартизировать фичи и софт. Нумера после BIP обычно 4-х цифровые, например BIP-0032 или BIP-0044. Но часто пишут и просто — BIP32 & BIP44, например. Есть стандарты кодированием QR кодом приватных ключей (в бумажных кошельках, например), выписанных счетов (то, как я оплачивал Трезор) и т.д..
Тот самый Трезор, что получат с Биткойн пати — это BIP44 совместимый девайс. Это очень классно! Вы это поймете. Про девайс я напишу отдельный пост. BIP44 стандарт описывает формирование адресов, разбитых по аккаунтам (аккаунт там — просто группа адресов, например, аккаунтом может быть выплаты от какой либо партнёрки). Внутри аккаунта есть группа адресов для получения денег, а есть для сдачи. Seed в трезоре генерируется так, что его можно представить в виде огромной базы английских слов. Каждое слово там — это 11 бит сида. Когда настраиваешь Трезор, надо записать 24 слова. Порядок, разумеется, очень важен. Ту записанную карту с 24 словами можно порезать на 2-3 куска и хранить отдельно в разных местах. А можно хранить и одну карту, но та карта — это будет ключ от всех денег со всех адресов, которыми оперирует ваш Трезор. Кто украдёт все 24 слова и порядок их следования — сформируют сид и получат все ваши приватные ключи.
Из Seed приватные ключи и адреса получаются не простым хешированием. Там используются другой хитрый алгоритм. Но он даёт одну классную фичу. На основе него из Seed можно получить открытый ключ сида или любой открытый ключ от вашего аккаунта. Конечно, это контролируете вы. Но вы можете взять открытый ключ вашего аккаунта из вашего BIP44 кошелька (например, из Трезора) и дать его вашему сотруднику, например, принимающему деньги. Из этого открытого ключа можно получить все ваши адреса под тем аккаунтом, но нельзя получить приватные ключи для этих адресов! Это такой read-only доступ. Тот ваш сотрудник, теперь, может генериовать с помощью софта всё новые и новые адреса для приёма денег, которые может тратить только истинный владелец сида, то есть вы. Да, сотрудник может знать, сколько на аккаунте в сумме денег, но все аккаунты под контролем только одного владельца, количество аккаунтов владелец может сделать сколько угодно и так организовать работу, что знание о балансе одного аккаунта не будет критично. А вот истинный владелец сида уже сможет хоть каждый день все деньги со всех аккаунтов разкидывать на новые адреса своего другого аккаунта в том же кошельке. И ещё гляньте следующий пункт.
Как я описал в предыдущем пункте, вы можете для каждого аккаунта Трезора получить публичный ключ для генерации всех адресов того аккаунта. И это будет только read-only. Дак вот, под Андроидом (под другими мобильными ОС скоро появятся) есть уже программа, которая импортирует публичный ключ аккаунта (который даёт Трезор) и генерирует адреса приёма денег. То есть можно на телефоне иметь весь список ваших адресов для приёма денег, не раскрывая всех ваших аккаунтов под Трезором, но при этом запросить оплату биткойнами в любой момент на свежий адрес, имея только телефон под рукой. А уже когда вы подключите девайс к компу, вы увидите приход денег и сможете их потратить.
В следующем посте напишу про Блокчейн, что такое майнинг и зачем он нужен.