Как на самом деле работает протокол Биткойн (часть 1)

Замечательное объяснение принципов работы сети Bitcoin авторства Michael Nielsen. Часть первая из трёх.

Было написано много тысяч статей с объяснения того, что Биткойн является – онлайновая, одноранговая (p2p) валюта. Большинство из этих статей поверхностно рассказывают суть криптографического протокола, опуская многие детали. Даже те статьи, которые «копают» глубже, часто замалчивают важные моменты. Цель этой публикации — объяснить основные идеи, лежащие в основе протокола Биткойна в ясной, легкодоступной форме. Мы начнем с простых принципов, далее перейдём к широкому теоретическому пониманию, как работает протокол, а затем копнем глубже, рассматривая сырые (raw) данные Биткойн-транзакции.

Достаточно сложно понять работу протокола в деталях. Намного проще вместо этого принять Биткойн как данность и участвовать в рассуждениях о том, как разбогатеть с помощью Биткойна, а не пузырь ли Биткойн, может ли Биткойн в один прекрасный день уничтожить обязательное налогообложение, и так далее. Это всё весело, но существенно ограничивает понимание. Понимание деталей протокола Биткойна открывает безграничные перспективы. В частности, это основа для понимания встроенного языка сценариев (скриптовый язык программирования) Биткойна, который открывает возможности для использования Биткойна для создания новых видов финансовых инструментов, таких как смарт-контракты (1 2). Новые финансовые инструменты могут, в свою очередь, быть использованы для создания новых рынков и получения новых форм коллективного поведения человека.

Я опишу такие концепции, как контракты, в следующих публикациях. Эта публикация концентрируется на объяснении начинки протокола Биткойна. Чтобы понять меня, вы должны быть знакомы с идеей публичного криптоключа, и с тесно связанной с ней идеей цифровой подписи. Я также предполагаю, что вы знакомы с криптографической хэш-функцией (изменение входных данных всего на один бит кардинально меняет хэш-сумму – прим. пер.). Всё это не представляет большой сложности. Основные идеи можно почерпнуть из программы первого курса ВУЗа по математике или классов по компьютерной информатике. Идеи красивы, так что если вы не знакомы с ними, рекомендую потратить несколько часов на ознакомление.

Может показаться удивительным, что основой Биткойна является криптография. Разве Биткойн не валюта, не способ отправки секретных сообщений? На самом деле, проблемы, которые должен решать Биткойн, касаются в основном обеспечения безопасности транзакций – чтобы быть уверенным, что люди не могут красть друг у друга, или выдавать себя за друг друга, и так далее. В мире атомов мы достигаем такой безопасности с помощью таких устройств, как замки, сейфы, подписи и банковские хранилища. В мире битов мы достигаем такого рода безопасности с помощью криптографии. Вот почему Биткойн в душе — криптографический протокол.

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

Эта стратегия работает медленнее, чем если бы я объяснил работу всего Биткойн-протокола сразу. Даже если вы можете понять механику Биткойна через такое залповое объяснения, будет трудно понять, почему Биткойн спроектирован таким вот образом. Преимущество медленного, итерационного объяснения в том, что это дает нам гораздо более чёткое понимание каждого элемента Биткойна.

Наконец, я должен упомянуть, что я новичок в Биткойне. Я наблюдаю за ним с 2011 года (а за криптовалютами с конца 1990-х годов), но серьёзно вник в детали Биткойн-протокола только в начале этого года. Так что пишите коменты, буду благодарен за исправления любых заблуждений с моей стороны. Кроме того, я в своем материале включил ряд «проблем для автора», — заметки для себя о вопросах, которые возникли у меня во время написания. Вы можете найти их интересными, но также можете их полностью пропустить, сосредоточившись на основном тексте.

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

Так как мы можем спроектировать цифровую валюту?

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

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

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

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

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

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

Использование серийных номеров для маркировки монет

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

Еще читать  Возврат к корням шифропанка: интервью с организаторами Hackers Congress Paralelní Polis

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

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

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

Создание банка совместными усилиями

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

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

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

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

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

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

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

У такого протокола, если бы он использовался в настоящее время, было бы много неточных элементов. Например, что значит сказать «достаточное количество людей должны транслировать это сообщение»? Что значит «достаточно»? Это не может означать всех в сети, так как мы априори не знаем, кто находится в сети Инфокойн. По той же причине, это не может означать некоторую фиксированную долю пользователей сети. Мы не будем пытаться разобраться в этом прямо сейчас. Вместо этого, в следующем разделе я укажу на серьезные проблемы в подходе, который мы описали. Обратив внимание на эту проблему, от прояснения как с ней бороться мы получим приятный побочный эффект.

Продолжение следует.

Перевод: Андрей Дубецкий, Игорь Корсаков

Источник

Источник


Комментарии:

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

Яндекс.Метрика