Bitcoin — это очень просто :)


Борис Оболикшто
эксперт

Несмотря на рост популярности Bitcoin, об этой криптовалюте продолжают слагаться мифы. С «монетами» (их обозначают BTC) связывают какие-то уникальные числа, которых почему-то ограниченное количество. При этом совершенно забывается роль Bitcoin-сообщества. Мне кажется, что всем будет полезно отдать себе отчет в том, что это не технологическая, а социальная инновация. Принципы работы Bitcoin очень остроумно составлены и при этом просты для понимания. Социальные идеи проекта стали возможны благодаря развитию технологий. Прежде всего — коммуникационных и криптографических.

Если вы не собираетесь самостоятельно анализировать защищенность криптовалюты или создавать программы, реализующие протоколы Bitcoin, то не придется и вникать в подробности используемых криптографических алгоритмов — достаточно поверить в их надежность (для работы выбраны алгоритмы, которым не первый год доверяют весьма уважаемые эксперты, а используют их крупнейшие финансовые организации). Для понимания работы нам потребуется освоить всего несколько базовых элементов. Чтобы не утонуть в подробностях, мы в дальнейшем не будем оговаривать различные вариации действий (на самом деле протокол Bitcoin довольно открыт и может быть существенно расширен при необходимости). Рассмотрим лишь самые простые операции.

Транзакции

В основе всей работы лежит понятие транзакции. В общем-то, оно мало отличается от общепринятого. Все транзакции публичны и доступны всем пользователям.

Протокол Bitcoin определяет, что транзакция — это раздел данных, который описывает перевод отправителем монет (BTC), ранее переведенных ему, новому получателю, который соответствует некоторым условиям, например, имеет определенный Bitcoin-адрес (можно также указать несколько получателей и причитающиеся каждому из них суммы). Под «ранее переведенными монетами» подразумевается результат подтвержденных транзакций, на которые даются ссылки и доказательства, что отправитель в новой транзакции являлся получателем в предшествующих транзакциях. Как минимум одна уже свершившаяся транзакция должна быть указана как «вход», но если вы получали монеты в результате нескольких транзакций, то вы вольны все их объединить и перераспределить одной транзакцией, просто перечислив во входящей части несколько соответствующих ссылок. Широковещательная рассылка по всем пользователям проекта транзакции (то есть раздела данных, описывающего переводы) и составляет начало процесса платежа.

Bitcoin transaction

На входе транзакции — ссылки на выходы ранее совершенных транзакций. Сумма всех входов не должна превышать суммы всех выходов. Если сумма переводов на выходе меньше, чем сумма на входе, то разница образует комиссию за подтверждение транзакции. Чтобы не потерять ту часть входной суммы, которую вы хотите оставить себе, один из переводов делают в свой адрес (то есть один из получателей — сам отправитель)

Для того чтобы платеж стал необратимым, а результатом перевода можно было воспользоваться, транзакция нуждается в подтверждении. Таким подтверждением служит включение её в запечатанный блок. Вот в этот момент и проявляется социальный характер проекта, так как создание блоков (и подтверждение транзакций) — процесс, добровольно выполняемый сообществом пользователей Bitcoin.

Блоки и их цепочки

Часть пользователей Bitcoin принимает участие в генерации блоков (на сегодняшний день это примерно каждый четвертый пользователь). Генерация блоков вознаграждается (за каждый сгенерированный блок его создатели получают вновь «добытые» монеты и комиссии за транзакции, которые включены в блок). Блоки нумеруются и связываются в цепочку (каждый следующий блок содержит информацию о предыдущем блоке, позволяющую легко проверить, не был ли подменен предыдущий блок). Каждый пользователь получает доступ ко всей цепочке блоков и, таким образом, у каждого пользователя хранятся все транзакции, которые происходили в сообществе. До тех пор, пока честных пользователей больше, чем мошенников, подменить блок или транзакцию нереально.

Необходимость взаимодействия большого числа пользователей при создании блоков определяется сложностью создания блока. Дело в том, что в структуру блока, кроме списка транзакций, которые произошли за время генерации блока, включаются еще и специальные поля. Значения этих полей у действительного блока должны удовлетворять столь сложным условиям, что найти эти значения по силам только обладателю невероятной вычислительной мощи. Сложность задачи поиска может легко изменяться и всегда удерживается на таком уровне, чтобы время поиска блока всем сообществом составляло около 10 минут. В настоящее время суммарная производительность тех, кто участвует в генерации блоков, составляет тысячи петафлопс, то есть количество операций с плавающей запятой, необходимых для генерации блока, определяется числом с 21 нулем!

Итак, сообщество примерно каждые десять минут генерирует новый блок и включает в него все произошедшие с момента окончания генерации предыдущего блока транзакции, удовлетворяющие требованиям протокола Bitcoin. Сгенерированный блок присоединяется к цепочке (рассылается всем участникам проекта). Транзакции становятся подтвержденными с этого момента, все получатели, упомянутые в транзакциях, могут тратить деньги (создавать свои транзакции), а сообщество начинает поиск следующего блока. Динамику процесса создания блоков можно посмотреть на многих специализированных сайтах проекта, например, на сайте Bitcoin watch.

Сложность создания блоков является своего рода гарантией от их подделки и рассылки фальшивок, поскольку проверить, соответствует ли блок требованиям протокола Bitcoin — довольно просто, а найти значения полей блока, удовлетворяющих этим требованиям с измененными значениями транзакций — невероятно сложно.

Вознаграждение за создание блока снижается вдвое после генерации каждых 210000 блоков. Поскольку темп генерации поддерживается примерно постоянным (блок за десять минут), то известно, что вознаграждение «за добычу» снижается примерно раз в четыре года. В настоящий момент вознаграждение составляет 25 BTC (это значение действует с 28.11.2012, до этого дня вознаграждение составляло 50 BTC).  Общее количество добытых монет определяется суммой геометрической прогрессии и никогда не превысит 210000*50*2=21000000 монет.

Bitcoin-адреса и их владельцы

Последнее понятие, которое нам необходимо, чтобы не путаться в представлениях о работе криптовалюты — это Bitcoin-адреса. Программное обеспечение, поддерживающее работу с Bitcoin-сетью, генерирует для пользователя пары криптографических ключей: в каждой паре два ключа: открытый и секретный. Сгенерированная пара сохраняется в так называемом кошельке пользователя (файл wallet.dat). Открытый ключ длиной 512 бит преобразуется в Bitcoin-адрес, состоящий из цифр и букв латинского алфавита так, что проверить соответствие открытого ключа адресу — очень просто, а получить из адреса значение ключа — практически нереально. Секретный ключ остается неизвестным никому и хранится только у пользователя. При создании транзакции, на входе которой получение монет на Bitcoin-адрес, пользователь объявляет свой публичный ключ, что позволяет подтвердить, что он был получателем в предшествующей транзакции, а также подписывает при помощи секретного ключа характеристики этой транзакции. Проверить подпись (и корректность создаваемой транзакции) позволяет открытый ключ, а сгенерировать подпись можно только владея секретным ключом. Таким образом, доступ к переведенным деньгам, несмотря на то, что все транзакции видны всем, имеет лишь владелец секретного ключа.

Каждый пользователь может иметь неограниченное количество Bitcoin-адресов и соответствующих им ключей. Более того, рекомендуется использовать новый ключ для каждой новой транзакции, чтобы сохранять анонимность распространения монет. В частности, в транзакции, в которой вы тратите не все полученные на входе ее деньги, остаток вы можете зачислять на новый собственный адрес, таким образом, никто из внешних наблюдателей не может оценить, у кого из пользователей накапливаются монеты, и сколько их у него.

