Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы технологии блокчейн и криптовалют для менеджеров. Учебное пособие
.pdf
51
Пользователь генерирует случайное число n для своего закрытого ключа. Он использует скалярное умножение точки эллиптической
кривой на n для генерации своего открытого ключа: добавляет известную точку P генератора для secp256k1 n раз. Затем, чтобы сгенерировать адрес, сначала хеширует открытый ключ nP с помощью SHA-256,
а затем – с помощью другой хеш-функции, называемой RIPEMD160.
SHA-256 делает адрес квантово стойким, поскольку квантовые компьютеры, возможно, смогут ломать эллиптические кривые и отменять одностороннее скалярное умножение точек, которое мы определили, но
квантовые компьютеры не могут обращать хеш-функции. Затем
RIPEMD160 сокращает размер адреса с 256 до 160 бит.
Теперь вы спросите: можно ли получить закрытый ключ n при
наличии открытого ключа n? Эта проблема известна как проблема дискретного логарифма эллиптической кривой и известна своей вычислительной невозможностью. Итак, мы можем с уверенностью сказать, что
наша процедура генерации открытых ключей из закрытых ключей достаточно безопасна. Теперь, когда у нас есть открытый ключ, как нам
добраться до нашего адреса? Если бы квантовые компьютеры существовали, мы могли бы использовать их для решения задачи дискретного логарифмирования эллиптической кривой и нахождения закрытого ключа по общему ключу. Квантовые компьютеры не могут реверсировать хеш-функции, поэтому мы решили запустить две хеш-функции для нашего открытого ключа.
Первый – SHA-256, который мы упоминали ранее как хеш-функция,
распространенная во всем протоколе биткоин, и второй – RIPEMD-160, который сокращает размер адреса с 256 до 160 бит. Вместе комбинация использования SHA-256 и RIPEMD-160 называется «двойным хешем» или
HASH160. После всего этого у нас есть хеш открытого ключа.
И после того как у нас есть хеш открытого ключа, нам осталось
совсем немного, а именно дойти до нашего биткоин-адреса. Следующий шаг – сделать хеш публичного ключа более удобным для человека.
Сначала добавляем байт версии перед нашим предыдущим хешем
RIPEMD-160 из последнего раздела. В байте версии указываем, в какой
сети мы находимся: в основной сети биткоин или в меньшей тестовой
сети. Сохраним это и назовем нашим расширенным хешем RIPEMD-160.
Затем запускаем кодирование Base58Check, которое сначала включает
преобразование того, что у нас есть, в базу 58. База 58 – это алфавит,
похожий на наш обычный алфавит, из 62 символов. В нем все однозначные цифры от 0 до 9, а также все буквы верхнего и нижнего регистра,

52
за исключением тех, которые трудно отличить друг от друга. Итак, мы
убираем 0 и заглавную букву O, а также заглавную I и строчную l. Это
сделано во избежание двусмысленности при копировании вашего адреса. Затем вычисляем контрольную сумму. Выполняем SHA-256d для
нашего расширенного хеша RIPEMD-160, дважды выполняя SHA-256.
Берем первые 4 байта нашего хеша SHA-256d в качестве контрольной
суммы и добавляем их в конец нашего расширенного хеша RIPEMD-160.
После преобразования результата в base58 наконец получен наш биткоин-адрес. Если кто-то неправильно наберет или скопирует ваш адрес,
то с учетом контрольной суммы адрес окажется недействительным.
И это то, что программное обеспечение для декодирования сделает за
нас. Он может хешировать начало нашего адреса и сравнивать его
с контрольной суммой, чтобы убедиться, что он действителен.
Перейдем к понятию «сценарий биткоин». Сценарий биткоин,
или просто Скрипт (Script), – это язык, который был разработан для использования биткоин для обработки различных транзакций – от платежей между двумя людьми до более сложных транзакций с несколькими
подписями, что значительно расширяет функциональность биткоин.
Рассмотрим пример того, как Script работает изнутри наиболее распространенного типа транзакции в биткоинах, который заключается в погашении вывода предыдущей транзакции. Чтобы погасить эту предыдущую транзакцию, нам нужно подтвердить свою личность с помощью
открытого ключа, который при хешировании дает адрес, на который
была отправлена предыдущая транзакция, и подписи, подтверждающей
право собственности на закрытый ключ, соответствующий предоставленный нами открытый ключ. Это наиболее распространенный тип
скрипта в системе биткоин Pay to Public Key Hash.
Но как реализовать эту функциональность? Это можно сделать
со скриптами блокировки и разблокировки. Скрипты разблокировки –
это скрипты, которые вы предоставляете в своем вводе, когда хотите
потратить с предыдущей транзакции, что позволяет выкупить связанный биткоин. Вы предоставляете подпись и свой открытый ключ, которые необходимы для подтверждения вашей личности и разблокировки
вывода транзакции. Затем ваш открытый ключ хешируется и проверяется по адресу, которому принадлежит UTXO. Поскольку вы предоставляете подпись, этот сценарий называется ScriptSig.
Скрипты блокировки – это скрипты, которые встречаются в выходных данных предыдущих транзакций. Сценарий блокировки определяет требования для погашения UTXO. Это по сути «блокирует»

