23 марта 2021

Изобретая Биткоин. Глава 5: ОБЕСПЕЧЕНИЕ БЕЗОПАСНОСТИ РЕЕСТРА

Книга Яна Прицкера переведена командой Bitcoin Translated и распространяется на безвозмездной основе. Тем не менее, вы всегда можете поблагодарить автора за его работу, например, через сервис Tippin.me, привязанный к его Твиттер-аккаунту. Команду, предоставившую перевод можно поблагодарить как через сеть лайтнинг, так и ончейн биткоинами.

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

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

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

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

Напомним, что результат хеширования непредсказуем и напрямую зависит от входных данных. Итак, мы модифицировали хеши наших блоков, включив три разных типа входных данных:

  1. Транзакции, которые мы хотим зафиксировать в реестре.
  2. Случайное однократно используемое число (нонс).
  3. Хеш предыдущего блока, который несет в себе отпечаток всей истории реестра.
Входные данные, используемые при построении хеш-числа для участия в лотерее, помимо прочего, включают хеш предыдущего блока. Это создает неразрывную связь каждого следующего блока с общей историей.

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

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

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

Фактически, каждый новый блок повышает безопасность блоков, созданных до него, так как он увеличивает количество электроэнергии, необходимое для пересчета хешей Proof of Work для этой цепочки. На сегодняшний день большинство участников считают транзакцию в блоке, похороненном под 6 последующими, окончательной. Потребовалось бы огромное количество энергии, чтобы переписать последние шесть блоков, учитывая сегодняшнюю общую скоростью хеширования. А как насчет транзакций, находящихся на глубине 100 блоков? Забудьте об этом.

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

Противоречия блоков

У нашей системы консенсуса остался один нерешенный вопрос: как мы можем заставить всех вести одну и ту же линейную историю транзакций в случае, если майнеры одновременно разработают два блока и всем их разошлют?

Мы имеем дело со всемирной сетью. Люди по всему миру от США до Китая подключены к этой глобальной сети, и все они играют в лотерею Proof of Work.

Допустим, один из майнеров в Чикаго находит валидный блок. Он объявляет об этом в сети, и все компьютеры по всей Америке его принимают. Между тем, кто-то в Шанхае также находит блок в течение нескольких секунд после чикагского блока. Его соседи до сих пор не слышали об американском блоке — они сначала узнают о китайском блоке.

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

Сеть разделяется, будучи не в состоянии решить, какая цепочка блоков является правильной копией реестра, поскольку обе содержат валидные транзакции, которые связаны с историей во всех предыдущих блоках и обе цепи подкреплены Proof of Work. Это называется разделением цепи (на английском fork — прим. пер.). Вы не можете положиться на какой-либо центральный орган, который мог бы сообщить вам, какая из цепочек победит. Что делать?

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

В течение следующего, примерно десятиминутного периода будет добыт новый блок. В коде Биткоина есть правило, согласно которому, при разветвлении цепочки, истинной считается та, на создание которой было потрачено наибольшее количество энергии. Это правило иногда называют “Консенсус Накамото”, в честь Сатоши.

Допустим, китайцы создают следующий блок. Их цепочка теперь на один блок опережает американскую и содержит наибольший объем Proof of Work. Когда они передадут эту информацию, американские ноды признают, что китайские ноды произвели более длинную цепочку, и проведут реорганизацию своей копии блокчейна (или реорг). Это означает, что они отвергнут один добытый ими блок в пользу двух китайских.

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

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

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

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

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

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

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

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

Единственная достоверная цепочка

Давайте вернемся к нашему примеру из главы 3, где Генри впервые присоединяется к сети Биткоин.

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

Некоторые из этих нод будут заведомо вредоносными и будут давать ему фальшивую копию реестра с неверными подписями для транзакций или поддельными и неправильно созданными биткоинами, которые не имеют валидных хешей Proof of Work. Эти копии будут отклонены, а тем нодам будет немедленно запрещено дальнейшее подключение к ноде Генри*.

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

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

Даже если Генри подключится к десяткам устаревших или недобросовестных нод и одной честной ноде, его программное обеспечение Биткоин распознает ту самую правильную копию. Именно она будет содержать наибольшее количество Proof of Work и состоять из валидных транзакций вплоть до генезис-блока. Важность этого нельзя недооценивать. Генри не нужно никому доверять; его нода выполнит все проверки, чтобы убедиться, что блокчейн, на который он смотрит, является единственной достоверной цепочкой.

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

Обратимость транзакций

Две конкурирующие цепочки обычно создаются случайно, и проблема быстро решается. Однако те, кто хочет атаковать сеть, могут воспользоваться консенсусом Накамото, при условии, что они контролируют более 50% хешрейта. Они могут создать самую длинную цепочку Proof of Work, содержащую транзакции на свой выбор, если они готовы потратить для этого достаточно энергии. Когда они транслируют эту цепочку, другие ноды примут ее как единственную достоверную. Это называется атакой 51%, поскольку требует контроля более половины хешрейта.

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

Блоки, созданные поверх блока, содержащего интересующую вас транзакцию, часто называют подтверждениями. Поэтому, когда вы слышите, что транзакция Биткоин имеет шесть подтверждений, это означает, что шесть блоков были добыты поверх нее. Если вы продаете цифровую книгу с минимальными затратами для себя как для продавца, вам будет достаточно лишь одного подтверждения или можно обойтись и вовсе без них; вы можете предоставлять ссылку для скачивания, как только увидите транзакцию в сети. Если вы продаете дом, возможно, вы захотите дождаться двенадцати подтверждений, что приблизительно равно двум часам майнинга. Чем дольше вы ждете, тем больше Proof of Work накапливается поверх блока, содержащего вашу транзакцию, и тем дороже становится процесс обращения транзакции вспять. Сегодня большинство людей принимают 6 подтверждений в качестве доказательства необратимости платежа.

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

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

Сегодняшние оценки показывают, что если бы в вашем распоряжении была энергия всей сети Биткоин (действительно щедрое предложение, поскольку вам бы довелось контролировать количество энергии, сопоставимое с потреблением страны средней величины), и все специализированное оборудование сети Биткоин, у вас все равно ушло бы больше года, на то, чтобы переписать всю историю цепочки. Вы можете изучить эти данные на http://bitcoin.sipa.be.

*  *  *

Обсудить в Discord!