Материалы по теме

  • BSO

    Тем, кто хочет «копнуть» чуть глубже помогут замечательные комментарии Viktor Sovietov (за которые ему огромная благодарность)

    Первый и главный касается некоего мифа о «монетах» BTC. Прямого аналога купюр или монет, существующих у привычных нам фиатных денег, в системе нет. Транзакция просто перенаправляет получателю некоторую сумму с точностью до восьмого знака после запятой. Для простоты удобно принять, что сумма исчисляется в дольной единице Bitcoin — Сатоши (в честь виртуального «автора» проекта Сатоши Накамото (Satoshi Nakamoto)). Сатоши, соответственно, составляет одну стомиллионную часть BTC. Отслеживая цепочки транзакций в обратном порядке, можно пронаблюдать всю историю того, как происходила передача денег от пользователя к пользователю (точнее — от одного Bitcoin-адреса к другому) и, в конце концов, добраться до момента, когда источником денег станет вознаграждение за генерацию блока (ведь все деньги вводятся в систему только таким образом). До сих пор BTC вводились в систему суммами по 50 BTC (до 28.11.2012) или по 25 BTC (с 28.11.2012 по настоящее время). Однако никакого «сакрального» смысла эти суммы не имеют — уже следующая за введением денег в систему транзакция может «разбить» их самым произвольным образом. Поэтому говорить о существовании «монет» номиналом «50 BTC», «25 BTC» или просто «BTC» нет никаких оснований. Более того, само понятие «номинал» не свойственно этой системе.

    Второе дополнение касается понятия «транзакция». Честно говоря, обилие материалов по экономике и денежному обращению, которые прошли через меня в последнее время, сделали это понятие для меня столь привычным, что я не стал искать для него разъяснений. А напрасно! Как подсказал Viktor, есть хорошая дефиниция: «транзакция — это просто запись о смене владельца. Право владения передающей стороны свидетельствует признанные сетью (ранее включенные в блоки) транзакции». Хороша аналогия с нотариальным подтверждением сделок — только нотариусами работают все «кошельки». Они проверяют право владения и регистрируют новый факт передачи прав (новую транзакцию).

    И последний «расширяющий» комментарий к этому посту, чтобы лучше представлять себе некоторые особенности адресации переводов. Bitcoin-адрес, как уже отмечалось, получается преобразованием открытого ключа из ключевой пары, генерируемой ПО Bitcoin. Длина открытого ключа — 512 бит, что довольно много: при вводе в традиционном 16-ричном представлении потребуется 128 символов — согласитесь, это малопригодно для ввода с клавиатуры и многовато даже для представления в виде, например, QR-кода. Адрес получают из этой последовательности, выполняя несколько преобразований ее, таким образом, чтобы самые незначительные отличия в ключе вызывали значительные отличия в адресе. В результате длина сокращается до 160 бит. К ним добавляются еще 32 бита для контроля правильности адреса и 8 бит идентификатора сети (протокол Bitcoin допускает существование нескольких сетей, например, тестовых). В итоге 200-разрядный адрес преобразуются в строку, состоящую из букв латинского алфавита (строчных и прописных) и цифр, длиной до 34 символов. Теперь адрес легко представить в виде QR-кода, а благодаря наличию 32 контрольных разрядов, нет опасности ошибиться и при ручном вводе адреса: ПО Bitcoin просто не примет для перевода неправильный адрес.

    Однако, поскольку определяющая часть Bitcoin-адреса (160 бит) короче ключа (512 бит), то теоретически существует возможность, что у двух разных ключей совпадут адреса (это называется коллизией) и каждый из владельцев соответствующих секретных ключей сможет использовать полученную сумму, то есть сможет перевести ее на новый адрес. Обратите внимание, что результатом перевода можно воспользоваться только в том случае, если этого еще никто не сделал! Если такой совпадающий адрес возникнет, когда настоящий владелец уже использовал выход транзакции для создания следующей транзакции, то неприятностей не будет. Вероятностью возникновения коллизии можно смело пренебречь, если сумма невелика и будет использована достаточно оперативно. Но если делаются значительные накопления и надолго, то может возникнуть желание защититься даже от незначительной опасности. Такая защита возможна: протокол предусматривает задание условия получения выхода транзакции достаточно произвольно. Условием доступа к выходу транзакции может быть не только совпадения Bitcoin-адреса, но и нечто более сложное, например, подписи нескольких ключей и др.

    Небезынтересен и вопрос, что будет, если ключ утерян (например, утерян файл wallet.dat и нет резервной копии или произошли какие-нибудь другие драматические события). Все деньги, для получения которых нужны утерянные секретные ключи, будут потеряны безвозвратно. То есть количество денег в системе не только нарастает, в результате вознаграждений за генерацию блоков, но и убывает, в результате несчастных случаев (вот почему так важно, чтобы по ошибке переводы не совершались на несуществующие адреса. Вот почему на контрольные разряды выделено целых 32 бита).