Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы технологии блокчейн и криптовалют для менеджеров. Учебное пособие
.pdf
11
– отправляет средства между пирами (доступными узлами децентрализованной пиринговой сети, Р2Р) напрямую;
– обновляет каждый узел, который ведет свой реестр, благодаря
технологии блокчейн;
– предоставляет надежный протокол, который побуждает участников сети вести себя честно.
Рассмотрим каждую из этих четырех концепций и посмотрим,
как они вписываются в архитектуру биткоина: управление учетными
записями и идентификационными данными, денежные переводы как
услуга, управление записями и доверие.
Начнем с рассмотрения одной из самых фундаментальных идей
биткоина – идентичности. Ранее мы видели, что банкам необходимо отслеживать счета и личности своих клиентов. Но как это сделать в биткоин, когда банк или центральный орган не отслеживают, кто есть кто
и кто чем владеет? Чтобы понять, зачем нам вообще нужна идентичность в биткоин, сначала разберемся, зачем нам вообще нужна идентичность в контексте валют.
Что касается валют, мы должны гарантировать, что все пользователи могут аутентифицировать себя с помощью какого-либо метода
идентификации и что все методы идентификации имеют целостность.
Аутентификация необходима, чтобы никто другой не действовал от вашего имени. Требовать, получать и тратить деньги от вашего имени –
это то, что можете делать только вы. Как и банк, связав себя со своими
средствами через аутентификацию, вы можете получать деньги от других и тратить свои собственные. Только у вас есть доступ к вашим собственным деньгам, поскольку другие не имеют доступа к вашим деньгам. Без процесса аутентификации кто-либо может потратить ваши
деньги, что, очевидно, нежелательно.
Например, если кто-то пытается вывести ваши средства из банка,
вам может потребоваться запись об этом, в том числе и запись о личности того, кто пытался забрать ваши средства, чтобы избавиться от его
злонамеренной активности в будущем, запретив или отказавшись взаимодействовать с этой личностью.
Целостность – другая половина идентичности – означает, что все
наши методы аутентификации не могут быть воспроизведены кем-либо
еще. Мы можем понять целостность процесса подписания чека: после
того как вы подписываете чек или транзакцию, никто не сможет перехватить и/или манипулировать им. Это гарантирует, что никто, кроме
вас, подписывающего лица, не сможет использовать вашу подпись.

12
Допустим, что я отправил чек на 10 биткоинов своему контрагенту
и для меня важно, чтобы он не смог добавить в чек еще один ноль,
чтобы потребовать от меня 100 биткоинов. Кроме того, мой контрагент
не должен иметь возможность копировать или тиражировать мою подпись где-либо еще. Только предотвращая все это, мы можем доверять
целостности биткоин-идентичности.
Идентичность – это простая концепция, которая встречается повсюду в повседневной жизни. Например, у домов есть и адреса, и ключи
от почтовых ящиков. Когда вы просите людей отправить вам почту, вы
сообщаете свой адрес, чтобы они знали, куда отправить посылку.
Между тем только вы управляете ключом почтового ящика. Точно так
же электронные письма имеют псевдонимы и пароли. Люди, которые
хотят отправить вам электронное письмо, имеют доступ к вашему адресу электронной почты или псевдониму, в то время как только вы имеете доступ к паролю своей учетной записи электронной почты, поэтому
только вы можете читать эти электронные письма.
Биткоин, следуя этой схеме, имеет как открытые, так и закрытые
ключи. Адреса почтовых ящиков, псевдонимы электронной почты и открытые ключи являются общедоступными. Это то, что вы раздаете публике, чтобы они знали, как с вами общаться, чтобы они знали, как вас
узнать и идентифицировать. С другой стороны, ключи почтового ящика,
пароли электронной почты и закрытые ключи являются секретной информацией, которая должна принадлежать только вам. С этими личными ключами вы получаете доступ к адресам и содержимому почтовых
ящиков, псевдонимам электронной почты и т. п. Это позволяет вам их
контролировать и дает чувство собственности. Например, если кто-то
еще завладеет вашим паролем электронной почты, он может притвориться вами, получая и отправляя электронные письма от вашего имени.
Точно так же вы никогда не захотите, чтобы кто-то еще имел ваш
закрытый биткоин-ключ, поскольку это дает контроль над вашим открытым биткоин-ключом и, косвенно, вашей биткоин-идентичностью.
Вы используете свой закрытый ключ, чтобы доказать, что владеете
своим открытым ключом и для доступа к средствам, связанным с этим
открытым ключом.
Повторюсь, открытые ключи предназначены для получения, а закрытые – для использования. Полученные деньги связаны с открытым
ключом, и вы можете получить доступ к этим средствам или потратить их
с помощью своего закрытого ключа. Вы в безопасности, сообщая людям

