Опубликован: 01.02.2018 | Доступ: свободный | Студентов: 1003 / 82 | Длительность: 17:35:00
Лекция 2:

Как Биткоин достигает децентрализации

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >

Консенсус без идентификации: блокчейн

Рассмотрим технические детали алгоритма консенсуса Биткоина. Биткоин действует без узлов, имеющих какие-либо постоянные долгосрочные идентификаторы. В этом отличие от работы традиционных алгоритмов распределенного консенсуса. Если узлы имеют идентификационные данные, то это значительно облегчает работу по нескольким причинам. Во-первых, это позволяет, например, указать в протоколе, что узел с самым низким числовым идентификатором должен сделать такой-то шаг. Если узлы являются полностью анонимными, это становится труднее сделать. Идентификация могла бы помочь с обеспечением безопасности.Если узлы были идентифицированы, и они не были причастны к созданию новых идентификационных узлов, то можно сделать предположение, что менее 50% узлов являются вредоносными. Но почему узлы Биткоин не имеют идентификаторов? По нескольким причинам. Одна из них состоит в том, что в децентрализованной модели в одноранговой системе нет центрального органа власти, чтобы предоставить удостоверения узлам и убедиться, что они не создают новые узлы по своему желанию. Технический термин для атаки с созданием узлов -атака Сибиллы. При атаке Сибиллы злоумышленник создает копии узлов, чтобы возникло ощущение, будто в сети есть много разных участников, когда на самом деле все эти псевдоучастники действительно контролируются одним человеком.

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

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

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

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

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

Упрощенный алгоритм консенсуса:

  1. О новых транзакциях оповещаются все узлы
  2. Каждый узел собирает новые транзакции в блоки
  3. В каждом круге произвольный узел принимается транслировать свой блок
  4. Другие узлы принимают этот блок только если все транзакции – действующие (имеют действующие подписи)
  5. Узлы выражают принятие блока, включая его хэш в следующий блок, который они создают.

Именно так выглядит общий алгоритм консенсуса в Биткоин.

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

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

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

Что может сделать вредоносный узел?

Рис. 2.3. Что может сделать вредоносный узел?

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

Предположим, есть злоумышленник, назовем его Алиса. Что она может сделать?

Может ли она просто украсть Биткоины, принадлежащие другому пользователю с другим адресом, который она не контролирует?

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

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

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

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

Что может сделать вредоносный узел? Алиса заплатила Бобу.

Рис. 2.4. Что может сделать вредоносный узел? Алиса заплатила Бобу.

Итак, есть блок, созданный правильным узлом, который содержит транзакцию, представляющую платеж от Алисы продавцу Бобу. Под "С" имеется в виду монета, принадлежащая Алисе, и она сейчас отправляется на адрес Боба.

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

Что может сделать вредоносный узел? Алиса заплатила Бобу.

Рис. 2.5. Что может сделать вредоносный узел? Алиса заплатила Бобу.

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

Что может сделать вредоносный узел? Указатель на предшествующий блок.

Рис. 2.6. Что может сделать вредоносный узел? Указатель на предшествующий блок.

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

Боб уже посмотрел на этот Блокчейн, решил, что Алиса заплатила ему, и позволил Алисе скачать программное обеспечение (то, что она покупала на своем сайте).

Боб доволен, сделка завершена, Алиса теперь получила свой товар в обмен на оплату.

Теперь, Алиса могла бы предложить блок, который выглядит так.

Что может сделать вредоносный узел? Появляется блок для двойного расхода.

Рис. 2.7. Что может сделать вредоносный узел? Появляется блок для двойного расхода.

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

Это классический случай двойного расхода. Алиса создает новую транзакцию, которая переводит монету, вместо адреса Боба, на другой адрес, принадлежащий ей ( рис. 2.8).

Что может сделать вредоносный узел? Атака двойного расхода

Рис. 2.8. Что может сделать вредоносный узел? Атака двойного расхода

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

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

Что может сделать вредоносный узел? Атака двойного расхода: правильные (честные) узлы будут расширять наиболее длинную действующую ветвь.

Рис. 2.9. Что может сделать вредоносный узел? Атака двойного расхода: правильные (честные) узлы будут расширять наиболее длинную действующую ветвь.

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

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

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

Ситуация с точки зрения предпринимателя Боба

Рис. 2.10. Ситуация с точки зрения предпринимателя Боба

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

Ситуация с точки зрения предпринимателя Боба. Услышана информация о сделке. Ноль подтверждений.

Рис. 2.11. Ситуация с точки зрения предпринимателя Боба. Услышана информация о сделке. Ноль подтверждений.

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

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

Ситуация с точки зрения предпринимателя Боба. Одно подтверждение.

Рис. 2.12. Ситуация с точки зрения предпринимателя Боба. Одно подтверждение.

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

Ситуация с точки зрения предпринимателя Боба. Попытка двойного расхода.

Рис. 2.13. Ситуация с точки зрения предпринимателя Боба. Попытка двойного расхода.

Теперь он видит, что его транзакция имеет уже два подтверждения в цепочке блоков.

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

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

Ситуация с точки зрения предпринимателя Боба. 3 подтверждения.

Рис. 2.14. Ситуация с точки зрения предпринимателя Боба. 3 подтверждения.

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

Ситуация с точки зрения предпринимателя Боба

Рис. 2.15. Ситуация с точки зрения предпринимателя Боба

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

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

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

Терминологический словарь

Блокчейн - выстроенная по определённым правилам непрерывная последовательная цепочка блоков, содержащих информацию.

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >