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

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

.pdf
Скачиваний:
6
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
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.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]