13
о своем сундуке с биткоинами – вашем открытом ключе – до тех пор, пока
вы не даете им ключ, чтобы попасть внутрь – свой закрытый ключ.
Небольшое примечание: на самом деле другие пользователи отправляют транзакции на ваш адрес, а не на ваш открытый ключ, поскольку ваш открытый ключ биткоин неидентичен вашему адресу биткоин. Ваш адрес фактически получен из вашего открытого ключа. Это
различие станет более ясным, когда углубимся в механику биткоина.
Но пока вы можете думать об адресах, псевдонимах и открытых ключах
как об синонимах.
Причина, по которой нам нужна эта схема пары открытого и закрытого ключей в биткоин, заключается в том, что нет центрального органа для создания уникальных идентификаторов для пользователей. Это
означает, что пользователи должны создавать свои собственные идентификаторы. Чтобы сгенерировать личность, пользователь выбирает закрытый ключ случайным образом, генерирует открытый ключ из закрытого ключа с помощью математической функции. В итоге пользователь
получает закрытый ключ, включающий 32 байта и выглядевший примерно следующим образом: 47dy93tu2nw258f64y82gd7t3657c8yd. Затем
пользователь применит алгоритм цифровой подписи ECDSA или эллиптической кривой (Elliptic Curve) к нашему закрытому ключу и получит
64-байтовое целое число. Оно состоит из двух 32-байтовых целых чисел,
которые представляют собой соединенные вместе точки X и Y эллиптической кривой. После этого добавляем в начало полученного 64-байтового числа определенный байт, в зависимости от которого можем получить полный открытый ключ или сжатый открытый ключ биткоина.
Вы можете быть обеспокоены опасностью того, что два пользователя получат один и тот же открытый ключ без центрального реестра,
гарантирующего, что ни у кого не будет одного и того же открытого
ключа. Например, у банка есть внутренний список пользователей с уникальными идентификаторами и он может легко назначить новый уникальный идентификатор любому новому пользователю. Как мы можем
поверить в то, что никакие два пользователя не имеют одинаковых
идентификационных данных? Вероятность того, что два человека выберут один и тот же идентификатор, очень мала: каждый человек на
нашей планете может иметь около 2127 адресов-идентификаторов, не
совпадающих с адресами других людей.
Теперь мы можем начать задавать вопрос: «Как мы можем совершать транзакции между собой в биткоин?». Как и раньше с концепцией
идентичности, теперь мы будем анализировать идею транзакции.

