Читать книгу «Введение в технологию Блокчейн» онлайн полностью📖 — Тимура Машнина — MyBook.

Ограничения протокола

Поговорим о некоторых встроенных ограничениях протокола Bitcoin и почему их сложно улучшить.

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


К ним относятся ограничения на среднее время на блок 10 минут, размер блоков 1 мегабайт, количество подписей в блоке 20000, и делимость валюты (биткойны делятся только на 8 знаков после запятой), общее количество биткойнов 21 миллион, и структуру вознаграждения блока, которое начиналось с 50 биткойнов и делится пополам каждые 210000 блоков, и другие ограничения.

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

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

Если это изменится, возникнут большие финансовые последствия для людей.

Поэтому сообщество в основном согласилось с тем, что эти аспекты, независимо от того, были ли они выбраны разумно, не изменятся.

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

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

Сколько транзакций может выполнять сетевой процесс Bitcoin в секунду?

Это ограничение исходит из жесткого кодированного ограничения на размер блоков.

Каждый блок ограничен мегабайтом, около миллиона байт.

Каждая транзакция составляет не менее 250 байт.

Разделив 1,000,000 на 250, мы видим, что каждый блок имеет ограничение в 4000 транзакций, и, учитывая, что блоки добываются примерно каждые 10 минут, у нас получается около 7 транзакций в секунду, что все, что может обслуживать сеть Bitcoin.

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

Однако на практике это очень сложно осуществить по причинам, которые мы рассмотрим.

Итак, с чем сравнить семь транзакций в секунду?

Это довольно медленно по сравнению с пропускной способностью любого крупного оператора кредитных карт.

Например, сеть Visa обслуживает в среднем около 2000 транзакций в секунду по всему миру и способна обрабатывать 10 000 транзакций в секунду в пиковые периоды.

Даже Paypal, который меньше, чем Visa, может обрабатывать 100 транзакций в секунду в пиковые периоды.

Это на порядок больше, чем биткойн.

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

Доступно только несколько алгоритмов хэширования и только один алгоритм подписи (ECDSA, по определенной эллиптической кривой, называемой secp256k1).

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

Криптографы могут придумать умную новую атаку, которую мы не предвидели, что сделает алгоритм небезопасным.

То же самое относится к хэш-функциям; на самом деле, в последние десятилетия хеш-функции усиленно изучались.

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

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

Как мы можем внедрять новые функции в протокол Bitcoin?

Вам может показаться, что это просто – просто выпустить новую версию программного обеспечения и сообщить всем узлам об обновлении.

В действительности, однако, это довольно сложно.

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

Некоторые узлы в сети могут не получить новое программное обеспечение или могут не получить его вовремя.

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

Мы можем различать два типа изменений: те, которые вызовут жесткий форк, и те, которые вызовут мягкий форк.



Жесткий форк, это когда вводятся новые функции, которые раньше считались бы недействительными.

То есть новая версия программного обеспечения распознает блоки как действительные, однако старое программное обеспечение эти блоки отбросит.

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

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

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

Пока они не обновят свое программное обеспечение, они будут считать, что их, более короткая ветка является самой длинной валидной веткой блокчейна.

Этот тип изменений называется жестким форком, поскольку он жестко разделяет цепочку блоков.

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

Конечно, при этом ветки никогда не смогут объединиться снова.

Это считается неприемлемым для сообщества, поэтому старые узлы будут эффективно отключены от сети Bitcoin, если они не обновят свое программное обеспечение.

Второй тип изменений или мягкий форк, которые мы можем внести в биткойн, – это добавление функций, которые делают правила проверки более строгими.

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

Этот тип изменений называется мягким форком, и здесь можно избежать постоянного раскола, который создает жесткий форк.

Подумайте, что произойдет, когда мы представим новую версию программного обеспечения с мягким форком.

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

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

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

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

Это может побудить их обновить программное обеспечение.

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

Таким образом, здесь не будет жесткой развилки; вместо этого будет много маленьких временных вилок.

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

