Теперь поговорим о некоторых упрощенных криптовалютах, чтобы потом понять, как работают такие системы, как BitCoin.
И сначала поговорим о GoofyCoin.
GoofyCoin – это простейшая криптовалюта, которая подчиняется двум правилам.
Первое правило состоит в том, что Гуфи может создавать новые монеты, когда он захочет, и когда он создает новую монету, она принадлежит ему.
Когда Гуфи создает монету, она представлена определенной структурой данных.
Чтобы создать монету, Goofy генерирует уникальный идентификатор монеты CoinID, который он никогда не генерировал раньше, и создает строку «CreateCoin [uniqueCoinID]».
Затем он подписывает эту строку цифровой подписью с помощью своего секретного ключа.
Он вычисляет цифровую подпись этой строки с использованием своего секретного ключа.
Эта строка вместе с подписью Гуфи – это и есть монета.
Кто угодно может проверить, что монета содержит действительную подпись Goofy для утверждения CreateCoin и, следовательно, она является действительной монетой.
И новые монеты принадлежат Гуфи по определению, потому что это правило, которое создал сам Гуфи.
Второе правило GoofyCoin заключается в том, что тот, кто владеет монетой, может передать ее кому-то другому.
Передача монеты – это не просто вопрос отправки структуры данных монеты получателю – она выполняется с использованием криптографических операций.
Предположим, Гуфи хочет передать монету, которую он создал, Алисе.
Для этого он создает новое выражение, в котором говорится: «Оплатите это Алисе», где «это» – это хэш-указатель, который ссылается на монету.
И, как мы определили ранее, идентификаторы на самом деле являются просто публичными ключами, поэтому «Алиса» это публичный ключ Алисы.
Наконец, Goofy подписывает строку, представляющую это выражение.
Поскольку Гуфи – это тот, кому принадлежит эта монета, он должен подписать любую транзакцию, которая передает эту монету.
Как только эта структура данных, представляющая сделку Гуфи, подписанная им же, существует, Алиса владеет этой монетой.
Она может доказать кому угодно, что она владеет монетой, потому что она может предоставить структуру данных с действительной подписью Гуфи.
Кроме того, эта структура данных указывает на валидную монету, принадлежащую Гуфи.
Таким образом, валидность и владение монетами самоочевидны в системе.
Теперь, когда Алиса владеет монетой, она может также ее потратить.
Для этого она создает выражение, в котором говорится: «Платите эту монету публичному ключу Боба, где «это» является хэш-указателем на монету, принадлежавшую ей.
И конечно, Алиса подписывает это выражение.
Любой, когда увидит эту монету, может проверить, что Боб является ее владельцем.
Он будет следовать цепочке хэш-указателей обратно к созданию монеты и сможет убедиться, что при каждом шаге, законный владелец подписал выражение, в котором говорится: «Платите эту монету новому владельцу».
Подводя итог, GoofyCoin следует следующим правилам:
Goofy может создавать новые монеты, просто подписывая выражение о том, что он создает новую монету с уникальным идентификационным номером монеты.
Тот, кто владеет монетой, может передать ее кому-то другому, подписав выражение, в котором говорится: «Передайте эту монету X "(где X указывается как открытый ключ).
Любой может проверить действительность монеты, следуя цепочке хеш-указателей обратно к ее создателю Гуфи, проверяя все подписей на этом пути.
Конечно, с GoofyCoin существует фундаментальная проблема безопасности.
Скажем, Алиса передала свою монету Бобу, отправив подписанное выражение Бобу, но никому не об это не сказала.
Она может создать другое подписанное выражение, которое платит ту же самую монету Чаку.
Для Чака это кажется хорошей действительной транзакцией, и теперь он якобы является владельцем монеты.
Боб и Чак, оба теперь утверждают, что являются владельцем этой монеты.
Это называется атакой двойной траты – Алиса тратит одну и ту же монету дважды.
Интуитивно мы знаем, что монеты не должны работать таким образом.
Фактически, атаки с двойным расходованием являются одной из ключевых проблем, которые необходимо решить любой из криптовалют.
GoofyCoin не решает проблему двойного расходования, и поэтому она не защищена.
GoofyCoin – это простая криптовалюта, и ее механизм передачи монет на самом деле очень похож на биткойн, но поскольку она небезопасна, она не может использоваться как реальная криптовалюта.
Чтобы решить проблему с двойным расходованием, мы разработаем еще одну криптовалюту, которую мы назовем ScroogeCoin.
ScroogeCoin построена на основе GoofyCoin, но она немного сложнее с точки зрения структуры данных.
Первая ключевая идея заключается в том, что первоначальный объект Scrooge публикует бухгалтерскую книгу, в которую можно только добавлять записи, и которая содержит историю всех транзакций, которые произошли.
Свойство только добавления записей обеспечивает то, что любые данные, записанные в эту книгу, останутся навсегда.
Если книга действительно обладает свойством только добавления записей, мы можем использовать ее для защиты от двойного расходования, требуя, чтобы все транзакции были записаны в книге, прежде чем они будут приняты.
Таким образом, транзакции будут общедоступны для просмотра, если монеты были ранее отправлены другому владельцу.
Чтобы реализовать эту функцию только добавления, Scrooge может построить цепочку блоков, структуру данных, которую мы уже видели, и которую он будет подписывать цифровой подписью.
Это серия блоков данных, каждый с одной транзакцией, на практике, в качестве оптимизации, помещается несколько транзакций в один и тот же блок, как у биткойна.
Каждый блок содержит идентификатор транзакции, содержимое транзакции и хэш указатель на предыдущий блок.
Scrooge в цифровой форме подписывает также и последний хэш-указатель, который связывает все данные в единую структуру и публикует подпись вместе с цепочкой блоков.
В ScroogeCoin транзакция учитывается только в том случае, если она находится в цепочке блоков, подписанной Scrooge.
Любой может убедиться, что транзакция была одобрена Scrooge, проверив подпись Scrooge для блока, который появляется в цепочке.
Скрудж гарантирует, что он не одобрит транзакцию, которая пытается дважды потратить уже потраченную монету.
Зачем нам нужна цепочка блоков с хэш указателями в дополнение к тому, что Scrooge подписывает каждый блок?
Это обеспечивает свойство только добавления.
Если Scrooge попытается добавить или удалить транзакцию в истории, или изменить существующую транзакцию, это затронет все следующие блоки из-за хэш указателей.
Так как кто-то может отследить последний хэш-указатель, опубликованный Scrooge, это изменение будет очевидно и его легко обнаружить.
В системе, где бы Scrooge подписывал блоки по отдельности, вам бы нужно было отслеживать каждую подпись Scrooge, когда-либо выпущенную.
Цепочка блоков делает это очень легко, создавая единую историю транзакций, подписанную Скруджем.
В ScroogeCoin существует два вида транзакций.
Первый вид – это CreateCoins, которая аналогична операции GoofyCoin, которая делает новую монету.
В ScroogeCoin мы расширим немного семантику, чтобы разрешить создание нескольких монет в одной транзакции.
Эта транзакция CreateCoins создает несколько монет.
Каждая монета имеет серийный номер в транзакции.
И каждая монета также имеет значение, а именно стоимость как определенное количество ScroogeCoins.
И наконец, каждая монета имеет получателя, который является открытым ключом и который получает монету, когда она создана.
Таким образом, CreateCoins создает кучу новых монет с разными значениями и присваивает их разным получателям как первоначальным владельцам.
Мы ссылаемся на монеты с помощью CoinID.
CoinID – это комбинация идентификатора транзакции и серийного номера монеты в рамках этой транзакции.
Транзакция CreateCoins всегда действительна по определению, если она подписана Scrooge.
Мы не будем беспокоиться о том, когда Scrooge имеет право создавать монеты или сколько их создавать, точно так же, как мы не беспокоились в GoofyCoin о том, как Гуфи выбирается как сущность, которой позволено создавать монеты.
Второй вид транзакции – это PayCoins.
Эта транзакция потребляет несколько монет, то есть уничтожает их, и тут же создает новые монеты той же стоимостью.
Новые монеты могут принадлежать разным людям (публичным ключам).
Эта транзакция должна быть подписана всеми, кто платит монетой.
Поэтому, если вы являетесь владельцем одной из монет, которая будет потребляться в этой транзакции, тогда вам необходимо создать цифровую подпись этой транзакции, чтобы сказать, что вы действительно потратили эту монету.
Правила ScroogeCoin говорят, что транзакция PayCoins действительна, если действительны четыре вещи:
Используемые монеты являются валидными, то есть они действительно были созданы в предыдущих транзакциях.
Расходуемые монеты еще не были использованы в каких-либо предыдущих транзакциях. То есть, это не двойное расходование.
Общая стоимость монет, выходящих из этой транзакции, равна суммарному значению монет, которые вошли в транзакцию. То есть, только Scrooge может создать новую монету.
Транзакция действительно подписана владельцами всех потребляемых монет.
Если все эти условия выполнены, тогда транзакция PayCoins валидна, и Scrooge ее примет.
Он впишет эту транзакцию в историю, добавив ее в цепочку блоков, после чего каждый сможет увидеть, что эта транзакция случилась.
Только в этот момент все участники смогут принять, что транзакция на самом деле была произведена.
Пока она не будет опубликована, она может быть вытеснена транзакцией двойной траты, даже если она валидна в силу первых трех условий.
Монеты в этой системе неизменяемы – они никогда не меняются, не делятся и не объединяются.
Каждая монета создана один раз, в одной транзакции, и позже потребляется в какой-либо другой транзакции.
Но мы можем получить возможность делить или объединять монеты с помощью транзакций.
Например, чтобы разделить монету, Алиса может создать новую транзакцию, которая потребляет эту одну монету, а затем создает две новые монеты той же общей стоимостью.
Эти две новые монеты присваиваются ей обратно.
Теперь мы приходим к основной проблеме ScroogeCoin.
ScroogeCoin будет работать в том смысле, что люди могут видеть, какие монеты действительны.
Это предотвращает двойное расходование, потому что каждый может посмотреть на блок и убедиться, что все транзакции действительны и каждая монета потребляется только один раз.
Но проблема Скруджа в том, что у него слишком много влияния.
Он не может создавать поддельные транзакции, потому что не может подделывать подписи других людей.
Но он может прекратить одобрять транзакции у некоторых пользователей, отказывая им в сервисе и делая их монеты бесполезными.
Если Скрудж жадный, как его тезка из мультфильма, он может отказаться публиковать транзакции, если они не передают ему какую-либо утвержденную комиссию за транзакцию.
Scrooge также может, создать столько новых монет для себя, сколько он хочет.
Или Скруджу может наскучить вся система, и он может полностью прекратить обновление цепочки блоков.
Проблема здесь в централизации.
Хотя Scrooge может и доволен этой системой, мы, как ее пользователи не можем быть довольными такой системой.
Хотя ScroogeCoin может показаться нереалистичной криптовалютой, большая часть ранних исследований криптосистем предполагали, что действительно будет какой-то центральный доверенный орган, обычно называемый банком.
В конце концов, у большинства валют реального мира есть доверенный эмитент, обычно правительственный монетный двор, который отвечает за создание валюты и определение того, какие денежные знаки действительны.
Однако, криптовалютам с центральным органом на практике не удалось реализоваться.
Этому есть много причин, но оглядываясь назад, кажется, что трудно заставить людей принять криптовалюту с централизованной властью.
Поэтому центральная техническая задача, которую нам необходимо решить, чтобы улучшить ScroogeCoin и создать работоспособную систему, это можем ли мы удалить Scrooge из системы?
То есть можем ли мы избавиться от этого централизованного органа?
Можем ли мы создать криптовалютносту, которая работает как ScroogeCoin во многих отношениях, но не имеет какой-либо центральной доверенной власти?
Для этого нам нужно выяснить, как все пользователи системы могут согласовать одну опубликованную блок-цепочку как историю всех транзакций, которые когда-то произошли.
Они должны все договориться о том, какие операции действительны, и какие транзакции действительно произошли.
Они также должны иметь возможность назначать идентификаторы децентрализованным способом.
Наконец, производство новых монет должно контролироваться децентрализованно.
Если мы сможем решить все эти проблемы, тогда мы сможем построить валюту, которая будет похожа на ScroogeCoin, но без центральной власти.
Фактически, это будет система, очень похожая на биткойн.
Децентрализация – это важная концепция, которая не является уникальной для Биткойна.
Вопрос конкурирующих парадигм централизации и децентрализации возникает во множестве различных ИТ технологий.
Чтобы лучше понять, как это работает в биткойне, полезно понять центральный конфликт – противоречие между этими двумя парадигмами – в других контекстах.
Например, с одной стороны, у нас есть Интернет, децентрализованная система, которая исторически конкурировала с информационными сервисами America Online и CompuServe.
Или есть электронная почта, которая по своей сути является децентрализованной системой, основанной на открытом стандарте Simple Mail Transfer Protocol (SMTP), а с другой стороны есть закрытые системы обмена сообщениями, такие как ВКонтакте, Facebook или LinkedIn.
Наконец, есть социальные сети – централизованные системы, такие как ВКонтакте, Facebook и LinkedIn, и распространенной децентрализованной альтернативы у них нет.
Надо учитывать, что децентрализация или централизация не реализуются полностью.
Почти ни одна система не является чисто децентрализованной или чисто централизованной.
Например, электронная почта, в своей сути, представляет собой децентрализованную систему на основе стандартизованного протокола, SMTP, и любой, кто желает, может управлять собственным сервером электронной почты.
Тем не менее, развитие рынка сервисов электронной почты привело к его монополизации, и небольшое число централизованных поставщиков веб-почты стали доминирующими.
По аналогии, в то время как протокол Bitcoin является децентрализованным, такие сервисы, как обмен биткойнами, где вы можете конвертировать Биткойн в другие валюты, программное обеспечение для кошельков или программное обеспечение, которое позволяет людям управлять своими биткойнами могут быть централизованы или децентрализованы в различной степени.
Имея это в виду, давайте разделим вопрос о том, как протокол Bitcoin достигает децентрализации на пять более конкретных вопросов:
1. Кто хранит книгу транзакций?
2. Кто имеет власть утверждать действительность транзакций?
3. Кто создает новые биткойны?
4. Кто определяет, как изменяются правила системы?
5. Как биткойны получают обменную стоимость?
Первые три вопроса отражают технические подробности протокола биткойнов, и именно эти вопросы мы в первую очередь разберем.
Различные аспекты биткойна отражают разную степень централизации / децентрализации.
Одноранговая сеть является практически децентрализованной, так как любой может запустить узел биткойна.
Вы можете подключиться к сети и легко загрузить клиент Bitcoin и запустить узел на вашем ноутбуке или на вашем ПК.
В настоящее время существует несколько тысяч таких узлов.
Биткойн-добыча технически также открыта для всех, но для этого требуются очень высокие затраты.
Из-за этого существует высокая степень централизации или концентрации в экосистеме добычи биткойнов. Многие в сообществе биткойнов считают это совершенно нежелательным.
Еще один аспект – это обновление программного обеспечения, на котором работают узлы Bitcoin, и это влияет на при изменении правил системы.
Существует множество совместимых реализаций протокола. Но на практике большинство узлов используют эталонную реализацию, разработчикам которого доверяет сообщество, и эти разработчики обладают большой властью.
Давайте рассмотрим децентрализацию в Биткойне на техническом уровне.
Ключевой термин, который здесь возникнет, это консенсус и, в частности, распределенный консенсус.
Основная техническая проблема, которая возникает при создании распределенной системы цифровых денег – это достижение распределенного консенсуса.
Консенсус – это процесс получения согласованного результата группой участников, например, утверждение транзакций в распределённых системах.
Распределенный консенсус имеет различные применения, и он десятилетиями изучался компьютерной наукой.
Традиционное мотивирующее использование консенсуса – это обеспечение надежности в распределенных системах.
Для достижения надежности в распределенных системах необходимы протоколы, которые позволяют системе, как единому целому, функционировать, невзирая на отказ ограниченного числа ее компонентов.
Ключевым моментом здесь является не то, о чем договариваются процессы, а тот факт, что они все должны прийти к одинаковому результату.
Интуитивно понятно, что такое распределенный консенсус, но полезно рассмотреть техническое определение распределенного консенсуса, так как это поможет нам определить, соответствует ли определенный протокол этим требованиям.
Предположим, что у нас есть n узлов, каждый из которых имеет входное значение.
И некоторые из этих узлов неисправны.
Распределенный консенсусный протокол имеет следующие два свойства:
Он должен завершиться с согласованным значением на всех корректных узлах.
И это значение должно быть предложено корректным узлом, то есть оно само должно быть корректным.
Что это означает в контексте Биткойна?
Чтобы понять, как распределенный консенсус может работать в биткойне, помните, что биткойн – это одноранговая система.
Когда Алиса хочет заплатить Бобу, то, что она на самом деле делает, это транслирует транзакцию на все узлы Bitcoin, которые составляют одноранговую сеть.
Кстати, Алиса транслирует транзакцию на все одноранговые узлы Bitcoin, но при этом компьютер Боба может не находится в сети.
Конечно, возможно, что Боб запускает один из узлов в одноранговой сети.
Фактически, если он хочет получить уведомление о том, что эта транзакция действительно произошла и что он получил деньги, запуск узла Бобом был бы логичным.
Тем не менее, нет необходимости, чтобы Боб слушал в сети; запуск узла для Боба не требуется для получения средств.
Биткойны будут его, независимо от того, работает ли он в сети или нет.
Что именно здесь означает, что узлы достигают консенсуса в сети Bitcoin?
Учитывая, что множество пользователей транслируют эти транзакции в сеть, узлы должны согласовать учет, какие именно транзакции были транслированы, и порядок, в котором эти транзакции произошли.
Это приводит к созданию единого глобального журнала для системы.
Вспомним, что в ScroogeCoin для оптимизации мы помещаем транзакции в блоки.
Аналогичным образом, в биткойне мы принимаем консенсус на основе блокчейна.
Таким образом, все узлы в одноранговой сети содержат реестр, состоящий из последовательности блоков, каждый из которых содержит список транзакций, и таким образом они достигают консенсуса.
Кроме того, каждый узел содержит пул неутвержденных транзакций, о которых он слышал, но которые еще не включены в цепочку блоков.
Для этих транзакций консенсус еще не произошел, и поэтому по определению каждый узел может иметь немного отличающуюся версию пула неутвержденных транзакций.
На практике это происходит потому, что одноранговая сеть не идеальна, поэтому некоторые узлы, возможно, слышали о транзакции, о которой другие узлы не слышали.
Как именно узлы достигают консенсуса по блоку?
Один из способов сделать это: через равные промежутки времени, скажем каждые 10 минут, каждый узел в системе предлагает своему пулу неутвержденных транзакций быть следующим блоком.
Затем узлы выполняют некоторый консенсусный протокол, где вход каждого узла является его собственным предложенным блоком.
Теперь, некоторые узлы могут быть вредоносными и помещать недействительные транзакции в свои блоки, но мы можем предположить, что другие узлы будут корректными.
Если консенсусный протокол завершается успешно, в качестве вывода будет выбран валидный блок.
Даже если выбранный блок был предложен только одним узлом, это будет допустимый результат, если блок корректный.
Теперь, может быть какая-то валидная неутвержденная транзакция, которая не была включена в блок, но это не проблема.
Если какая-то транзакция каким-то образом не попала в этот конкретный блок, она может просто подождать и попасть в следующий блок.
Этот подход имеет некоторое сходство с тем, как работает биткойн, но это не совсем так, как на самом деле работает биткоин.
С этим подходом существует ряд технических проблем.
Во-первых, консенсус в целом является сложной проблемой, поскольку узлы могут дать сбой или быть злонамеренными.
Во-вторых, и особенно в контексте биткойнов, сеть крайне несовершенна.
Это одноранговая система, и не все пары узлов связаны друг с другом.
Например, в сети могут быть неисправности из-за плохого подключения к Интернету, и, таким образом, выполнение консенсусного протокола, в котором все узлы должны участвовать, на самом деле невозможно.
Наконец, в системе много задержек, потому что она охватывает весь Интернет.
Протокол биткойнов должен достичь консенсуса несмотря на две проблемы: ненадежность сети, так как есть задержки и сбой узлов, а также преднамеренные попытки некоторых узлов взломать процесс.
Одним из особых последствий задержек сети является отсутствие понятия глобального времени.
Это означает, что не все узлы могут согласиться на общий для всех узлов порядок событий, просто основанный на соблюдении временных меток.
Поэтому консенсусный протокол не может содержать инструкции в виде: «Узел, который отправил самое первое сообщение на шаге 1 протокола, должен выполнить нечто на шаге 2».
Это не будет работать, потому что не все узлы согласятся, какое сообщение было отправлено первым на этапе 1 протокола.
Отсутствие глобального времени сильно ограничивает набор алгоритмов, которые могут использоваться в консенсусных протоколах.
Фактически, из-за этих ограничений большая часть исследований по распределенному консенсусу пессимистичны.
В качестве примера рассмотрим проблему византийских генералов.
В этой классической проблеме византийская армия разделена на дивизии, каждая из которых подчиняется генералу.
Генералы общаются с помощью посыльных, чтобы разработать совместный план действий.
Некоторые генералы могут быть предателями и могут преднамеренно попытаться подорвать процесс, чтобы лояльные генералы не могли прийти к единому плану.
Цель этой задачи состоит в том, чтобы все лояльные генералы пришли к одному и тому же плану, несмотря на попытки предателей генералов заставить их принять плохой план.
Было доказано, что этого невозможно достичь, если одна треть или более генералов являются предателями.
Другой результат невозможности достичь консенсуса, известный под именами авторов, которые его впервые доказали, называется результатом невозможности Фишера-Линча-Патерсона.
При некоторых условиях, которые включают в себя узлы, действующие детерминированным образом, они доказали, что консенсус невозможен даже при одном неисправном процессе.
Несмотря на эти результаты невозможности достичь консенсуса, все равно существуют некоторые консенсусные протоколы.
Одним из наиболее известных среди этих протоколов является Paxos.
Paxos допускает определенные компромиссы.
С одной стороны, он никогда не дает противоречивого результата.
С другой стороны, он принимает, что при определенных условиях, хотя и в редких случаях, протокол может зависнуть и не сможет добиться какого-либо результата.
Но есть хорошие новости: эти результаты невозможности были доказаны в очень конкретных моделях.
Они были предназначены для изучения распределенных баз данных, и эти модели не очень хорошо описывают биткойн, так как биткойн нарушает многие предположения, на которых эти модели были построены.
Как ни странно, при нынешнем состоянии исследований, консенсус в Биткойне лучше работает на практике, чем в теории.
То есть мы наблюдаем за консенсусом, но не разработали теорию, чтобы полностью объяснить, почему он работает.
Но разработка такой теории важна, поскольку она может помочь нам предсказать непредвиденные атаки и проблемы, и только когда у нас будет сильное теоретическое понимание того, как работает Биткойн, мы будем иметь сильные гарантии безопасности и стабильности Bitcoin.
Какие предположения в традиционных моделях консенсуса, которые Биткойн нарушает?
Во-первых, в нем вводится идея стимулов, которая является новой для распределенного консенсусного протокола.
Это возможно только в биткойне, потому что это валюта, и поэтому он имеет естественный механизм, стимулирующий участников действовать честно.
Таким образом, биткойн не совсем решает проблему распределенного консенсуса в общем смысле, но решает ее в конкретном контексте валютной системы.
Во-вторых, биткойн включает в себя понятие случайности.
Как мы увидим далее, консенсусный алгоритм Биткойна в значительной степени зависит от рандомизации.
Кроме того, Биткойн устраняет понятие конкретной отправной точки и конечной точки для достижения консенсуса.
Вместо этого, консенсус происходит в течение длительного периода времени, около часа в реальной системе.
Но даже в конце этого периода времени узлы не могут быть уверены, что какая-либо конкретная транзакция или блок были включены в книгу.
Вместо этого, со временем, вероятность того, что прогноз будет соответствовать окончательному консенсусу, увеличивается, и вероятность расхождения консенсуса экспоненциально снижается.
Эти различия в модели являются ключевыми для способности Bitcoin обходить традиционные результаты невозможности достижения консенсуса для распределенных консенсусных протоколов.