14
Давайте спросим себя: «Что делает транзакцию действительной?»
Чтобы транзакция была действительной, она должна иметь следующие
три компонента:
1) подтверждение права собственности, также известное как
подпись;
2) наличие и достаточность средств для траты;
3) гарантия того, что никакая другая транзакция не использует
или не использовала те же средства.
Разберемся с этими критериями в контексте чеков и банков. Если
вы хотите совершить транзакцию с помощью чека, вы должны подписать чек, чтобы подтвердить его – это доказательство права собственности. Затем банк должен подтвердить, что у вас достаточно средств на
вашем счете, т. е. что у вас есть доступные и достаточные средства для
транзакции. Они также должны убедиться, что вы не тратите одни и те
же деньги более одного раза, а именно что вы не можете отправить два
или более чека, каждый из которых тратит 100 долларов, если на вашем
счету всего их 100.
Чтобы гарантировать, что кто-то использует средства, которыми
он не владеет, к биткоинам применяются все те же условия. Чтобы добиться этого, биткоин использует модель, которая является важной
в системе блокчейн, известную как UTXO (unspent transaction output),
или неизрасходованный вывод транзакции. Традиционно, когда мы думаем о банках, мы думаем об одном счете, где все наши средства объединены в один счет. Например, после покупки гамбургеров на 100 рублей баланс вашего счета уменьшится с 300 до 200 рублей. Это не относится к биткоинам. Учетные записи просты для понимания пользователями, но удивительно сложны для компьютеров, когда речь идет о всей
сложности децентрализованной сети. Больше нет ни центральной организации, которая отслеживала бы все транзакции, совершаемые моей
учетной записью, ни центральных часов для отслеживания, когда транзакции совершаются. Если я совершу три разные транзакции по 5 биткоинов со счета, содержащего всего 10 биткоинов, какая из двух транзакций должна пройти? Как мы гарантируем, что случайно не пропустим все три транзакции? Чтобы сделать обработку транзакций намного
проще и безопаснее, пользователи не тратят деньги со счета, а вместо
этого они тратят деньги непосредственно из транзакций, совершенных
с ними. Простой способ осмыслить эту модель – представить UTXO как
копилки! Каждый раз, когда с нами совершается транзакция, мы вкладываем все эти деньги в UTXO или копилку. Когда мы хотим потратить

деньги, мы открываем эту копилку, тратим деньги на все, что нам нравится, а затем кладем остаток в другую копилку. Таким образом, уменьшается сложность проверки действительности транзакции. Вместо того
чтобы задавать более сложный вопрос: «Пытается ли этот счет в настоящее время тратить больше денег, чем он имеет на несколько транзакций?», нам нужно только спросить: «Достаточно ли средств в этой
единственной копилке?». С другой стороны, сложность отслеживания
собственных средств возрастает, поскольку каждую из этих копилок
необходимо отслеживать и обеспечивать индивидуальную защиту. Количество биткоинов, которыми вы владеете, рассчитывается путем суммирования количества биткоинов каждой из ваших копилок или UTXO.
Рис. 1.2. Пример работы транзакций в системе биткоин
Вот пример того, как транзакции работают в биткоинах (рис. 1.2).
Допустим, у Анны есть два UTXO из прошлых транзакций, один – на
100 биткоинов и один – на 50 биткоинов. Она, будучи невероятно богатой и щедрой, хочет отправить Роману 101 биткоин. Для начала она
сначала открывает 100 биткоинов в UTXO и делает это входом для
транзакции для меня. Однако она понимает, что у нее еще недостаточно
входных данных, поэтому она открывает свой следующий UTXO стоимостью 50 биткоинов и делает это вторым вводом для транзакции.
В настоящее время транзакция имеет два входа, один – стоимостью
100 биткоинов, один – стоимостью 50 биткоинов и один выход, который стоит Роману 101 биткоин. А как насчет остальных 49 биткоинов,
которые изначально принадлежали Анне? Куда они деваются? Чтобы
убедиться, что Анна сможет потратить эти биткоины позже, она делает
второй вывод для себя, известный как UTXO-изменения, или другая копилка, содержащая все оставшиеся не израсходованные биткоины
с входов. Таким образом, Анна может отдать мне 101 из своих
15

