Двойная трата? Как же на самом деле устроен протокол биткоин

Статей, объясняющих, что же такое Биткоин, написано великое множество. Большинство из них поверхностно рассказывают суть криптографического протокола, опуская при этом многие детали. Мы же, начиная c основных принципов, пройдем путь от широкого теоретического объяснения работы протокола до детального рассмотрения данных в Биткоин-транзакциях. Мы создадим свою, сначала очень простую, цифровую валюту, назовем ее «Инфокоин». По ходу статьи мы будем сталкиваться с проблемами, вроде «как сделать так, чтобы предотвратить двойную трату одних и тех же средств» или «как защититься от подделки» и т.д. Решая эти задачи, мы постепенно будем усложнять нашу криптовалюту и в итоге придем к реализации Биткоина. Мы откроем Биткоин заново!

Первые шаги: Подписание протокола о намерениях

На первый взгляд, цифровая валюта кажется чем-то невозможным. Но это только на первый взгляд. На самом деле, идеи, лежащие в основе криптовалюты просты и понятны.

Давайте представим себе стройную и красивую девушку, назовем ее Алиса. У нее есть цифровые деньги, которые выглядят как строка битов, нечто вроде этого: «2de95ed5d8be1f44889d331994081b7acca87782969bb658e98fc155438c71ca» (как этот бессмысленный набор букв и цифр может быть деньгами, пока не понятно, но не переживайте, по ходу статьи все станет ясно). Алиса хочет потратить эти деньги. Но здесь возникают проблемы безопасности, например она может использовать эту строку снова и снова или кто-то другой может легко подделать деньги Алисы, создав точно такую же строку.

top_page_hero-720x340

Эти проблемы – одни из многих задач, которые необходимо решить, для того, чтобы мы могли использовать информацию в качестве денег.

Для начала придумаем защиту от подделки. Предположим, Алиса хочет передать другому человеку, назовем его Боб, один инфокоин. Алиса создает сообщение «Я, Алиса, передаю Бобу один инфокоин», подписывает его своим цифровым ключом и заявляет о подписанной строке битов всему миру.

Такой прототип цифровой валюты не особо впечатляет, но у него есть свои достоинства. Любой человек в мире, в том числе и Боб, может с помощью открытого ключа Алисы проверить, что сообщение «Я, Алиса, передаю Бобу один инфокоин», действительно создано Алисой. Цифровая подпись, которую Алиса поставила на своем сообщении, дает некоторую защиту от подделки. Кроме того, эта же подпись не даст Алисе возможность сказать отказаться от своих слов. Таким образом, протокол устанавливает, что Алиса действительно намерена дать Бобу один инфокоин.

Конечно, после того, как Алиса отправила свое сообщение, другие люди смогут дублировать его, так что пока в некотором смысле подделка возможна. Но эти два свойства – установление намерения со стороны Алисы и ограниченная защита от подделки – очень важные особенности протокола.

А где же деньги? Что собственно является цифровыми деньгами, которые Алиса передает Бобу? А их фактически и нет. Деньги здесь – это последовательность битов. Это подписанное цифровой подписью сообщение: «Я, Алиса, передаю Бобу один инфокоин». В будущем все наши формы цифровых денег будут просто более содержательными сообщениями.

Делаем монеты уникальными: серийные номера

Проблема первой версии Инфокоина заключается в том, что Алиса может отправлять Бобу одно и то же подписанное сообщение много раз. Предположим, Боб получил 10 сообщений «Я, Алиса, передаю Бобу один инфокоин». Означает ли это, что Алиса отправила Бобу 10 инфокоинов? А может, ее сообщение было случайно продублировано? А вдруг она пыталась обмануть Боба, притворяясь, будто передала Бобу 10 монет, в то время как ее сообщение означает, что она передала только один инфокоин?

Чтобы избежать таких неоднозначностей, надо найти способ сделать монеты уникальными. Им нужен серийный номер. Тогда Алиса подпишет сообщение: «Я, Алиса, передаю Бобу один инфокоин, с серийным номером 8730348». Позже, Алиса может подписать сообщение «Я, Алиса, передаю Бобу один инфокоин, с серийным номером 2154634». В этом случае Боб (и все остальные) будут знать, что были переданы две разные монеты.