53
UTXO, так что потратить его может только тот, кто может его разбло-
кировать.
В нашем примере Pay to Pub Key Hash скрипт блокировки требует, чтобы пользователи доказали, что у них есть закрытый ключ, который хешируется на определенный адрес. По этой причине этот сценарий называется scriptPubKey.Чтобы скрипты разблокировки и блокировки работали в тандеме, мы просто объединяем их. Помещаем сценарий разблокировки поверх сценария блокировки, scriptSig – поверх
scriptPubKey, а затем запускаем их вместе. И весь полученный скрипт
должен успешно выполняться, чтобы транзакция считалась действительной.
Рассмотрим, как создавать произвольные сценарии в схеме, называемой P2SH, или Pay to Script Hash. Для лучшего понимания сравним
плату за хеш скрипта со схемой из предыдущего раздела: оплата за хэш
ключа публикации. И, чтобы создать лучшую ментальную модель, будем объяснять все в терминах сценария поставщик–клиент, где клиент
создает транзакцию для оплаты поставщику. Другими словами, покупатель – это отправитель, а продавец – получатель.
Напомним, что в биткоин отправители указывают сценарий блокировки на выходе транзакции, которую они отправляют, а получатели
предоставляют сценарий разблокировки на входе всякий раз, когда они
хотят выкупить свой биткоин. В этой схеме продавец или получатель
транзакции говорит: «Отправьте свои монеты в хеш этого открытого
ключа». А позже поставщик должен предоставить открытый ключ
и подпись, чтобы получить эти биткоины. Это, безусловно, самый простой и распространенный случай.
С другой стороны, существует более гибкий метод Pay to Script
Hash. Вместо того чтобы платить только за хеш открытого ключа, теперь мы можем платить за более сложный набор инструкций. В этой
схеме поставщик говорит: «Отправьте свои монеты в хеш этого
скрипта. Я предоставлю сценарий и данные, чтобы сценарий оценивался как истинный, когда я получу монеты». Это имеет смысл, потому
что мы не хотим, чтобы поставщики требовали от клиентов сначала создания сложного сценария вывода. Будет гораздо удобнее для клиентов,
если получатель транзакции (поставщик) указывает сценарий.
Напоминаем, как все работает в Pay to Pub Key Hash. Если Борис
хочет получить биткоины от Алисы, Алиса должна иметь доступ к хешу
открытого ключа Бориса. Затем она может отправить транзакцию

54
с оплатой на хеш открытого ключа Бориса. Чтобы Борис мог выкупить
биткоин, который только что отправила ему Алиса, он должен предоставить подпись и полный открытый ключ, удостоверяющий его личность и позволяющий ему тратить средства из этого вывода транзакции.
Теперь предположим, что Борис хочет добавить некоторые дополнительные функции в свою транзакцию с Алисой. Допустим, он хочет использовать два типа скриптов: мультиподпись или временную
привязку. Вместо того чтобы предоставить Алисе хеш открытого
ключа, Борис сначала создает сценарий, берет его хеш и отправляет
Алисе. Затем Алиса может отправить транзакцию с оплатой на хеш сценария Бориса. Чтобы Борис мог выкупить биткоин, который только что
отправила ему Алиса, он должен предоставить подпись и полный сценарий, который он написал.
Так почему же надо платить за хеш сценария, а не просто платить
за скрипт?
Предоставляя клиенту хеш скрипта, поставщик снимает с себя
сложную задачу по составлению биткоин-скрипта. Это особенно полезно с точки зрения продавца-покупателя, когда продавец является получателем биткоинов, а покупатель – отправителем. Допустим, продавец хочет получать деньги и использовать сложные функции, такие как
мультиподпись, но не хочет обременять своих клиентов, заставляя их
писать сложные скрипты. Он просто хочет совершить сделку. Следовательно, все, что требуется от P2SH, – это чтобы отправитель использовал только хеш скрипта для составления скрипта блокировки. Клиента
не волнует, что на самом деле представляет собой сценарий, все что его
волнует – это получить свой товар.
Поставщик должен написать правильный сценарий вывода,
чтобы только получатель мог использовать этот вывод. Также имеет
смысл, чтобы получатель ничего не знал о том, как поставщик хранит
свои средства, чтобы иметь возможность легко отправлять ему деньги.
Pay to Script Hash был обновлением биткоина еще в 2012 г. и с тех
пор является одним из самых важных улучшений биткоина с момента
его создания. Одним из наиболее широко используемых примеров
P2SH является мультиподпись, когда для разблокировки UTXO требуется определенное количество предварительно заданных подписей. Типичная схема с несколькими подписями – это m-of-n, где вам нужно
m из n подписей пользователей, чтобы подписать транзакцию, прежде
чем она будет признана действительной.