16
150 биткоинов и оставить себе оставшиеся 49 биткоинов, даже если
у нее нет отдельного UTXO (или, иначе говоря, кошелька), в которым
имеется ровно та сумма, которую она хочет потратить. Отсюда, если
Роман столь же великодушен и хочет отдать полученные 101 биткоин
Денису, он может просто сделать свой новый UTXO входом в другую
транзакцию, выходом из которой будет новый UTXO Дениса. Таким
образом, система биткоин эффективно отслеживает отдельные транзакции и предотвращает трату неправильных сумм биткоинов.
Теперь, после того как мы выяснили, как назначать уникальные
идентификаторы каждому пользователю с помощью открытых и закрытых ключей и проводить транзакции между этими объектами с помощью модели UTXO (Unspent Transaction Output), возникает следующий
вопрос: «Как мы отслеживаем историю транзакций?». В конце концов
текущий баланс пользователя можно описать как количество транзакций, суммируемых с текущей суммой, и, если мы не знаем, какие транзакции происходили в прошлом, мы не можем определить, что будет
действительным в будущем.
Нам необходимо хранить историю транзакций по очевидным
причинам: чтобы знать, кто чем владеет в настоящее время, и использовать эту историю для подтверждения действительности будущих
транзакций. Чтобы сохранить эту информацию, нам понадобится некоторая форма базы данных. База данных – это хранилище информации,
и существует множество типов и реализаций баз данных. Чтобы понять,
какой тип базы данных нам нужно использовать в биткоине, давайте
еще раз вспомним требования протокола биткоина: мы не хотим, чтобы
центральный субъект контролировал информацию в сети, и мы хотим,
чтобы любой мог читать и написать в историю сделок. Следовательно,
мы хотим использовать распределенную базу данных: как следует из ее
названия, информация хранится распределенным образом, что означает, что информация хранится не одним объектом или только в одном
месте. Поскольку биткоин стремится к децентрализации, мы хотим использовать именно распределенную базу данных. Так как же выглядит
эта распределенная база данных и где именно она хранится?
Не существует некоего центрального объекта, который мог бы хранить нашу информацию, поэтому нам необходимо наличие выбранного
набора объектов, хранящих нашу информацию. Если бы мы назначили
несколько элементов сети ответственными за ведение и совместное использование нашего реестра транзакций, то мы увидели бы, как некоторые механизмы централизации проникают в наш протокол, что

17
противоречит цели биткоина быть надежной системой. Необходимо
найти другой способ.
Вместо того чтобы иметь несколько избранных элементов сети,
ответственных за ведение и совместное использование нашего реестра
транзакций, сделаем простой и понятный выбор: у нас у всех есть копии
«бухгалтерской книги» (реестра транзакций) каждого объекта сети. Все
элементы в системе биткоина равны, и мы делаем каждый элемент банком, чтобы можно было уйти как можно дальше от централизации. Если
каждый человек хранит реестр, то каждый человек имеет такое же
право и законность, как и другой, для голосования по достоверности
транзакций. Каждый человек имеет контроль над своими данными,
и никто не может решать за кого-то другого. Нет никого, кого можно
подкупить, кого взломать, кого обмануть, чтобы изменить базу данных.
Это максимально возможное состояние индивидуальной независимости для ведения истории транзакций.
Мы хотим, чтобы каждый человек вел «бухгалтерскую книгу».
Но как на самом деле должна выглядеть база данных? Какие структуры
данных хранят историю транзакций? Мы могли бы просто решить хранить каждую транзакцию индивидуально, но для сети, которая может
обрабатывать много транзакций в секунду, обновление базы данных
для каждой полученной транзакции будет дорогостоящим, тем более
что это обновление должно быть доставлено всем в сети. В конце концов каждый ведет свой реестр, и после внесения изменения это изменение должно распространиться по всей сети. Итак, как мы можем эффективно хранить нашу «бухгалтерскую книгу»?
Каждое обновление распределенной базы данных, реестра биткоинов представляет собой пакет транзакций, сгруппированных в так
называемые блоки. Каждый блок построен на основе предыдущего
блока или привязан к нему. В целом это формирует волшебную структуру данных, известную как блокчейн. Группируя данные в блоки, нам
не нужно нагружать сеть в результате обновления каждого реестра после каждой транзакции. При использовании цепочки блоков только
каждый блок, который может содержать тысячи транзакций, должен
быть добавлен в цепочку блоков. Таким образом, блокчейн не только
эффективно отслеживает транзакции в любом конкретном обновлении,
но также предоставляют дискретные состояния базы данных. Каждый
блок – это обновление, а цепочка блоков представляет собой историю.
Этот процесс полезен для выявления расхождений между двумя
разными версиями базы данных, поскольку гораздо более ясно, что