Теперь нам нужен надежный источник серийных номеров. Например, это может быть банк, который будет предоставлять идентификаторы для нашей валюты, отслеживать, у кого какие инфокоины и проверять сделки.

Теперь Алиса приходит в банк и говорит «Я хочу снять один инфокоин с моего счета». Банк уменьшает ее баланс на одну монету и присваивает ей новый, никогда ранее не использовавшийся серийный номер, например «1234567». Затем, когда Алиса хочет передать Бобу деньги, она подписывает сообщение «Я, Алиса, передаю Бобу один инфокоин, с серийным номером 1234567». Боб связывается с банком и проверяет, действительно ли инфокоин с этим серийным номером принадлежит Алисе и не потратила ли Алиса эту монетку. Если все в порядке, то Боб информирует банк о том, что принимает деньги от Алисы, а банк обновляет свои записи, и теперь инфокоин с серийным номером 1234567 принадлежит Бобу и не принадлежит Алисе.

Сам себе банк

banker-bitcoin01Вроде все хорошо, но смущает существование какой-то организации, которая контролирует все деньги. А что, если избавится от центрального банка? Что если распределить функции организации, отвечающей за валюту, между всеми участниками сети?

Предположим, что каждый пользователь Инфокоин хранит записи о том, кому какие монеты принадлежат. Это можно представить себе как что-то вроде открытого журнала, куда записываются все операции с валютой. Назовем эту книгу «цепочка блоков» или «blockchain» (именно так называется публичная запись транзакций в сети Биткоин).

Теперь, когда Алиса передает инфокоин с серийным номером 1234567 Бобу, он проверяет по своей копии цепочки блоков, действительно ли передаваемый инфокоин принадлежит Алисе. Если все в порядке, то Боб оповещает сеть о совершившейся сделке, и все остальные пользователи Инфокоин обновляют свои цепочки блоков, внося туда запись о том, что Алиса передала Бобу один инфокоин с номером 1234567.

Остается вопрос «откуда в этом случае берется серийный номер», но он на самом деле легко решаем, и мы расскажем об этом чуть позже. Есть более серьезная проблема у Алисы есть возможность несколько раз потратить одни и те же средства (в терминологии криптовалют это называется «double spending» ) Например, она может отправить инфокоин с порядковым номером 1234567 сначала Бобу, а потом Чарли. Оба они получат ее сообщение и проверят серийный номер по своей копии цепочки блоков. Если они сделают это в одно и то же время, то оба увидят, что инфокоин 1234567 действительно принадлежит Алисе. Поэтому они одобрят транзакцию и так же одновременно оповестят о ней всех участников сети. И тут возникает вопрос – что другие люди должны писать в свои копии цепочки блоков? Какую транзакцию считать правильной?

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

Например, Алиса передает Бобу один инфокоин. Как обычно, она создает подписанное сообщение «Я, Алиса, передаю Бобу один инфокоин с серийным номером 1234567» и передает его Бобу. Боб же не только самостоятельно проверяет, действительно ли инфокоин с номером 1234567 принадлежит Алисе, но еще и транслирует это сообщение всей сети. Другие пользователи, получив это сообщение, проверяют принадлежность инфокоина с номером 1234567. Если он действительно принадлежит Алисе, то они отвечают «Да, Алиса владеет инфокоином с серийным номером 1234567, и он может быть передан Бобу». Как только достаточное количество людей даст такой ответ, все обновят свои цепочки блоков записью о том, что теперь инфокоин с серийным номером 1234567 принадлежит Бобу и сделка завершена.

Здесь тоже возникают вопросы, например «достаточное количество людей это сколько?» К этому вопросу мы еще вернемся, а пока будем считать, что «достаточное количество» определено.

Доказательство работы

Алиса не успокаивается и продолжает искать способ, как обмануть систему и реализовать двойную трату одних и тех же средств. И у нее это получится, если она сможет оказывать влияние на сеть. Поэтому она зарегистрировала очень большое количество фальшивых пользователей, и опять отправляет один и тот же инфокоин Бобу и Чарли. Боб и Чарли принимают ее сообщение и просят пользователей сети проверить его. Фальшивые пользователи, зарегистрированные Алисой, подтверждают сделку, в результате чего и Боб и Чарли принимают одну и ту же монету. Алиса торжествует.

