Продолжим вторую часть данной статье в первой части статьи подробно раскрывается важная криптографическая угроза — Digital Signature Forgery, которая представляет значительную опасность для безопасности Bitcoin-транзакций. Исследование включает глубокий анализ действительных инцидентов, среди которых рассматривается масштабная атака на мультиподписной кошелек Copay. Особое внимание уделяется уязвимостям в цифровых подписях и широко применяемой библиотеке xml-crypto, что позволяет злоумышленникам эксплуатировать слабые места в верификации транзакций.
Статья фокусируется на двух значимых проблемах безопасности: уязвимостях CVE-2025-29774 и CVE-2025-29775. Описан механизм, при котором атакующий, используя устаревшие версии библиотеки xml-crypto, способен обойти ключевые проверки, приводя к некорректной обработке транзакционных данных и риску утраты активов. Подробно рассмотрено, как теоретические аспекты эффективно реализуются на практике — включая конкретный пример взлома биткоин-кошелька 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe, в результате которого в июле 2025 года были утрачены средства на сумму 0.059672 BTC (около 7,052 долларов США).
В материале предложены авторитетные рекомендации по усилению кибербезопасности криптовалютных платформ. Описаны современные методы предотвращения подобных атак, включая регулярное обновление библиотек, улучшение контроля цифровых подписей и внедрение дополнительных уровней верификации. Такой детальный разбор кейса и анализ развития угроз актуален для специалистов по информационной безопасности, разработчиков блокчейн-технологий и рядовых пользователей децентрализованных сервисов.
Понимание современных способов обхода защитных механизмов, а также следование представленным советам помогает минимизировать риски финансовых потерь и повысить устойчивость платформ к новым видам атак в быстро меняющемся цифровом мире.
Как работает структура выходного скрипта P2SH?
Рассмотрим указанный в результате десериализации скрипт:
OP_HASH160 06612b7cb2027e80ec340f9e02ffe4a9a59ba762 OP_EQUAL
Этот скрипт отличается от стандартного P2PKH тем, что вместо хэша публичного ключа в нем хранится хэш скрипта погашения (redeemScript) — набора условий, под которыми средства могут быть потрачены.
OP_HASH160 — хеширует данные (в данном случае redeemScript) сначала алгоритмом SHA-256, а затем RIPEMD-160.
06612b7cb2027e80ec340f9e02ffe4a9a59ba762 — 20-байтовый хэш redeemScript.
OP_EQUAL — проверяет, равен ли предоставленный redeemScript этому хэшу.
Процесс тратты средств по P2SH-выходу
Чтобы потратить такие средства, необходимо в входах (scriptSig) транзакции, ссылающейся на этот выход, передать:
Сериализованный redeemScript — исходный скрипт, условия которого закодированы в хэше.
Данные разблокировки — подписи или другие доказательства, которые удовлетворяют условиям redeemScript.
При обработке транзакции узлы сети:
Хешируют redeemScript и сверяют с указанным в output хэшем.
Если хэши совпадают (то есть OP_EQUAL возвращает true), то redeemScript десериализуется и выполняется.
Транзакция признаётся действительной, если redeemScript выполняется корректно, т.е. все условия траты выполняются.
Таким образом, P2SH переносит ответственность за представление и проверку условий траты с отправителя (который создает требуемый скрипт) на того, кто тратит средства.
Преимущества и значение выбора такого механизма
1. Гибкость и сложные сценарии
P2SH позволяет создавать адреса с произвольными, часто многоуровневыми условиями — например, требование мультиподписей (2 из 3, 3 из 5 и т.д.), временные ограничения, логику распределения и многое другое. При этом отправитель просто отправляет средства на компактный хэш адрес, не вдаваясь в технические детали.
2. Экономия места
Вместо хранения полного скрипта в блокчейне, в транзакции хранится лишь его хэш. Это снижает нагрузку на сеть, уменьшает размер блоков и ускоряет проверку транзакций.
3. Повышение безопасности
Так как redeemScript раскрывается и проверяется только во время траты средств, это увеличивает конфиденциальность условий и усложняет попытки несанкционированного доступа. Использование криптографических хеш-функций гарантирует защиту от подделки и изменений — любое небольшое отклонение в скрипте приведёт к другому хэшу и отказу сети принять транзакцию.
4. Удобство для пользователей и программистов
P2SH стандартизирует и упрощает использование сложных смарт-контрактов в Bitcoin, упрощая интеграцию и повышая совместимость с множеством кошельков и сервисов.
Пример применения: мультиподписные кошельки
Классический пример — кошелек, который требует подписи двух из пяти участников для проведения транзакции. С помощью P2SH:
В выходе указан хэш соответствующего скрипта.
Чтобы потратить средства, нужно передать полный сценарий включения мультиподписи в scriptSig с подписями.
Сеть проверяет соответствие хэшей и валидность подписей.
Это делает P2SH идеальным инструментом для корпоративных счетов, совместных хозяйств и других случаев, где требуется контроль доступа. Механизм Pay-to-Script-Hash (P2SH) является фундаментальной частью архитектуры Bitcoin, обеспечивая баланс между:
Безопасностью (защита средств с помощью строгих условий и криптографии),
Эффективностью (хранение только хеша, а не всех деталей),
Гибкостью (поддержка любых, даже сложных условий траты),
Удобством (простой формат адреса и стандарт доступа).
Криптоанализ извлечения первого входа транзакции (ins)
Запустим команду с целью получение информации об одном из входов (input) транзакции с хэшем 6102bfd4bad33443bcb99765c0751b6b8e4e65f4db4e3b65324c5e9e3dac8132. Анализ такого входа важен для понимания механизма авторизации расхода средств на уровне скриптов.
!./darkai -scriptsig 6102bfd4bad33443bcb99765c0751b6b8e4e65f4db4e3b65324c5e9e3dac8132
Результат извлечения первого входа транзакции (ins) представлен в следующем виде:
{
'script': '00483045022100e5d7c59ea1fb5d0285e755dfc09634e1e3af36d12950b9b5d5f92b136021b3d202202c181129443b08dcfb8d9ced30187186c57c96f9cdb3f3914e0798682ea35d2b03493046022100e1f8dbad16926cfa3bf61b66e23b3846323dcabf6c75748bcfad762fc50bfaf402210081d955160b5f8d2b9d09d8838a2cf61f5055009d9031e0e106e19ebab234d949034c695221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53ae',
'outpoint': {
'index': 1,
'hash': 'ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577'
},
'sequence': 4294967295
}
1. Подробный разбор компонентов ScriptSig (script)
Значение поля script — это scriptSig, который используется для разблокировки соответствующего предыдущего выхода транзакции.
Содержимое представляет собой длинную последовательность байтов в шестнадцатеричном формате.
В данном случае это пятикомпонентный скрипт, включающий в себя:
Стандартные цифровые подписи (signature) согласно протоколу ECDSA, как правило, для подтверждения владения приватным ключом.
Публичные ключи, необходимые для проверки подписи.
Возможно, присутствует структура, указывающая на мультиподписные операции (несколько публичных ключей и подписей).
Анализ структуры скрипта:
Начинается с 00, что в контексте scriptSig может означать OP_0, традиционно используемый в мультиподписных сценариях (например, в случае стандарта Pay-to-Script-Hash с мультиподписью, где необходима заглушка).
Далее следуют подписи в формате DER (например, 3045...), обычно они состоят из серии байтов с деталями подписи.
За подписями следуют публичные ключи (по длине и структуре — скорее всего в сжатом формате, т.к. около 33 байт), которые подтверждают принадлежность подписей к корректным владельцам.
В целом, формат скрипта соответствует redeemScript или конструкция, характерная для P2SH мультиподписных транзакций.
2. Outpoint (outpoint)
Содержит данные о предыдущем выходе, который используется в данном входе:
'hash': 'ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577' — это хэш предыдущей транзакции.
'index': 1 — указывает на второй выход (нумерация с нуля), который используется для разблокирования.
Таким образом, вход ссылается на конкретный выход предыдущей транзакции, доказывая, что автор транзакции имеет право его потратить.
3. Sequence (sequence)
Значение 4294967295 (0xFFFFFFFF) является максимальным 32-битовым числом.
В Bitcoin это поле послужит для обозначения, что вход не участвует в механизме Replace-By-Fee (RBF) или не имеет времени/блокировки по Relative Timelock.
Часто используется по умолчанию для неподвижных входов.
Важность scriptSig в контексте безопасности
ScriptSig представляет собой данные для разблокирования средств, которые защищены locking script предыдущего выхода.
В случае P2SH транзакций (часто для мультиподписи) scriptSig содержит:
Подписи участников, подтверждающих право расхода средств.
Оригинальный redeemScript, хеш которого указан в locking script предыдущего выхода.
Успешная проверка scriptSig гарантирует, что автор транзакции действительно обладает необходимыми полномочиями на распоряжение средствами.
Криптоанализ извлечения первого входа транзакции (ins) с указанным хэшем транзакции показал, что:
Вход первой транзакции содержит сложный скрипт разблокировки, включающий цифровые подписи и публичные ключи.
Используется ссылка на конкретный выход другой транзакции ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577:1.
Максимальное значение sequence говорит об отсутствии специальных блокировок или RBF.
Предположительно, речь идёт о P2SH-мультиподписной транзакции, где, для подтверждения траты средств, требуется несколько подписей.
Таким образом, полученные данные позволяют глубже понять механику проверки прав траты средств, используются в обеспечении безопасности сети Bitcoin, а также в разработке и аудите смарт-контрактов на основе Биткоин-скриптов.
Подробный разбор результата извлечении второго выхода (outs)
Запустим команду, чтобы была получена информация об одном из выходов (output) транзакции с идентификатором ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577.
!./darkai -redeemscript ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577
Конкретно был извлечён второй выход (outs) этой транзакции, элемент с индексом 1.
Полученный результат:
{
'value': 350000,
'script': 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'
}
1. Детальный анализ полученных данных значение поля value
Величина: 350,000 сатоши.
Данный объём средств находится во втором выходе указанной транзакции и может быть потрачен при выполнении условий, указанных в соответствующем скрипте.
Перевод в BTC: 350,000 сатоши = 0.0035 BTC
2. Значение поля script
Таким образом, скрипт требует, чтобы для разблокировки (траты средств) пользователь предъявил redeem script, хэш которого совпадает с этим значением.
Значение и роль redeem script в контексте P2SH
Redeem script — это оригинальный скрипт, задающий условия траты средств, например, мультиподпись, сложный сценарий с ограничением по времени и т.п.
В выходах транзакции хранится только хэш от redeem script, что экономит место и защищает детали условий.
Для использования средств, вложенных в данный выход, при создании новой транзакции пользователь должен предоставить в scriptSig сериализованный redeem script, который корректно декодируется и проверяется сетью.
Общее значение результата
Идентификатор транзакции ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577 связан с выходом, который содержит 0.0035 BTC.
Эти средства привязаны к P2SH-адресу, контролируемому скриптом с хэшем 06612b7cb2027e80ec340f9e02ffe4a9a59ba762.
Для того чтобы израсходовать эти средства, необходимо предъявить redeem script, соответствующий этому хэшу, и выполнить условия, заложенные в нём.
Значение полученной информации в более широком контексте
Этот результат позволяет подтвердить, что средства действительно находятся на выходе с условиями Pay-to-Script-Hash.
Понимание структуры таких выходов важно для анализа безопасности, разработки сложных сценариев распределения средств и проверки условий расходования.
Использование P2SH обеспечивает надёжный и эффективный механизм управления средствами в сети Bitcoin, позволяющий создавать умные контракты и защищённые кошельки.
Полученная информация подтверждает, что во второй выходной записи транзакции ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577 хранится сумма 0.0035 BTC, контролируемая стандартным P2SH-скриптом с hash160 значением 06612b7cb2027e80ec340f9e02ffe4a9a59ba762. Для распоряжения этими средствами необходимо предъявить соответствующий redeem script, что обеспечивает высокий уровень безопасности и гибкости в управлении биткоинами.
Подтвердим расшифровку scriptSig:
OP_FALSE 304502... 304602... 5221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53ae
Запустим команду для получение HASH160 разработчики Биткоина установили стандарт для 20-байтовый хэш (hex) который без изменение широко используется в других популярных криптовалютах таких как Bitcoin (BTC), Ethereum (ETH), Tether (USDT), BNB (BNB), Solana (SOL), XRP (XRP), Cardano (ADA), Dogecoin (DOGE), USDC (USDC), Polkadot (DOT), Avalanche (AVAX), Shiba Inu (SHIB), Stellar (XLM), TRON (TRX), Chainlink (LINK), Litecoin (LTC), Bitcoin Cash (BCH), Monero (XMR) для обозначения сокращенного идентификатора скриптов и публичных ключей.
!./darkai -hexdata 5221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53ae
Исходная строка, представленная в шестнадцатеричном формате, преобразуется в последовательность байтов (декодируется из hex в двоичный формат). Данная последовательность представляет собой сериализованный скрипт (redeem script) или схожую структуру биткоин-скрипта.
К полученным байтам применяется алгоритм хеширования SHA-256 (однократный хэш), результат которого далее обрабатывается криптографической функцией RIPEMD-160.
Итоговый хэш RIPEMD-160 от SHA-256 бинарных данных получается в виде строки:
06612b7cb2027e80ec340f9e02ffe4a9a59ba762
Этот 20-байтовый хэш (hex) называется HASH160 и широко используется в Bitcoin для обозначения сокращенного идентификатора скриптов и публичных ключей.
Значение и контекст результата
Процесс хеширования RIPEMD-160(SHA-256(data)), известный как HASH160, является стандартом для создания адресов и скриптов в Bitcoin, включая P2SH (Pay-to-Script-Hash). HASH160 обеспечивает уникальный и компактный идентификатор, позволяющий экономить место в блокчейне.
Применение двойного хэширования (SHA-256, затем RIPEMD-160) сочетается в себе сильные криптографические свойства обеих функций: стойкость к коллизиям, односторонность и устойчивость к атакам.
Полученный хэш соответствует скрипт-хэшу (script hash) redeem script — то есть тому скрипту, который контролирует доступ к средствам, заблокированным по адресу P2SH.
В частности, этот HASH160 фигурирует в locking script (scriptPubKey) выходов конкретных транзакций, что требует при тратах предоставить сам исходный redeem script с таким же хэшом и корректные подписи.
Технические подробности и пояснения
В Bitсoin существует концепция двойного хэширования SHA-256 и RIPEMD-160 для защиты адресов и скриптов.
Использование HASH160 вместо простой 256-битной выдачи SHA-256 уменьшает длину хэша с 32 байт до 20 байт, что уменьшает размер хранилища и данных в сети.
HASH160 применяется при формировании преимущественно P2SH-адресов и legacy P2PKH-адресов.
Ключевой шаг в обработке Биткоин-скриптов с помощью криптографических хэш-функций.
Преобразование сериализованных скриптов или публичных ключей в HASH160 позволяет эффективно идентифицировать, индексировать и защищать данные в блокчейне Bitcoin.
{'06612b7cb2027e80ec340f9e02ffe4a9a59ba762'}
Команда вывела именно тот хэш, который служит связующим звеном между сложными скриптами и компактным форматом, применяемым при хранении и проверке транзакций в сети Bitcoin.
Почему Satoshi выбрал двойное SHA-256, и как это влияет на криптографическую стойкость
Сатоши Накамото выбрал использование двойного хеширования SHA-256 (то есть применение SHA-256 дважды подряд) в алгоритмах хеширования Bitcoin по нескольким важным причинам, которые усиливают криптографическую стойкость и безопасность сети.
Причины выбора двойного SHA-256
Повышение стойкости к различным атакам
Однократное применение SHA-256 уже обладает высокой криптографической стойкостью, устойчиво к коллизиям и предобразам. Однако двойное применение хеш-функции — сначала SHA-256 к исходным данным, затем SHA-256 к результату — дополнительно усложняет анализ и атаки на хэш.
Это снижает вероятность успешного подбора коллизии или обратного восстановления исходных данных, делает более трудоемким подбор различных вариантов и защищает от слабостей возможных в конкретных реализациях алгоритма.
Защита от проблем с длиной входных данных
Двойной SHA-256 обеспечивает дополнительный уровень превентивной безопасности с учётом поведения внутреннего построения хеша и обработки дополняющих битов в разметке данных. Это минимизирует потенциальные атаки, связанные с форматированием данных.
Следование проверенной криптографической практике
В ряде криптографических протоколов двойное хеширование — признанный приём повышения устойчивости. Например, для контрольных сумм и цифровых подписей используется двойное шифрование или двойное хеширование. Это повышает надёжность цепочки защиты.
Проверенная безопасность и широкая поддержка
SHA-256 входит в семейство SHA-2, разработанное Агентством национальной безопасности США (NSA) и опубликованное Национальным институтом стандартов и технологий (NIST). Этот алгоритм на сегодняшний день считается одним из самых надёжных и его двойное применение обеспечивает максимальную безопасность.
Как это влияет на криптографическую стойкость
Устойчивость к столкновениям и предобразам
Каждый из этапов SHA-256 обладает высокой стойкостью к коллизиям — крайне сложно найти два входа с одинаковым хешем. Двойное хеширование усиливает эту гарантию, поскольку атакующий должен найти коллизию для двух последовательных SHA-256, что значительно повышает вычислительную сложность.
Односторонняя функция с лавинным эффектом
Двойное применение усиливает «лавинный эффект», при котором малейшее изменение входных данных вызывает радикальное изменение выходного хеша, что затрудняет выявление закономерностей и обратный анализ.
Повышенная стойкость к криптоанализу
Двойной SHA-256 защищает от потенциальных слабостей в реализации или неожиданных уязвимостей, которые могли бы быть обнаружены в одной итерации, минимизируя риски атак с помощью квантовых или классических вычислительных средств.
Применимость в Proof-of-Work и безопасности блокчейна
Механизм PoW в Bitcoin опирается на вычисление хэшей блоков, которые должны удовлетворять определённой сложности. Двойное хеширование создаёт дополнительный барьер для подделки блоков, повышая надёжность и доверие к цепочке блоков5.
Двойное применение SHA-256 — это осознанный выбор Сатоши Накамото, направленный на обеспечение дополнительного уровня защиты и устойчивой криптографической стойкости всей системы Bitcoin. Такая конструкция минимизирует риски коллизий, усиливает односторонность и надёжно защищает данные в блокчейн-сети, создавая прочный фундамент для безопасности транзакций и консенсуса в системе. Таким образом, двойной SHA-256 — это ключевой элемент архитектуры Bitcoin, сочетающий передовые криптографические методы с распределённой системы.
Мультиподпись в Bitcoin: роль redeemScript и инструкция OP_CHECKMULTISIG
В основе безопасности и гибкости современных биткоин-транзакций лежит скриптовая система, позволяющая реализовывать сложные условия расходования средств. Одним из ключевых механизмов является мультиподпись (multisig), когда средства можно потратить только при наличии нескольких допустимых цифровых подписей из набора возможных. В данной статье подробно рассмотрим, как именно это реализовано в Bitcoin, что такое redeemScript, как работает инструкция OP_CHECKMULTISIG, и почему подобный подход востребован.
Что такое redeemScript?
В контексте Bitcoin, redeemScript — это скрипт, содержащий условия траты средств, которые хранятся на выходе транзакции в формате Pay-to-Script-Hash (P2SH). Вместо хранения полного скрипта в блокчейне, в выходе сохраняется хэш redeemScript, что позволяет экономить место и скрывать детали условий до момента траты.
RedeemScript может включать в себя, например, несколько публичных ключей и пороговое количество подписей — именно это и реализует мультиподписные кошельки.
Как работает OP_CHECKMULTISIG?
Рассмотрим инструкцию OP_CHECKMULTISIG: назначение и работа, где главный элемент в redeemScript, реализующий проверку мультиподписи, — OP_CHECKMULTISIG.
Инструкция получает на вход две группы данных из стека:
N открытых ключей (например, три публичных ключа)
M подписей (например, две подписи), где M ≤ N — это необходимый порог подписей для подтверждения транзакции.
Для валидации транзакции OP_CHECKMULTISIG проверяет, что каждая из M подписей корректно подписана каким-либо из N публичных ключей.
Если все подписи валидны и соответствуют ключам из redeemScript, инструкция возвращает true, позволяя траты средств.
Особенности и баг с удалением элемента из стека
Из-за исторической ошибки в реализации OP_CHECKMULTISIG при выполнении из стека удаляется один дополнительный элемент, неиспользуемое значение. Чтобы избежать проблем, в scriptSig используется специальный элемент OP_FALSE (значение 0) в начале, который компенсирует этот баг и предотвращает потенциальные уязвимости.
Далее мы рассмотрим реализацию OP_CHECKMULTISIG при котром из стека удаляется один дополнительный элемент с помощью этого бага злоумышленник компенсирует OP_CHECKMULTISIG как потенциальную уязвимость.
Таким образом, структура scriptSig для мультиподписи выглядит примерно как: OP_FALSE <signature1> <signature2> ... <redeemScript> где первый элемент скрипта — фиктивный OP_FALSE.
Практический пример: мультиподпись 2 из 3
Исходя из кода redeemScript:
023927... 03d2c0... 03ec01... 3 OP_CHECKMULTISIG
Здесь объявлено 3 публичных ключа.
Порог — 2 подписи из этих трёх необходимы для успешного подтверждения.
Операция OP_CHECKMULTISIG проверяет, что две предоставленные подписи (в scriptSig) соотносятся с двумя ключами из трёх и являются валидными.
OP_FALSE в scriptSig компенсирует баг удаления лишнего значения.
Значение и преимущества мультиподписных кошельков
Повышенная безопасность. Владелец кошелька может распределить контроль над средствами между несколькими лицами или устройствами, исключая возможность одиночного несанкционированного расходования.
Гибкость. Могут быть реализованы различные схемы, например, «2 из 3», «3 из 5», с различными условиями.
Юридическая эффективность. Мультиподписи часто используются в корпоративной среде для обеспечения совместного управления активами.
Технический и практический контекст
Мультиподписные сценарии широко применяются в P2SH- и SegWit-транзакциях.
Инструкция OP_CHECKMULTISIG входит в набор самых ресурсоёмких операций в блокчейне, так как требует проверки нескольких подписей. На уровне протокола существует ограничение по количеству сигнальных операций (sigops) на блок.
Несмотря на историю с OP_FALSE, механизм доказал свою надежность и получил широкое применение.
RedeemScript с использованием инструкции OP_CHECKMULTISIG — сложный и мощный инструмент в арсенале Bitcoin, который позволяет создавать мультиподписные кошельки с порогом подписей, обеспечивая высокий уровень безопасности и контроля над средствами. Этот механизм стал краеугольным камнем для организаций, пользователей и сервисов, желающих использовать совместное управление своими активами в децентрализованной и защищённой среде. Таким образом, мультиподпись через redeemScript и OP_CHECKMULTISIG — это не просто технология, а функциональность расширяющая возможности классической криптовалютной модели.
Как работает механизм проверки мультиподписей в Bitcoin с помощью OP_CHECKMULTISIG и redeemScript
Механизм проверки мультиподписей в Bitcoin основан на использовании специальных скриптов с инструкцией OP_CHECKMULTISIG и redeemScript, что позволяет реализовать пороговое согласование подписей, обеспечивая повышенную безопасность и совместное управление средствами.
Основы механизма мультиподписей
Мультиподпись — это система, в которой для совершения транзакции требуется несколько действительных подписей из заданного набора публичных ключей. Типичная схема обозначается как m из n — например, «2 из 3», где из трёх ключей нужны любые две подписи для авторизации траты.
В Bitcoin эта логика реализована через:
redeemScript — скрипт, описывающий условия траты средств. Он содержит список публичных ключей и параметр порога (m).
scriptSig — скрипт разблокировки, включающий подписи, необходимые для подтверждения, и сам redeemScript.
Как устроен redeemScript
Инструкция OP_CHECKMULTISIG проверяет, что предоставленные в scriptSig подписи валидны и соотносятся с опубликованными публичными ключами из redeemScript.
RedeemScript структурирован примерно так:
OP_M <pubkey1> <pubkey2> ... <pubkeyN> OP_N OP_CHECKMULTISIG
OP_M и OP_N — инструкции, задающие число необходимых подписей и общее количество публичных ключей соответственно (к примеру, OP_2 и OP_3).
<pubkeyX> — публичные ключи участников.
OP_CHECKMULTISIG — оператор, реализующий проверку мультиподписей.
Она принимает на вход несколько подписей и набор публичных ключей.
Для успешной проверки каждая подпись должна корректно соответствовать одному из указанных публичных ключей.
Операция возвращает true, если количество валидных подписей достигает порога m.
Важной технической особенностью является историческая ошибка реализации OP_CHECKMULTISIG, из-за которой из стека удаляется лишний, неиспользуемый элемент. Для компенсации этого бага в scriptSig в начале помещается значение OP_FALSE (код 0), чтобы «заблокировать» сдвиг стека.
Как устроена структура scriptSig
Для кошелька с мультиподписью «2 из 3» перед трата средств формируется scriptSig в виде:
OP_FALSE <signature1> <signature2> <redeemScript>
OP_FALSE — фиктивное значение для компенсации бага OP_CHECKMULTISIG.
<signature1> и <signature2> — две цифровые подписи, авторизованные владельцами соответствующих приватных ключей.
<redeemScript> — сам скрипт с публичными ключами и параметрами проверки.
Во время проверки транзакции нода:
Извлекает redeemScript из scriptSig.
Хеширует его и сравнивает с хешем, который хранится в locking script (scriptPubKey) предыдущего выхода (P2SH-формат — OP_HASH160 <redeemScript hash> OP_EQUAL).
Если хеши совпадают, десериализует redeemScript.
Выполняет оператор OP_CHECKMULTISIG, сравнивая подписи и ключи на предмет соответствия.
Возвращает true, если проверки пройдены успешно.
Если все входы транзакции проходят подобную проверку, транзакция считается валидной. При такой валидности с помощью выполнение оператора этого бага злоумышленник компенсирует OP_CHECKMULTISIG как потенциальную уязвимость.
Механизма мультиподписи через redeemScript и OP_CHECKMULTISIG
Повышенная безопасность: Чтобы провести транзакцию, необходимо согласие нескольких держателей приватных ключей, что снижает риски кражи при компрометации одного ключа.
Гибкость и масштабируемость: Можно задать произвольный порог подписей (от 1 до 15), а также список участников — от 2 до 15 публичных ключей.
Коллективное управление активами: Подходит для корпоративных счетов, совместных кошельков, DAO, позволяя внедрять надежный контроль доступа.
Прозрачность и проверяемость: Все необходимые данные и условия находятся в блокчейне, а проверка операций происходит автоматически, децентрализованно и прозрачно.
Механизм проверки мультиподписей в Bitcoin при помощи команды OP_CHECKMULTISIG и redeemScript позволяет устанавливать сложные пороговые схемы подписей, с помощью выполнение оператора этого бага злоумышленник компенсирует OP_CHECKMULTISIG как потенциальную уязвимость контролируемой транзакций в распределённой сети Биткоин.
Опубликованы три части [№1] , [№2] , [№3] исследования
Данный материал создан для портала CRYPTO DEEP TECH для обеспечения финансовой безопасности данных и криптографии на эллиптических кривых secp256k1 против слабых подписей ECDSA в криптовалюте BITCOIN. Создатели программного обеспечения не несут ответственность за использование материалов.