18
происходило в «бухгалтерской книге» в любой момент времени, чем
если бы каждая транзакция обрабатывалась отдельно. Каждый блок содержит информацию о предыдущем блоке, так как каждый блок построен на основе предыдущего. Если какой-либо блок изменяется намеренно или нет, информация в этом блоке и во всех будущих блоках изменится. Это делает блокчейн устойчивым от взлома, так как вмешательство в транзакцию из прошлого сделает недействительными любые
будущие блоки, связывающиеся с ней. Выбор такого алгоритма призван
снизить нагрузку на хранение отдельных транзакций и обеспечить согласованность между всеми участниками сети биткоин.
Конечно, следующий вопрос: «Как все приходят к согласию по
следующему блоку?». Теперь мы знаем, как отправлять транзакции
друг другу с уникальными идентификаторами, используя модель
UTXO, и как хранить эти транзакции с помощью цепочки блоков для
поддержания глобальной записи. На данный момент нам не хватает
только одного последнего элемента, чтобы объединить все эти различные компоненты. Как мы обновляем систему блоков – систему блокчейн? Как мы решаем, какие транзакции или блоки транзакций действительны? Поскольку у нас нет центрального органа, который может принять такие решения, нам надо найти способ принять это решение децентрализованно. В биткоин пользователи сети должны прийти к соглашению относительно следующего действительного обновления. Поскольку все хранят информацию о блокчейн, нам нужен консенсус,
чтобы убедиться, что все согласны с историей транзакций. Не только
все пользователи должны согласиться с обновлением, но им также
необходимо согласовать действительное обновление, чтобы убедиться,
что сеть не принимает поврежденную информацию. Если разные стороны не могли прийти к соглашению по этому поводу, то между ними
всегда будет раскол. Без согласия у нас не может быть функционирующей распределенной базы данных. Таким образом, абсолютно необходимо, чтобы у нас был механизм, с помощью которого каждый мог
прийти к консенсусу.
В самом основном механизме консенсуса обновления принимают
следующую форму: один узел предлагает транзакцию в сеть, отправляя
сообщение о транзакции непосредственно каждому другому узлу. Все
остальные узлы сохраняют транзакцию в своей истории, если она действительна, и игнорируют ее в противном случае. Смысл этой системы
заключается в том, что узлы не участвуют в разговоре друг с другом
и единственными узлами, которые видят транзакцию со стопроцентной

