Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основы технологии блокчейн и криптовалют для менеджеров. Учебное пособие

.pdf
Скачиваний:
6
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
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
консенсуса не было! Вместо того чтобы принимать разрозненные реше­ния, как мы делали раньше, внедрим систему предлагающих и избира­телей. Один человек вносит предложения об обновлении, а все осталь­ные голосуют за то, принимать это предложение или нет. Человек, ко­торый хочет совершить транзакцию, отправляет транзакцию всем во всей сети, а не только получателю биткоинов. Затем все в сети голосуют в зависимости от того, была ли транзакция, которую они видели, дей­ствительной или нет. Только после получения определенного количе­ства голосов, скажем большинства, транзакция сохраняется.
Когда Анна попытается при таких обстоятельствах удвоить рас­ходы, эта транзакция будет отклонена наблюдателями. Это происходит по причине того, что Надир и Роман передают это сообщение остальной части сети, защищаясь таким образом от попыток злонамеренного пове­дения Анны. Одноранговые узлы в сети голосуют «против» предложе­ния Анны, поскольку они замечают, что несколько транзакций пытаются потратить одни и те же средства. Транзакция не проходит и не включа­ется в обновление цепочки блоков. Таким образом мы решаем все наши проблемы, кроме одной: у нас есть система голосования, которая гаран­тирует, что никто не может дважды потратить одни и те же средства, и каждый партнер хранит всю историю транзакций, чтобы они могли сами убедиться в существовании средств, но нет анонимности.
Напомним, что биткоин – это доступная анонимная сеть без цен­трального реестра. Банки отслеживают личности и учетные записи каж­дого, но в биткоин нет такой инфраструктуры, чтобы никто не мог со­здать несколько идентификаторов. В биткоин любой может присоеди­ниться к сети и любой может в ней участвовать. Из-за простоты созда­ния биткоин-адресов ничто не останавливает Анну от создания боль­шего количества идентичностей и выдачи себя за Дениса и Ника. Со­здание нескольких идентификаторов недорого, требуется только гене­рация случайного номера. Из-за этой низкой стоимости Алиса может легко иметь несколько биткоин-идентификаторов, чтобы отдать больше, чем ей положено, голосов, подтверждающих транзакцию. Анна, являясь в реальности меньшинством, может легко предлагать свои вредоносные транзакции и голосовать за них, создав достаточное количество подтверждений транзакции и заняв большинство в сети. Другими словами, эта текущая версия консенсуса восприимчива к так называемой атаке Сибиллы, когда пользователь создает несколько идентификаторов для какой-то злонамеренной цели. Атака Сибиллы – это вид атаки в одноранговой (пиринговой) сети, в результате которой
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]