Текст книги "Адам Теппер. Биткойн – деньги для всех (ЛП)"
Автор книги: Адам Теппер
Жанр:
Банковское дело
сообщить о нарушении
Текущая страница: 3 (всего у книги 7 страниц)
Глава седьмая. Хеширование
В Главе четвертой мы рассмотрели, как биткойны генерируются и вводятся в экономику. Мы объяснили, что биткойны генерируются примерно каждые десять минут в ходе решения математической задачи. В этой главе мы рассмотрим более подробно, как это работает. Чтобы разобраться в добыче биткойна, нам нужно познакомиться с другой идеей из компьютерных наук: это хеширование, или криптографический хеш.
Хеширование – это очень интересная концепция, которая, как и асимметричная криптография, является одной из ключевых идей в сфере безопасности программного обеспечения. Как мы делали ранее, давайте начнем с представления задачи. Если у меня есть компьютерная система, как я мог бы безопасно хранить пароль каждого пользователя таким образом, что если система будет скомпрометирована, то пользовательские пароли – не будут? Другими словами, по очевидным причинам это плохая идея – хранить базу данных, содержащую тысячи или миллионы пользовательских паролей.
Решение этой задачи включает в себя криптографический хеш. Процесс хеширования получает нечто на вход, например, пароль, и пропускает эти входные данные через алгоритм, который выводит большое число, называемое «хеш». Хеш определяют две отличительные особенности. Во-первых, для одних и тех же входных данных процесс хеширования всегда возвращает одинаковый результат. Например, если вы вводите пароль, который пропускается через алгоритм хеширования, генерирующий определенное число, то каждый раз будет генерироваться одно и то же число. Во-вторых, хеширование – это однонаправленный процесс. Невозможно взять значение хеша и при помощи обратной разработки раскрыть, что было на входе. Эти два свойства и определяют криптографический хеш. Если бы процесс был обратим, он назывался бы не хешированием, а старым добрым шифрованием/дешифрованием, и это совершенно другая тема.
Оказывается, процесс хеширования значений имеет множество полезных особенностей в приложении к компьютерным наукам. Одной из задач, которые мы предлагали выше, была задача о безопасном хранении пользовательских паролей в системе. Вместо того, чтобы хранить пароль пользователя, мы сперва хешируем его пароль{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 % от общей вычислительной мощности биткойн-сети. Как вы можете видеть, это делает попытку двойной траты крайне сложной и дорогой, что прежде всего перевешивает, в общем случае, любые преимущества двойной траты. Вы также можете видеть, что по мере того, как растет биткойн-сеть, увеличивается количество майнеров и возрастает трудность хеш-задачи, двойная трата становится еще более сложной для нечестного майнера. Именно так биткойн-майнеры обеспечивают безопасность сети.
Резюмируя, добыча биткойна обеспечивает три вещи: обработку транзакций, безопасность сети и ввод биткойнов в экономику. Это изящная система.