Но есть способ избежать такой проблемы, и он называется «доказательство правильности работы» или «proof-of-work». Идея проста, как и все гениальное: во-первых, надо искусственно усложнить подтверждение транзакций. Например, сделать так, чтобы для подтверждения сделки необходимо было выполнить сложные вычисления. Во-вторых, стимулировать участников сети за помощь – награждать тех пользователей, кто предоставляет мощности своего оборудования для подтверждения транзакций.

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

Это что касается доказательства правильности работы в общих чертах. Теперь рассмотрим эту идею в деталях.

Предположим, Алиса транслирует в сеть сообщение: «Я, Алиса, передаю Бобу один инфокоин с серийным номером 1234567».

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

— Я, Том, передаю Сью один инфокоин, с серийным номером 1201174.

— Я, Сидней, передаю Синтии один инфокоин, с серийным номером 1295618.

— Я, Алиса, передаю Бобу один инфокоин с порядковым номером 1234567.

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

Но для этого ему необходимо проделать ряд непростых вычислений и предоставить доказательство правильности работы. Без решения этой задачи, остальная часть сети не будет принимать его проверку сделок.

Какую же задачу необходимо решить Дэвиду? Криптографическую!
Какую же задачу необходимо решить Дэвиду? Криптографическую!

Обозначим буквой h некую фиксированную и известную всем в сети хеш-функцию. Эта функция встроена в протокол. Для Биткоина это SHA-256, для Лайткоина это Scrypt, в общем подойдет любая криптографически безопасная хеш-функция. Очередь незавершенных сделок Дэйва обозначим буквой L. Предположим, Дэйв добавляет некое число х (которое мы будем называть одноразовый номер) к L и вычисляет хеш-функцию этой комбинации. Например, если L=”Hello, World!” (очевидно, что это не список операций, просто строка используется для иллюстрации) и x = 0, то

h(«Hello, world!0») = 1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64

Задача, которую Дэвид должен решить – это найти такое простое число x, при котором результат хеширования строки L+x будет начинаться с ряда нулей. Изменяя число нулей можно регулировать сложность задачи – чем больше нулей, тем больше сложность. Продолжим поиски и попробуем найти такое x, при котором решение будет содержать четыре последовательных нуля в начале строки:

h(«Hello, world!1») = e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8

Последовательно подставляя x=1,2,3 …, при значении x=4250 получим:

h(«Hello, world!4250») = 0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9

Мы решили простую задачу доказательства работы.

Изменение единственного символа в исходных данных кардинально изменяет результат, и предугадать его невозможно. Поэтому, если требуется найти хеш с 10 нулями в начале, Дэвиду придется перебрать 1610 – 1012 различных значений x. А это довольно сложная задача, требующая серьезных вычислительных мощностей.

В Биткоине используется похожий алгоритм, только там доказательством правильности считается не количество нулей в хеше, а соблюдение условия, при котором хэш заголовка блока транзакций был бы меньше или равным определенному числу, известному как «цель». Эта цель автоматически регулируется так, чтобы время создания нового блока занимало около 10 минут.

И вот, Дэвиду повезло, и он нашел подходящее число x. Он транслирует блок операций L, который он хочет подтвердить вместе с найденным числом x. Другие участники сети проверяют, действительно ли найденный x является решением доказательства работы, и если все в порядке, они обновляют свой blockchain, включая в него новый блок с операциями.

Возникает вопрос, ради чего Дэвид так старается? Зачем он тратит электричество, высчитывая хэши? Естественно, он это делает не просто так. За каждый успешно проверенный блок транзакций система выдает вознаграждение в виде определенного количества инфокоинов. Эта награда достаточно велика, для того чтобы мотивировать участников сети принимать участие в генерации новых блоков.