Рассмотрим некоторые уникальные преимущества мультиподписи.
Во-первых, схема мультиподписи увеличивает сложность кражи
средств. Вместо того чтобы использовать один закрытый ключ для разблокировки криптовалюты, вор теперь должен иметь минимальное количество ключей, удовлетворяющее требованиям множественной подписи.
Во-вторых, использование нескольких ключей для разблокировки учетных записей предотвращает потери. Перед использованием
мультиподписи потеря одного-единственного закрытого ключа биткоина была бы беспощадной ситуацией. Теперь, например, с адресом 2 из
4 вы все еще можете выкупить средства в пределах адреса, просто
предоставив подписи от двух ключей.
В-третьих, мультиподпись также можно использовать для передачи управления одним адресом нескольким людям. Например, исполнительный совет компании может потребовать, чтобы 3 из 5 руководителей одобрили бюджет, прежде чем фонд может быть потрачен.
Временные блокировки – это тип функциональности в биткоине,
ограничивающей расходование средств до более позднего времени или
определенной высоты блока. Время в этом случае может быть представлено как отметка времени UNIX, высота блока или количество блоков,
построенных поверх блока, содержащего транзакцию. Временные интервалы могут быть абсолютными или относительными.
Абсолютные временные рамки определяют абсолютную точку
в будущем, когда может пройти конкретная транзакция. Это делается
с помощью отметки времени UNIX или высоты блока. С другой стороны, относительные временные интервалы определяют глубину блока
или количество блоков, которые были построены поверх текущего.
Также существует различие между временными блоками на
уровне транзакции и на уровне сценария или на уровне UTXO. Как следует из их названий, временные блоки на уровне транзакции накладывают временную блокировку на саму транзакцию, тогда как временные
блоки на уровне сценария могут накладывать временные блокировки на
определенные UTXO и указываются в сценариях биткоин. Эта временная блокировка гарантирует, что транзакция не может быть включена
в действительный блок до определенного времени в будущем. Однако
предостережение заключается в том, что, поскольку временная блокировка устанавливается только на транзакцию, но не на потраченный
UTXO, отправитель может просто отправить другую транзакцию с расходами из того же UTXO, что и транзакция с временной привязкой.
55

Эта новая транзакция будет выполняться первой, пока первая
транзакция все еще заблокирована по времени. И пока она действительна, новая транзакция фактически аннулирует и переопределяет
транзакцию с временной привязкой, поскольку выходы, которые транзакция с временной привязкой пытается потратить, уже были использованы, тем самым отменяя исходную транзакцию с временной привязкой. Чтобы предотвратить эту угрозу, временная блокировка также может быть установлена на самом UTXO. Временная блокировка уровня
UTXO указывает, что конкретный UTXO не может быть потрачен до
указанного времени. Это гарантирует, что отправитель UTXO не сможет отменить транзакцию, отправив UTXO на другой адрес, до того как
будет разблокирована временная блокировка.
Одно замечание при использовании временных привязок заключается в том, что пользователи должны быть осторожны с истечением срока
действия временной привязки. В блокчейне нет понятия глобального времени, поскольку часы одноранговых узлов в сети потенциально могут
быть отключены. Поэтому надо быть осторожным при использовании абсолютных временных интервалов с временными метками UNIX.
Транзакция, которая кажется готовой к использованию, учитывая, что прошло определенное количество времени, может рассматриваться другими как преждевременная. Кроме того, блоки также не создаются с гарантированными интервалами, поэтому любые попытки отменить транзакцию с временной привязкой следует предпринимать за
несколько часов до истечения времени блокировки, указанного в высоте блока.
56

