По своей сути биткойн – это открытый протокол. Говоря «протокол», я имею в виду, что биткойн – это набор правил, которому должны соответствовать биткойн-программы. Говоря «открытый», я имею в виду, что протокол, или набор правил, находятся в публичном доступе, и любой может их проверить. Этот протокол позволяет биткойн-программам (которые мы обычно называем биткойн-клиентами) связываться друг с другом через интернет стандартизированным способом.
Тогда первым вопросом будет, если биткойн – открытый протокол, или набор правил, что удерживает людей от написания программ, нарушающих правила. Ответ – ничего. Кто угодно может написать программу, которая использует протокол Биткойн и связывается с другими биткойн-программами через интернет и пытается «нарушить правила» в свою пользу, однако клиенты, которые не соответствуют протоколу, просто игнорируются другими клиентами.
В качестве аналогии представьте игроков в шахматы по почте, когда игроки находятся в разных местах и их ходы отправляются в письмах. Оба игрока знают, как выглядит доска целиком, и любой из них может ходить, как захочет, если его ход соответствует шахматным правилам. В противном случае другой игрок игнорирует или отвергает этот ход. Тот же принцип лежит в основе биткойна: любой из «игроков» (биткойн-клиентов) точно знает, как выглядит «доска» (блокчейн), и может самостоятельно проверить по другим источникам, что любой «ход» другого (транзакция) является верным.
Если мы хотим понять биткойн на более глубоком, чем аналогия, уровне, то мы должны уяснить идею асимметричного шифрования (также известного как шифрование с открытым ключом). Асимметричное шифрование – это ключевой элемент биткойна, и без него биткойн не мог бы существовать. Идея асимметричного шифрования не нова, и фактически оно является составной частью безопасности многих программных систем. Мы используем асимметричное шифрование каждый раз, когда посещаем безопасный (SSL) сайт, например, сайт интернет-банка.
Прежде чем я объясню, что такое асимметричное шифрование, давайте представим такую задачу. Скажем, Алиса в Австралии хочет отправить письмо Бобу в Англию. Содержимое письма – большой секрет. Как Алисе послать письмо Бобу без риска, что по дороге кто-нибудь прочитает это письмо? Без асимметричной криптографии достичь этого можно только единственным способом, когда Алиса и Боб изначально понимают, как закодировать письмо. Тогда письмо будет зашифровано, и Боб будет знать, как его расшифровать, когда он его получит. Но что если у Алисы и Боба нет заранее подготовленного ключа для шифра; что если Боб никогда до этого не встречал Алису? В таких обстоятельствах без асимметричного шифрования Алиса не сможет безопасно отослать письмо Бобу.
Таким образом, это приводит нас к асимметричной криптографии и тому способу, которым она решает эту задачу. Некоторое время назад несколько талантливых математиков разработали способ, при помощи которого можно генерировать пары ключей, математически связанных друг с другом. В этом контексте можно представлять ключ как очень большое число – число с несколькими сотнями цифр{6}. Эти ключи называются «открытый ключ» и «закрытый ключ», или вместе — асимметричные ключи. Оказывается, у этих ключей есть несколько очень полезных свойств!
Используя открытый ключ, можно зашифровать сообщение таким образом, что его будет возможно расшифровать только закрытым ключом. Таким образом, Боб может теперь сгенерировать пару ключей и передать всему миру свой открытый ключ, поскольку из него невозможно{7} получить его закрытый секретный ключ. Если Алиса хочет послать Бобу безопасное сообщение, она просто должна зашифровать содержимое своего письма открытым ключом Боба при помощи известного алгоритма, и Боб сможет расшифровать сообщение своим закрытым ключом, который он не показывает никому другому.
Вы используете технологию асимметричной криптографии каждый день, когда используете Wi-Fi, Bluetooth или безопасные вебсайты, где данные зашифрованы, чтобы предотвратить то, что называется атакой «человек посередине». Другими словами, асимметричная криптография используется, чтобы предотвратить перехват вашей беседы, письма или транзакции кем-либо еще.
Итак, теперь мы знаем, как Алиса может безопасно послать письмо Бобу, но, когда Боб получит письмо, как он может быть уверен, что письмо отправила Алиса, а не кто-нибудь другой? Оказывается, асимметричные ключи могут решить и эту проблему. Алиса также генерирует пару ключей: открытый и закрытый ключ. Как и Боб, Алиса раскрывает свой открытый ключ всему миру. Алиса может подписать содержимое письма «цифровой подписью», используя свой закрытый ключ. Затем, используя открытый ключ Алисы, Боб может определить, что письмо действительно было подписано Алисой, поскольку никто другой не может подписать письмо без доступа к закрытому ключу Алисы. Таким образом, письмо Алисы может прочитать только Боб, и Боб может удостовериться, что письмо написала именно Алиса.
Это очень полезная и мощная идея – она до сих пор впечатляет меня сегодня, несмотря на повседневное ее использование. Вы можете оценить ее полезность для военных коммуникаций, и, на самом деле, многие годы Соединенные Штаты пытались остановить экспорт программ, которые используют сильную асимметричную криптографию.
Рис. 2. Асимметричное шифрование. Алиса посылает подписанное зашифрованное сообщение Бобу.
Теперь, когда мы понимаем принцип работы асимметричной криптографии, как это относится к биткойну? Помните, в Главе третьей мы проводили аналогию и говорили, что в некоторых отношениях биткойн работает по принципу чековой книжки? Мы говорили, что один пользователь послал биткойны на биткойн-адрес другого пользователя, и что транзакция была подписана отправителем транзакции. Это и есть та точка, где все начинает соединяться: дело в том, что биткойн-адрес – это производная открытого ключа.
Давайте рассмотрим наш изначальный пример с чековой книжкой более подробно, поскольку теперь мы понимаем идею открытого ключа. У меня есть 50 биткойнов на моем мобильном телефоне, и я хотел бы отправить их на мобильный телефон моего друга Джо. Сперва Джо нажимает кнопку на своем телефоне, чтобы сгенерировать новый биткойн-адрес. Хотя, на самом деле, он создает пару асимметричных ключей. Закрытый ключ хранится на телефоне Джо, а производная от открытого ключа (биткойн-адрес) отображается на экране и затем пересылается мне. Используя биткойн-адрес Джо, я начинаю транзакцию на своем телефоне, указывая сумму, которую хочу отправить ему. Затем я подписываю эту транзакцию цифровой подписью, используя мой закрытый ключ, и отправляю транзакцию в интернет. Помните, мы говорили, что выписать чек – это то же самое, что написать в банк письмо, разрешающее банку выделить средства с моего счета указанному человеку. В случае с биткойном, транзакция, в сущности, является публичным объявлением о передаче контроля над XBT 50, зарегистрированными на мой адрес, биткойн-адресу, который я указываю. Только мой закрытый ключ позволяет мне разрешить передачу биткойнов на адрес Джо, и я даю это разрешение, когда подписываю транзакцию цифровой подписью.
Когда транзакция отправлена, Джо может подтвердить в биткойн-сети, что у него есть право потратить эти биткойны – транзакция окончательная. Разумеется, несмотря на все эти технические шаги, все это происходит автоматически, за кулисами, посредством нажатия нескольких кнопок на телефоне.
Рис. 3. Адам посылает Джо биткойны через биткойн-сеть
В Главе четвертой мы рассмотрели, как биткойны генерируются и вводятся в экономику. Мы объяснили, что биткойны генерируются примерно каждые десять минут в ходе решения математической задачи. В этой главе мы рассмотрим более подробно, как это работает. Чтобы разобраться в добыче биткойна, нам нужно познакомиться с другой идеей из компьютерных наук: это хеширование, или криптографический хеш.
Хеширование – это очень интересная концепция, которая, как и асимметричная криптография, является одной из ключевых идей в сфере безопасности программного обеспечения. Как мы делали ранее, давайте начнем с представления задачи. Если у меня есть компьютерная система, как я мог бы безопасно хранить пароль каждого пользователя таким образом, что если система будет скомпрометирована, то пользовательские пароли – не будут? Другими словами, по очевидным причинам это плохая идея – хранить базу данных, содержащую тысячи или миллионы пользовательских паролей.
Решение этой задачи включает в себя криптографический хеш. Процесс хеширования получает нечто на вход, например, пароль, и пропускает эти входные данные через алгоритм, который выводит большое число, называемое «хеш». Хеш определяют две отличительные особенности. Во-первых, для одних и тех же входных данных процесс хеширования всегда возвращает одинаковый результат. Например, если вы вводите пароль, который пропускается через алгоритм хеширования, генерирующий определенное число, то каждый раз будет генерироваться одно и то же число. Во-вторых, хеширование – это однонаправленный процесс. Невозможно взять значение хеша и при помощи обратной разработки раскрыть, что было на входе. Эти два свойства и определяют криптографический хеш. Если бы процесс был обратим, он назывался бы не хешированием, а старым добрым шифрованием/дешифрованием, и это совершенно другая тема.
Оказывается, процесс хеширования значений имеет множество полезных особенностей в приложении к компьютерным наукам. Одной из задач, которые мы предлагали выше, была задача о безопасном хранении пользовательских паролей в системе. Вместо того, чтобы хранить пароль пользователя, мы сперва хешируем его пароль{8} и храним значение хеша. Когда пользователь пытается в следующий раз войти в систему при помощи пароля, нам не нужно знать, каким был его пароль, мы только должны знать, что пароль совпадает с тем, что был введен в прошлый раз. Другими словами, если хеш введенного пароля совпадает с хешем, хранящимся в базе данных, мы знаем, что пользователь ввел правильный пароль – хотя мы не знаем и не хотим знать, что это был за пароль. Если позже наша система будет скомпрометирована, атакующий получит только список хешей паролей, необратимых и не имеющих никакой ценности.
Если вы похожи на меня, этот процесс покажется вам очаровательным, но вы, вероятно, спросите себя – если пароли хешируются, как же получается, что если вы забыли пароль к определенной системе, то компания может выслать вам его по электронной почте. Это очень хороший вопрос. Это означает, что у них пароли не хешируются, и эта система крайне небезопасна. Печально, но многие системы сегодня допускают это. Это одна из причин, по которым нужно использовать разные пароли для каждой из систем, к которым вы имеете доступ. Когда в новостях обнаруживается, что система была «хакнута» и тысячи паролей скомпрометированы, это случается потому, что проектировщики системы не смогли обеспечить безопасность пользовательских паролей с помощью техники хеширования, которая повсеместно считается наилучшим подходом.
Ради интереса заметим, что, если вы забыли пароль к системе, которая надлежащим образом хеширует пароли пользователей, правильный подход – это сброс пароля системой, когда пароль заменяется каким-нибудь временным значением, что позволяет вам поменять его на что-нибудь другое, когда вы войдете в систему. Однако, надо заметить, что такой подход не гарантирует, что система на самом деле хеширует пароли.
Теперь, каким образом все это относится к добыче биткойна? Ну, мы сказали, что обратная разработка хеша невозможна. Технически говоря, теоретически она возможна посредством того, что называется атака «грубой силой» – перебор всех возможных входных комбинаций до тех пор, пока не получится такой же хеш. Однако, на практике количество комбинаций астрономически велико, что делает такую атаку невозможной в практических целях. Также нужно заметить, что разные входные значения могут выдать в результате одинаковое значение хеша, это явление называется коллизией и случается крайне редко, если использовать правильный алгоритм хеширования, так что для нашего обсуждения здесь это неважно.
Теперь давайте предположим, что есть только миллион возможных значений хеша, число между нулем и миллионом. В реальности, конечно, мы знаем, что возможно гораздо больше миллиона значений хеша, но давайте продолжим с миллионом, чтобы проиллюстрировать мою мысль. Таким образом, шансы правильно угадать верные входные данные для данного хеша будут один к миллиону. Имея достаточное количество попыток и достаточное время, в конце концов я найду исходные данные, которые после хеширования дадут значение, которое я пытаюсь подобрать.
Давайте предположим, что процесс проб и ошибок занимает двадцать четыре часа чтобы найти совпадение (современный домашний компьютер сделает миллион итераций меньше, чем за секунду, но давайте оставим двадцать четыре часа для нашего примера). Помня, что в нашем примере мы сказали, что все значения хеша – это числа между нулем и миллионом, давайте предположим, что вместо нахождения входных данных, которые дадут определенное значение хеша, мы хотели бы найти входные данные, хеширование которых даст число, меньшее или равное 10. То есть, мы хотим найти любой вход, который даст в результате значение хеша 1, 2, 3, 4, 5, 6, 7, 8, 9 или 10. В этом случае в десять раз более вероятно, что полученное нами значение хеша подойдет, поэтому наш компьютер найдет совпадение в среднем в десять раз быстрее – теперь потребуется примерно 2,4 часа вместо 24 часов.
Если бы я хотел создать задачу, которая будет решаться быстрее, скажем, решаться за 10 минут, я бы поднял ограничение до любого хеша между 1 и 150. Задача теперь в 150 раз проще, чем в первом примере, и быстрый подсчет покажет, что такая задача должна решаться нашим (медленным) компьютером примерно за 10 минут. Что случится, если второй, настолько же мощный компьютер подключится к попыткам найти решение задачи? Теперь ее можно будет решить в два раза быстрее. Если я хочу, чтобы решение все равно занимало 10 минут, я должен буду сделать задачу в два раза труднее, задав условие, что значение хеша должно быть теперь меньше 75, а не 150. По мере того, как все больше компьютеров подключаются к решению задачи, и они все эффективнее начинают решать задачу, мы делаем ее более сложной, задавая меньший диапазон приемлемых значений хеша.
И, если вы до сих пор не догадались, это и есть задача, которую биткойн-сеть предлагает биткойн-майнерам. Разница, конечно, в том, что существует гораздо больше миллиона комбинаций, числа так велики, что их так просто и не назовешь. Все биткойн-майнеры мира в то время, пока я пишу этот текст, коллективно обрабатывают примерно 350 000 000 000 000 000 входных значений в секунду в попытке найти то самое значение, хеш которого попадет в определенный диапазон значений хеша.
Биткойн-сеть регулярно оценивает сложность задачи, и, если задача решается быстрее или медленнее, чем за установленный интервал 10 минут, тогда задача соответствующим образом подстраивается посредством расширения или сокращения диапазона приемлемых значений хеша. Из всех компьютеров мира, пытающихся решить задачу, только первый решивший получает биткойны «в награду», и процесс начинается заново. Следующий вопрос тогда: как остальная биткойн-сеть подтверждает, что задача была решена, и каким образом в этом процессе генерируются биткойны? Первый вопрос простой. Компьютер, который решил задачу, объявляет об этом решении биткойн-сети, и другие компьютеры проверяют решение. Хотя обратная разработка входного значения для данного диапазона значений хеша – это медленный процесс проб и ошибок, но как только решение найдено, его легко проверить, просто пропустив предложенное решение через алгоритм хеширования и убедившись, что результирующее значение хеша попадает в заданный диапазон. Затем добытые биткойны выдаются на определенный майнером адрес, вводя новые биткойны в экономику. Так же, как монархи в старину выпускали тэлли под налоги, которые никогда не будут собраны, и банки выпускали банкноты под средства, которых у них не было, биткойн-сеть медленно генерирует новые биткойны. Ключевая разница между биткойном и другими системами, однако, состоит в том, что во всех предыдущих системах частота генерации валюты устанавливалась по прихоти монарха, правительства, банка или, в последние времена, контролируемого правительством центрального банка. Частота генерации биткойна устанавливается алгоритмически и не может быть предметом манипуляций участников рынка – она предопределена. Частота генерации определяется протоколом Биткойн и со временем понижается, пока в конце концов биткойны не перестанут генерироваться вообще. Для любой даты в прошлом или будущем можно подсчитать примерное количество биткойнов в обращении.
Рис. 4: Распределение биткойнов по времени
Давайте ненадолго возьмем паузу на предыдущем направлении мысли, и обратимся к децентрализации. Децентрализация – относительно недавняя концепция в компьютерном знании, которая находит все больше применений за последнее десятилетие. Одним из первых примеров децентрализации стал пиринговый (P2P) файлообмен. За прошедшие годы существовало много его реализаций, наиболее распространенной из которых сейчас является сеть торрентов. Если вы незнакомы с торрентами, позвольте дать краткое введение. Традиционный метод загрузки файлов из интернета довольно прост. Один компьютер (сервер) хранит файл, который вам нужен, а другой компьютер (клиент) запрашивает этот файл с сервера, и сервер передает файл клиенту. Эта модель до сих пор преобладает сегодня, и большую часть времени, которое вы проводите в интернете, работает так, как описано. Кстати, эта модель называется клиент-серверной. Однако, у нее есть некоторые ограничения. Одно из этих ограничений состоит в том, что файл нельзя загрузить быстрее, чем позволит сервер. Обычно это не проблема, но что если есть миллион человек, которые хотят загрузить с сервера один и тот же файл? Пропускная способность сервера ограничена, вследствие чего этот ограниченный канал должен быть поделен между всеми людьми, загружающими файл. Кстати, отдельный сервер не может поддерживать миллион соединений, так что понадобится ферма из серверов, содержащих файл, что приведет к большим затратам для владельца серверов, или маленькой скорости для клиентов, загружающих файл.
Здесь может помочь распределенная пиринговая сеть. Она работает следующим образом: скажем, у меня есть файл, который я хочу сделать доступным для других людей. Используя P2P-программу, этот файл делится на сотни частей (точный размер и количество частей зависит от многих факторов). Теперь люди могут загружать файл с моего компьютера по одной части за раз в любом порядке. Пропускная способность с моей стороны невелика, так что изначально это будет довольно медленно для тех нескольких человек, которые попытаются загрузить этот файл с моего компьютера. Если кто-либо другой получил от меня одну из частей файла, остальные люди могут теперь загрузить эту часть либо с меня, либо с другого участника сети. Со временем все больше и больше народу загружает одни части файла с моего компьютера, а другие – с компьютеров других людей, до тех пор, пока первоначальный файл не окажется распределен между компьютерами множества людей. Если приходит кто-то новый и хочет загрузить этот файл, программа будет одновременно загружать файл со множества разных компьютеров, возможно, никогда больше не соединяясь с моим компьютером, на котором файл находился изначально – в сущности, в этот момент я могу вообще выключить свой компьютер, и, при условии, что в интернете находится полная копия файла, люди будут продолжать его загрузку беспрепятственно. Эта система показала себя очень успешной для файлов, пользующихся большим спросом. В последнее время мы можем видеть, что децентрализованный подход применяется в программных продуктах, для которых он изначально не задумывался, и наиболее свежим примером является блокчейн.
Мы рассмотрели и обсудили три основные идеи из области компьютерных наук, лежащие в основе биткойна: асимметричную криптографию, криптографический хеш и пиринговые сети. Хоть эти идеи и интересны, они не революционны в контексте биткойна. Все эти вещи уже применялись в различных вариантах долгое время. Однако, то, что связывает их воедино – это фундаментально новая идея, являющаяся основой биткойна. Эта идея известна как блокчейн.
Блокчейн – это децентрализованный открытый гроссбух: давайте попробуем в этом разобраться. В случае обычного бизнеса, или, скажем лучше, банка, гроссбухом называют набор записей, который содержит подробности пользовательских транзакций и балансы счетов. В современных банках эти записи хранятся в больших программных системах. Как вы, вероятно, можете догадаться, это большие устойчивые системы, которые должны поддерживать миллионы пользователей, ежедневно осуществляющих миллионы транзакций. Возможно, вам уже знакомы некоторые из симптомов тех трудностей, которые испытывают банки с надежным управлением столь большими наборами данных. Например, вам не удавалось загрузить с интернет-портала вашего банка историю транзакций ранее некоторого периода в прошлом. Или, возможно, вы замечали, что некоторые транзакции не сразу появляются в истории, пока они не будут обработаны ночью. Все эти и другие похожие странности являются компромиссами, необходимыми для того, чтобы банки могли управлять этими (часто древними) системами, содержащими огромные объемы данных.
Мы сказали, что блокчейн – это децентрализованный открытый гроссбух. Мы знаем, что такое гроссбух: это набор записей, содержащих подробности пользовательских транзакций и балансы счетов. Теперь давайте объясним, что мы имеем в виду под «децентрализованным» и «открытым». В отличие от банка этот гроссбух не хранится на центральном сервере, контролируемом каким-либо человеком или организацией. Блокчейн-гроссбух доступен публично и хранится локально множеством клиентов, его можно свободно загрузить из интернета. В это может быть трудно поверить, но вы поняли правильно: вся история любых биткойн-транзакций, сделанных кем угодно по всему миру с самого появления биткойна 12 января 2009 года, публично доступна для просмотра любому человеку, к тому же на большинстве компьютеров или ноутбуков, где есть биткойн-программы, хранятся копии этого гроссбуха. Вероятно, у вас появилось много вопросов, например, как это возможно, или почему это вообще хорошая идея. Давайте начнем с того, как это возможно. Конечно, это большой объем данных, но не невозможно большой. Финансовые записи занимают очень немного места, и объективно глядя, все записи о биткойн-транзакциях с самого начала на момент написания этого текста занимают тот же объем места, что и дюжина, или около того, фильмов в HD-качестве. Если вы загрузите биткойн-клиент, который хранит локальную копию блокчейна, потребуется много времени, чтобы начать в первый раз, когда вы его запустите, поскольку он загружает полную копию блокчейна. Другое дело, что хранение полной копии блокчейна на всех компьютерах мира не является абсолютно необходимым. Это определенно невозможно на мобильных устройствах, и сейчас в тренде биткойн-клиенты, которые хранят локально только важные вещи, а не весь блокчейн. Тем не менее, это иллюстрирует мое утверждение о том, что блокчейн публично доступен всему миру, и фактически существует множество сайтов, которые упрощают навигацию по истории всех биткойн транзакций, сделанных кем угодно и когда угодно.
Вас, возможно, несколько обеспокоит тот момент, что, если вы будете использовать биткойн, вся история когда-либо сделанных вами транзакций будет публично доступна. Это только частично правда, и мы обсудим этот момент далее, в главе об анонимности. Публичный гроссбух содержит только биткойн-адреса и суммы. В нем нет какой-либо личной или опознаваемой информации. Другими словами, если я посылаю 50 биткойнов с адреса А моему другу Джо с адресом Б, весь мир видит, что 50 биткойнов отправлены с адреса А на адрес Б, но никто не может определить, что адрес А принадлежит мне и адрес Б принадлежит Джо. Так что, когда я гляжу на блокчейн, все, что я вижу – это балансы адресов и транзакции с одного адреса на другой – ничто из этой информации не ставит под удар конфиденциальность людей, осуществляющих эти транзакции.
Другой момент, который необходимо понять, и который мы еще не обсуждали, состоит в том, что, в отличие от электронной почты, где вы можете иметь только один адрес, или, по крайней мере, небольшое количество адресов, количество биткойн-адресов, которые могут быть у человека, не ограничено. Фактически это поощряется, и большинство биткойн клиентов настроены по умолчанию таким образом, чтобы каждая транзакция использовала новый адрес. Давайте еще раз рассмотрим пример отправки 50 биткойнов моему другу Джо, сейчас мы уже знаем немного больше. Когда я прошу Джо сказать мне его биткойн-адрес, он, как правило, не называет мне адрес, содержащий всю сумму его богатства, а создаст абсолютно новый адрес, на котором вообще нет биткойнов, и я отправляю 50 биткойнов на этот новый адрес. Биткойн-программы не требуют от вас управления балансом каждого адреса индивидуально, они могут показать вам общий баланс всех адресов, которые вы когда-либо создавали. Если взглянуть на дело с моей стороны, вряд ли у меня есть адрес, содержащий точную сумму денег, которую я хочу отослать Джо. Например, у меня может быть биткойн-адрес А, на котором есть 30 биткойнов, и биткойн-адрес Б с 35 биткойнами. В нашем примере программа автоматически сгенерирует транзакцию, которая возьмет 30 биткойнов с адреса А, потом 20 – с адреса Б, отправит эти 50 биткойнов на адрес Джо, а также отправит оставшиеся 15 биткойнов на новый адрес В, который она автоматически сгенерировала для меня. И у Джо, и у меня могут быть сотни или тысячи адресов, содержащих маленькие суммы денег, которые вместе составляют наше полное биткойн-состояние. Ни один из нас не может видеть адресов другого, кроме тех, которые используются в транзакции.
Исключением из этого правила будет случай, когда я получаю одну транзакцию на большую сумму денег, скажем, миллион долларов в биткойнах. Если после этого я захочу потратить 1 биткойн с этого адреса, получатель сможет увидеть, что я имею в своем распоряжении около миллиона долларов в биткойнах, что я не хотел бы раскрывать. Достаточно сказать, что для счастливчиков, оказавшихся в таком положении, существуют техники, позволяющие скрыть это богатство, разбрасывающие деньги по множеству адресов – современные программы делают этот процесс тривиальным.
Теперь, когда мы знаем, что такое блокчейн, как он на самом деле работает? Вопрос, возможно, стоит сформулировать так: как мы можем обеспечить непротиворечивую запись транзакций в децентрализованном окружении? Первое, что нужно понять о блокчейне, это то, что он называется блокчейном потому, что состоит из цепочки последовательных блоков. Блок – это группа транзакций. Угадайте, с какой частотой генерируются блоки? Примерно раз в 10 минут. Наверное, вы начали понимать, что существует связь между блокчейном и добычей биткойна, и если вы предположили это, вы правы.
Помните, в Главе четвертой мы сказали, что добыча биткойна помимо введения биткойнов в экономику преследует также две других цели. Она обеспечивает обработку платежей и безопасность сети. Давайте теперь рассмотрим, каким образом эти задачи выполняются в процессе добычи биткойна. Выше мы упоминали, что, когда транзакция начата, она отправляется в биткойн-сеть. Что это означает на самом деле? Биткойн-клиенты (то есть программы) пытаются соединиться со множеством других биткойн-клиентов, которые называют «пиры». Обычно каждый отдельный клиент соединен с 8-20 другими пирами. Некоторые из этих пиров – обычные пользователи, осуществляющие транзакции, и небольшое число этих пиров могут быть майнерами. Когда биткойн-клиент получает сведения о биткойн-транзакции, они передаются от клиента к клиенту до тех пор, пока через короткий промежуток времени не будут получены одним или несколькими биткойн-майнерами.
Биткойн-майнеры делают ещё кое-что помимо решения хеш-задачи и введения биткойнов в экономику: они обеспечивают важную функцию создания блокчейна по одному блоку за раз. Когда биткойн-майнер получает сведения о транзакции, сперва проверяется ее подлинность, и затем она записывается в блок локально, на компьютере биткойн-майнера. Если биткойн-майнер успешно решил задачу, решение задачи включается в блок как его часть вместе со всеми транзакциями, созданными за прошедшие 10 минут. Затем блок закрывается, распространяется по интернету, и процесс начинается заново. Любой другой в сети может независимо проверить, что транзакции в блоке подлинные и что решение хеш-задачи, известное также как «доказательство работы», верно. Любые последующие майнеры, которые решили задачу, игнорируются, их блоки больше не подходят, и процесс начинается заново. Таким образом блокчейн – это последовательность блоков, содержащих транзакции за данный десятиминутный период. Каждый блок математически связан с предыдущим блоком, так что можно тривиальным (для компьютера!) образом проверить весь блокчейн на достоверность, не анализируя при этом отдельные транзакции.
И это приводит нас к третьей цели, которой достигают биткойн-майнеры: безопасности сети. Действия, предпринимаемые для решения криптографической хеш-задачи, служат не только интересам майнера, они также нужны для защиты от нечестных майнеров, расходующих деньги дважды, что называют «двойной тратой». Если взять более ранний пример, где я посылаю 50 биткойнов Джо, пусть взамен Джо присылает мне книгу, которую я у него купил (по сегодняшним ценам это была бы довольно дорогая книга). В то же время, что если я попробую отправить те же самые 50 биткойнов другому человеку перед тем, как первая транзакция успела стать обработанной и проверенной? Предполагая, что я уже получил товар от Джо, будет проблематично, если биткойн-сеть каким-то образом примет мой платеж другому участнику и позже отклонит изначальный платеж, который я отправил Джо. Децентрализованная добыча биткойна решает эту проблему.
Когда я отправляю транзакцию для Джо в биткойн-сеть, Джо почти мгновенно сможет ее увидеть (обычно через несколько секунд). В это время транзакция видна, но еще не включена в блок майнером. Если это транзакция с небольшой суммой, или транзакция между участниками, которые доверяют друг другу, видимость транзакции в сети будет обычно считаться приемлемой, однако, при определенных усилиях с моей стороны, все еще возможно дважды потратить средства, отправив в сеть другую транзакцию, которая использует те же самые средства – но для транзакций с небольшой суммой требуемые усилия, вероятно, не будут стоить затраченного времени (к тому же, разумеется, есть еще и риск быть пойманным). По прошествии приблизительно 10 минут мы можем ожидать, что моя транзакция будет теперь официально включена биткойн-майнером в последний блок блокчейна. В этом момент транзакция имеет «одно подтверждение». Теперь, если вы примете во внимание, что в мире тысячи специальных компьютеров, добывающих биткойн, вероятность, что я сумею обмануть Джо: дважды потратить свои средства и успешно добыть блок, который отвергнет транзакцию для Джо, очень мала. Для транзакций со средними или большими суммами обычно считается благоразумным подождать 3-6 подтверждений, или, другими словами, подождать, когда будут добыты 3-6 последовательных блоков (от 30 до 60 минут), чтобы быть абсолютно уверенным в транзакции. Чтобы успешно осуществить двойную трату, в этом случае нужно будет успешно добыть подряд 6 блоков, отклоняющих транзакцию. Чтобы достичь этого, нужно контролировать примерно 50 % от общей вычислительной мощности биткойн-сети. Как вы можете видеть, это делает попытку двойной траты крайне сложной и дорогой, что прежде всего перевешивает, в общем случае, любые преимущества двойной траты. Вы также можете видеть, что по мере того, как растет биткойн-сеть, увеличивается количество майнеров и возрастает трудность хеш-задачи, двойная трата становится еще более сложной для нечестного майнера. Именно так биткойн-майнеры обеспечивают безопасность сети.
Резюмируя, добыча биткойна обеспечивает три вещи: обработку транзакций, безопасность сети и ввод биткойнов в экономику. Это изящная система.
Настало время указать на тот факт, что у майнера есть выбор, включать или не включать транзакцию в блок. Майнер может отклонять все транзакции, если хочет, и просто решать хеш-задачу. Это называется «добыча пустого блока» и время от времени случается. Тогда вопрос в том, зачем майнеру вообще беспокоиться о том, чтобы включать транзакции в блок? Есть несколько причин. Во-первых, по сравнению с работой, которую майнер делает, пытаясь решить хеш-задачу, включение транзакций в блок – это тривиальная операция, которая почти ничего не требует от его компьютера. Во-вторых, транзакции включаются в блокчейн в интересах биткойн-сообщества. Если майнеры не будут включать транзакции в блокчейн, биткойн не будет работать, а если он не будет работать, то биткойны ничего не будут стоить. Если же биткойн ничего не будет стоить, тогда майнеры будут тратить все свои усилия на добычу чего-то, что ничего не стоит. Вы можете возразить, что для сообщества хорошо, чтобы майнеры включали транзакции в блок, но для индивидуального майнера убыточно тратить ресурсы на обработку транзакций. Это отчасти верно, но, как я заметил в начале абзаца, необходимые усилия ничтожны. Существует также и третий момент. Майнеры не могут брать комиссию за включение транзакции в блок, но люди, осуществляющие транзакции, могут добровольно предложить комиссию. Майнеры тогда могут отклонять транзакции, которые вообще не включают комиссии, или отклонять транзакции с комиссией ниже определенной величины. Какова же обычная комиссия сегодня? В большинстве случаев она нулевая. В сегодняшней экономике стимулом майнера в первую очередь являются биткойны, которые он получает за успешно добытый блок. Транзакции включаются в блок по доброй воле майнеров в интересах роста биткойн-экономики и роста биткойна. В некоторых случаях биткойн-клиенты автоматически включают небольшую комиссию (не больше нескольких центов), чтобы удостовериться, что транзакции не будут отклонены майнерами и с большей вероятностью будут включены в следующий добытый блок.
С течением времени количество биткойнов, получаемых за успешно добытый блок, будет постепенно уменьшаться, пока, примерно в 2140 году, награда за добычу блока не окажется нулевой. Ожидается, что за этот долгий период времени, пока вознаграждение за блок как стимул для добычи биткойна постепенно уменьшается, этот стимул будет постепенно частично заменяться и, в конце концов, будет вытеснен стимулом в виде комиссий за транзакции.
Благодаря тому факту, что биткойн-экономика – это открытый рынок, и что комиссии за транзакции добровольны, величина комиссии всегда будет определяться спросом и предложением, что создаст конкурентоспособный рынок с низкими комиссиями за транзакцию.
TL;DR: известное сленговое выражение, означающее «слишком длинно; не читал». Это краткое резюме в конце длинного текста, содержащее его сокращенную версию. Однако, к сожалению, если вы открыли эту главу, не прочитав предыдущие главы второй части, где в общих чертах описаны ключевые принципы компьютерных наук, лежащие в основе биткойна, тогда вам будет трудно понять эту главу, и в своем понимании биткойна в дальнейшем вы останетесь на уровне сравнений по аналогии. Если вы прочитали Часть II, то эта глава нужна, чтобы собрать все эти идеи вместе в ясное понимание биткойна.
Сперва мы узнали, что асимметричная криптография – это технология, лежащая в основе закрытых и открытых ключей; используя это отношение, мы можем математически проверить достоверность биткойн-транзакции, подписанной закрытым ключом отправителя. Затем мы узнали о криптографическом хеше, который является необратимым алгоритмом, применяемым к некоторым данным. Методом проб и ошибок (более квадрильона попыток в секунду) майнеры в биткойн-сети пытаются вычислить криптографический хеш для случайных данных до тех пор, пока результирующее значение хеша не попадет в предзаданный диапазон – задача, спроектированная таким образом, чтобы решаться в среднем за десять минут всей биткойн-сетью. Трудность этой задачи с одной стороны защищает сеть от «двойных трат», а с другой стороны контролирует поставку биткойна. В дополнение биткойн-майнеры также обрабатывают транзакции, формирующие блок. Если майнер успешно добудет блок (решив криптографическую хеш-задачу), этот блок будет распознан биткойн-сетью и навсегда включен в блокчейн – открытый децентрализованный гроссбух биткойна. Это кратчайшее описание того, как работает эта сложная и изящная система.