Классическим примером изменения, которое было сделано с помощью мягкого форка, является введение функции pay-to-script-hash, о котором мы говорили ранее.

В первой версии протокола биткойнов нет pay-to-script-hash.

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

С точки зрения старых узлов, скрипт прост – он хэширует одно значение данных и проверяет, соответствует ли этот хэш значению, указанном в выходном скрипте.

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

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

Что мы можем добавить с помощью мягкой вилки?

Кроме Pay-to-script-hash.

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

Мы могли бы также добавить некоторые дополнительные метаданные в параметр coinbase, которые бы что-то значили.

Сегодня любое значение принимается в параметре coinbase.

Но мы могли бы в будущем сказать, что coinbase должнен иметь определенный формат.

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

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

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

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

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

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

Жесткие форки, даже если они были бы успешными, вряд ли произойдут в нынешнем Биткойне.

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

Как хранить и использовать биткойны

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

Чтобы потратить биткойн, вам нужно знать определенную публичную информацию и определенную секретную информацию.

Публичная информация – это то, что происходит в цепочке блоков – движение монеты, ее стоимость и так далее.

Секретная информация – это секретный ключ владельца биткойна.


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

Но секретный ключ цифровой подписи – это то, что вам следует тщательно охранять.

Поэтому на практике хранение биткойнов – это хранение и управление секретными ключами.

Когда вы определяете, как хранить и управлять ключами, нужно иметь в виду три цели.

Первая – это доступность: возможность тратить свои монеты, когда вы этого захотите.

Вторая – это безопасность: нужно быть уверенным, что никто не сможет потратить ваши монеты, кроме вас самих.

Если кто-то получит доступ к ключу, они могут просто отправить ваши монеты себе.

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

Как вы можете себе представить, достижение всех трех целей одновременно может быть проблемой.

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

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

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

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

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

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

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

Так что обычно вы храните немного информации / немного денег в кошельке и храните большую часть своих денег в другом месте.

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



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

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

Программное обеспечение кошелька дает вам простой интерфейс, который показывает вам, сколько монет в вашем кошельке.

И когда вы хотите потратить биткойны, кошелек обрабатывает детали того, какие ключи использовать и как создать новый адрес и т. д.

Чтобы тратить или получать биткойны, вам также нужен способ обмена адресом с другой стороной – адресом, которому должны быть отправлены биткойны.

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



Чтобы закодировать адрес в виде текстовой строки, мы берем биты ключа и преобразуем их из двоичного числа в число base 58.

Что означает base58?

«base» означает число символов, которые вы используете для представления числа.



В своей повседневной жизни мы пользуемся числами base10.

Чем больше символов у вас в базе, тем меньше их вам нужно использовать для представления больших чисел. Таким образом, чем больше база, тем короче число.

Почему используется base58?

58 – это усеченное количество символов алфавитно-цифрового алфавита, где есть 62 символа.

В base58 удалены плохие символы, такие как 0, O, L и I, которые легко можно спутать.

Таким образом, base58 имеет два преимущества:

Эта база дает большой набор символов, чтобы представлять большие числа в более коротком формате.

И эта база не содержит неудобные символы, чтобы вы не ошибались при расшифровке.



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

Таким образом, чтобы закодировать адрес в виде текстовой строки, мы берем биты публичного ключа и преобразуем их из двоичного числа в число base 58.

Затем мы используем набор из 58 символов для представления каждой цифры в качестве символа.



Однако такого ручного метода передачи адресов с помощью строк можно избежать с помощью QR-кода.

Таким образом, второй способ кодирования адреса биткойнов – это QR-код, или двумерный штрих-код.

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

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

Это называется «горячее хранением».

Это удобно, но также рискованно.

С другой стороны, есть «холодное хранение», которое не подключено к Интернету, и которое заархивировано.

Такое хранение более безопасно, но, конечно, не так удобно.

Чтобы иметь отдельное горячее и холодное хранилище, вам нужно иметь отдельные секретные ключи для каждого из них – иначе монеты в холодном хранилище будут уязвимы, если горячее хранилище будет взломано.