57
Г л а в а 4 . В З А И М О Д Е Й С Т В И Е С С И С Т Е М О Й
Б И Т К О И Н
В предыдущей главе мы рассмотрели некоторые механизмы работы биткоин, объяснив основные мотивы того, почему и как реализуются процедуры и механизмы в биткоин. А как насчет пользователей?
Как выглядит биткоин с их точки зрения? Если я хочу участвовать в отправке и получении биткоинов, майнинге или запуске полного узла, что
для этого надо сделать и как это будет выглядеть?
Пользовательский опыт сильно различается в зависимости от вашего участия в системе биткоин. Но, независимо от того, являетесь ли
вы обычным пользователем, полным узлом, одиночным майнером или
управляющим майнинговой фермой, вы каким-то образом взаимодействуете с сетью биткоин.
Этот раздел будет касаться различного пользовательского опыта
в экосистеме биткоин. Начнем с краткого обсуждения типов пользователей биткоинов, перейдем к кошелькам как способу управления вашей
идентификацией, а затем формализуем процедуру добычи биткоинов
и исследуем способы майнинга. Наконец, мы рассмотрим различные
способы, с помощью которых пользователи могут изменить биткоин
и его базовый протокол.
Во-первых, мы можем думать только о майнерах или случайных
трейдерах, использующих биржи или собственное программное обеспечение кошельков, но на самом деле существует множество различных типов пользователей биткоин, каждый из которых классифицируется по разному программному обеспечению, которое они запускают,
и по способу взаимодействия с сетью биткоин.
Ранее при обсуждении механики биткоин мы объяснили все
с точки зрения полноценного узла и майнера: пользователь, имеющий
сетевые возможности для взаимодействия с сетью биткоин, активно
поддерживает полную актуальную копию цепочки блоков биткоин,
имеет кошелек как средство управления открытыми и закрытыми ключами, а также утилиты для поддержки сети и получения вознаграждения за майнинг.
Всего существует четыре функции узла: сетевая маршрутизация,
майнинг, поддержка полной цепочки блоков и обработка сервисов кошелька. И обычно полный узел содержит все их. Но обычным клиентам
вся эта функциональность не нужна. Например, не каждый клиент –

58
майнер. Если мой компьютер недостаточно быстр, я не буду получать
прибыль от майнинга, так зачем беспокоиться? Не каждому клиенту нужен весь блокчейн. Если я просто хочу отправить биткоин через свой
телефон, зачем мне загружать блокчейн на 160 гигабайт? В моем телефоне даже не так много памяти! Не каждому клиенту даже нужен кошелек, особенно если они не часто совершают операции. Допустим, вы
всего лишь полноценный узел, на котором размещена вся цепочка блоков, но вам не интересно торговать самостоятельно. Или у вас есть отдельный софт для кошелька.
И наконец, как мы скоро увидим, не каждому клиенту нужно подключаться к сети биткоин или даже к интернету! На самом деле различие между разными типами пользователей заключается не только в этих
четырех основных функциях – майнинг, маршрутизация, наличие полной цепочки блоков и управление ключами через кошельки. Но использование этих функций свидетельствует об опыте пользователя биткоин.
Первый тип пользователей, о которых мы будем говорить, – это
наиболее распространенные пользователи биткоинов, которые не загружают весь блокчейн и не выполняют дополнительные функции.
Этот тип пользователей может отправлять и получать биткоины вместе
с остальной частью сети. При этом кошельки бывают разных форм
и размеров: размещаются в интернете, на вашем компьютере, в цифровом или физическом формате.
Как мы уже упоминали ранее, биткоин – это предоставление виртуальных идентификационных данных реальным объектам. С помощью этих биткоин-идентификаторов мы можем легко подтверждать
право собственности и отправлять биткоины между пользователями.
Как известно, закрытый ключ – это то, что открывает виртуальную личность. Это то, что дает доступ к биткоин-адресу. Но как на самом деле
защитить эти закрытые ключи? Как убедиться, что нас не украдут?
Здесь на помощь приходят кошельки. Основная функция биткоин-кошельков – отслеживать вашу личность. В отличие от того, как
мы используем физические кошельки для удобного хранения и хранения наших физических денег, наши цифровые биткоин-кошельки фактически не позволяют нам хранить биткоины. Биткоин-кошельки – это
просто метод хранения и доступа к вашему закрытому ключу, который
затем позволяет вам потратить соответствующий биткоин. Большинство программ кошельков также будут хранить, отправлять, получать
и перечислять транзакции за вас, поскольку программное обеспечение
может легко это сделать. Было бы невозможно вручную отслеживать