В протоколе Биткоин эта операция называется «майнинг (mining)» или «добыча криптовалюты». За каждый проверенный блок сделок успешный майнер получает вознаграждение в биткоинах. В самом начале сумма награды составляла 50 монет. На сегодняшний день вознаграждение за добычу блока составляет 25 биткоинов , так как каждые 210 тысяч проверенных блоков (примерно, раз в четыре года) награда уменьшается вдвое. Это снижение будет продолжаться до 2140 года, когда награда за найденный блок составит 0.00000001BTC.Означает ли это, что со временем майнеры потеряют интерес к добыче криптовалюты? В протоколе Биткоин предусмотрена возможность выделить некоторую часть сделки в качестве платы за транзакцию. Эта «комиссия» попадает к майнеру, который помогает подтверждать сделки. В настоящее время комиссия является дополнительной прибавкой к награде в 25 монет за майнинг блока.

Доказательство правильности работы можно представить себе как соревнование, в котором выигрывает тот, кто быстрее проверит сделки. Следовательно, чем большими вычислительными мощностями располагает майнер, тем больше у него шансов быстрее остальных найти подходящий блок и получить награду. Так, например, если майнер контролирует 1% от мощности всей сети, то его вероятность найти подходящий блок составляет 1%. При контроле над более чем половиной мощности сети появляется возможность влиять на транзакции, но для этого надо потратить действительно огромное количество вычислительных ресурсов.

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

Иногда случается, что два майнера одновременно находят подходящий блок и транслируют его в сеть – такая ситуация называется «вилкой». В этом случае, некоторые люди обновят свою цепочку в одну сторону, а другие – в другую.

На первый взгляд это вызывает серьезные неприятности – порядок транзакций нарушается и уже не ясно, кто какими инфокоинами владеет. Но эта проблема легко решается – если вдруг случается вилка, то участники сети должны отслеживать оба направления. И в каком из ответвлений будет длиннее цепочка блоков, то и будет подтверждено.

Поясним сказанное на примере. Предположим, мы имеем вилку, в которой одни майнеры получают блок A, а другие – блок B. Они работают каждый над своим ответвлением. В процессе вычислений, майнеры, работающие на ответвлении B успешно добыли блок:

После того, как все получают известите о произошедшем, майнеры, работающие над разветвлением A видят, что ветка B уже длиннее и поэтому переключатся на нее, а ветка A будет игнорироваться. Вот и все! Естественно, что неподтвержденные транзакции из блока А никуда не денутся, а будут ожидать подтверждения, и в скором времени будут одобрены.

Это гарантирует согласованное во времени упорядочение блоков транзакций. В Биткоине сделка считается подтвержденной, если она является частью блока в длинном разветвлении, и как минимум 5 блоков последовали за ней в самом длинном разветвлении (в этом случае говорят, что «сделка имеет 6 подтверждений») Мы позаимствуем эту стратегию и будем использовать ее в Инфокоине.

Теперь давайте еще раз, с учетом вышесказанного рассмотрим проблему двойной траты. Вновь Алиса пытается провернуть аферу и всунуть один и тот же инфокоин Бобу и Чарли. Как вариант, она может сама проверить блок с этими двумя транзакциями. Предположим, Алиса располагает одним процентом вычислительной мощности сети, ей повезло, и она нашла подходящий блок. Но, несмотря на решение задачи с доказательством работы, повторный платеж будет сразу замечен другими людьми в сети и отклонен.

А что, если Алиса отдельно транслирует две сделки, в которых она пытается передать один и тот же инфокоин? Например, одну транзакцию она транслирует одной группе майнеров, а другую – другой. И в этом случае ее ждет неудача – сеть окончательно подтвердит только одну сделку, например перевод для Боба. В этом случае Боб получит свой инфокоин, а сделка Чарли не будет подтверждена и он откажется от предложения Алисы.

Еще Алиса может отправить один и тот же инфокоин сама себе и Бобу. Алиса ждет 6 подтверждений, необходимых для того, чтобы Боб принял деньги. А затем ей нужно сделать цепочку с транзакцией самой себе длиннее, чем с транзакцией Бобу. В реальности, догнать более длинное ответвление очень сложно, для этого ей необходимо контролировать более половины мощностей всей сети.

Что такое хэширование

Реклама

Двойная трата? Как же на самом деле устроен протокол биткоин: 2 комментария

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s