19
уверенностью, являются отправитель и получатель. Как мы увидим, это
не работает из-за так называемой атаки двойного расходования (двойная трата одной и той же суммы денег). Благодаря централизованным
системам мы доверяем банкам проверять правильность всех транзакций. Напомним, что одним из условий действительности транзакции
является то, что предложенные средства для транзакции не использованы где-либо еще в предыдущей транзакции. Поскольку у нас нет
банка, который мог бы проверять наличие такого злонамеренного поведения, мы должны создать механизмы, которые справляются с подобными ситуациями.
Чтобы понять лучший механизм консенсуса для биткоина, мы
начнем с понимания того, какие проблемы существуют с консенсусными стратегиями. Для достижения консенсуса мы рассмотрим 5 действующих лиц – Романа, Анну, Дениса, Надира и Ника – на следующем
примере. Допустим, Анна покупает тонны арбузов и готова заплатить
как Надиру, так и Роману 10 биткоинов за наши арбузы. Анна обещает
Роману 10 биткоинов за одну транзакцию и одновременно 10 биткоинов
– Надиру. Однако всего у нее только 10 биткоинов. Ее недействительная транзакция ускользает от обнаружения, потому что она сообщает
о каждой транзакции только одному человеку – человеку, получающему биткоины. Роман знает только о своих входящих биткоинах,
а Надир – только о своих. Денис и Ник (другие объекты в сети) ничего
не знают ни об одной из транзакций. Это так называемая атака двойной
траты. Анна тратит всего 10 биткоинов, чтобы получить товары на
20 биткоинов.
В этой версии консенсуса это законно: в своей транзакции с Романом Анна говорит ему обновить его копию «бухгалтерской книги»,
а в своей транзакции с Надиром она говорит ему обновить его копию
«бухгалтерской книги». И Надир, и Роман видят, что транзакция действительна, и каждый считает, что они получили биткоины. Конечно,
и Надир, и Роман не могут владеть одними и теми же биткоинами.
В этой схеме, где люди видят только транзакции, в которых они напрямую участвуют в качестве отправителя или получателя, невозможно
прийти к консенсусу по истории транзакций из-за недобросовестных
участников. Таким образом, с помощью этой модели консенсуса
предотвратить эти атаки с двойным расходом невозможно.
Вместо того чтобы отдельные лица самостоятельно проверяли
транзакцию, мы можем настроить систему голосования. Проблема
с нашей предыдущей версией консенсуса заключалась в том, что

20
консенсуса не было! Вместо того чтобы принимать разрозненные решения, как мы делали раньше, внедрим систему предлагающих и избирателей. Один человек вносит предложения об обновлении, а все остальные голосуют за то, принимать это предложение или нет. Человек, который хочет совершить транзакцию, отправляет транзакцию всем во
всей сети, а не только получателю биткоинов. Затем все в сети голосуют
в зависимости от того, была ли транзакция, которую они видели, действительной или нет. Только после получения определенного количества голосов, скажем большинства, транзакция сохраняется.
Когда Анна попытается при таких обстоятельствах удвоить расходы, эта транзакция будет отклонена наблюдателями. Это происходит
по причине того, что Надир и Роман передают это сообщение остальной
части сети, защищаясь таким образом от попыток злонамеренного поведения Анны. Одноранговые узлы в сети голосуют «против» предложения Анны, поскольку они замечают, что несколько транзакций пытаются
потратить одни и те же средства. Транзакция не проходит и не включается в обновление цепочки блоков. Таким образом мы решаем все наши
проблемы, кроме одной: у нас есть система голосования, которая гарантирует, что никто не может дважды потратить одни и те же средства,
и каждый партнер хранит всю историю транзакций, чтобы они могли
сами убедиться в существовании средств, но нет анонимности.
Напомним, что биткоин – это доступная анонимная сеть без центрального реестра. Банки отслеживают личности и учетные записи каждого, но в биткоин нет такой инфраструктуры, чтобы никто не мог создать несколько идентификаторов. В биткоин любой может присоединиться к сети и любой может в ней участвовать. Из-за простоты создания биткоин-адресов ничто не останавливает Анну от создания большего количества идентичностей и выдачи себя за Дениса и Ника. Создание нескольких идентификаторов недорого, требуется только генерация случайного номера. Из-за этой низкой стоимости Алиса может
легко иметь несколько биткоин-идентификаторов, чтобы отдать
больше, чем ей положено, голосов, подтверждающих транзакцию.
Анна, являясь в реальности меньшинством, может легко предлагать
свои вредоносные транзакции и голосовать за них, создав достаточное
количество подтверждений транзакции и заняв большинство в сети.
Другими словами, эта текущая версия консенсуса восприимчива к так
называемой атаке Сибиллы, когда пользователь создает несколько
идентификаторов для какой-то злонамеренной цели. Атака Сибиллы –
это вид атаки в одноранговой (пиринговой) сети, в результате которой
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