59
всю активность блокчейн, в которой вы участвуете. Чтобы позаботиться об этом, программное обеспечение кошелька будет хранить всю
необходимую информацию о блокчейне от вашего имени.
Кошельки бывают разных форм. Обычно мы делаем различие
между двумя основными категориями кошельков – горячими и холодными – в зависимости от их подключения к интернету. Горячие кошельки подключены к интернету, а холодные – нет. Некоторые примеры горячих кошельков – это приложения для смартфонов, такие как
Mycelium и AirBitz. Существуют также онлайн-кошельки, например на
Blockchain.info и coinbase.com. И все это подключено к интернету.
С другой стороны, холодные кошельки никогда не связаны с интернетом, например бумажные кошельки, аппаратные кошельки. Бумажные
кошельки – это буквально кусочки бумаги с напечатанным на них секретным ключом. Вы можете создавать необычные бумажные кошельки
на таких сайтах, как Bitcoinpaperwallet.com и Bitaddress.org. Для максимальной безопасности эти веб-сайты попросят вас загрузить весь вебсайт и запустить их локально, но только после отключения всего вашего
интернет-соединения для максимальной безопасности. Они также предупреждают об умных принтерах, которые кэшируют файлы, которые
они распечатывают, или об операционных системах, которые тоже могут нанести вред.
В подобных ситуациях пользователям бумажных кошельков
предлагают использовать более «тупой» старомодный принтер, а также
выделить совершенно новый, свежий компьютер только для печати бумажных кошельков. Вот как далеко заходят некоторые люди с целью
обеспечения своей безопасности.
Существуют также аппаратные кошельки, такие как Ledger,
Trezor, Case и Keep Key, которые представляют собой небольшие
устройства, которые подключаются к вашему компьютеру или смартфону через USB или каким-либо другим способом и с помощью которых можно осуществлять транзакции. Идея состоит в том, что, хотя
ваш компьютер может быть подключен к интернету, аппаратный кошелек обрабатывает ваш закрытый ключ и подписывает транзакции
в надежной среде выполнения, которая запускается отдельно от компьютера и никогда не касается интернета.
А еще можно просто запомнить свой закрытый ключ, поскольку
интернет-кошельки могут быть взломаны, ваш смартфон или аппаратный
кошелек могут быть украдены, или вместе с домом может сгореть и бумажный кошелек. Хотя вы можете запомнить свой закрытый ключ, более

60
простой альтернативой будет запоминание набора слов, фраз или мнемоники. Идея состоит в том, чтобы иметь более легко запоминающийся
набор символов, чем ваш прямой закрытый ключ. Например, выберем
12 слов: умножать, отбрасывать, подчинять, выбирать, корректировать,
прекращать, обвинять, заправлять, нос, надеяться, стул, бояться. После
того как я выбрал этот набор, я бы хешировал их вместе, чтобы получить
свой закрытый ключ. Таким образом, я могу обеспечить безопасность кошелька, при этом не имея физических доказательств наличия моего закрытого ключа, просто запомнив свой настоящий закрытый ключ. Однако есть загвоздка. Люди выбирают не такие уж случайные, как мы думаем, слова, и их можно легко угадать – такая атака называется атакой
по словарю. Словарные атаки особенно опасны для тех, кто выбирает
слова из известной цитаты из речи, фильма или книги. В общем, пока
ваши слова не связаны между собой, то дорого и маловероятно, что ктото сможет угадать и успешно атаковать по словарю.
Однако из соображений безопасности, чтобы еще больше снизить вероятность того, что кто-то сможет угадать ваши слова, вы можете использовать так называемое растяжение ключа. Нигде не говорится, какую хеш-функцию вы должны использовать, чтобы получить
из выбранного набора слов свой закрытый ключ, или сколько раз вам
разрешено хешировать, это все зависит от вас как пользователя. Идея
растягивания ключа состоит в том, чтобы хешировать выбранные вами
слова большое количество раз: скажем 220 или другое огромное число.
Итак, я беру свой набор слов «умножать», «отбрасывать», «отправлять» и т. д. И затем много раз эти слова хеширую. Злоумышленник не только должен будет угадать ваш исходный набор слов, но он
также должен будет угадать, сколько раз вы хешировали свой набор
слов. Взломать закрытый ключ, который был подвергнут растяжению,
экспоненциально сложнее, чем набор слов, который хешируется только
один раз.
Существует множество кошельков, определенно намного
больше, чем мы рассмотрели, и поэтому пользователям приходится
проводить собственные исследования, чтобы найти кошелек, который
им лучше всего подходит. Например, часто приходится выбирать
между удобством и безопасностью.
Coinbase.com очень прост в использовании, мобильные приложения доступны более чем в 100 странах, но на самом деле они хранят
ваши личные ключи в облаке. Некоторым пользователям это не нравится, поэтому они доверяют приложению Coinbase Wallet.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
