Биткойн часто называют программируемыми деньгами. Его цифровая природа предоставляет пользователям повышенную гибкость в определении условий использования своих средств.
Когда речь заходит о Биткойне, обсуждения обычно вращаются вокруг кошельков и монет. Однако более точное понимание заключалось бы в том, чтобы рассматривать кошельки как ключи, монеты как чеки, а блокчейн как безопасный сейф. Каждый сейф имеет узкое отверстие, через которое можно вставлять чеки или проверять содержимое. Доступ к самому сейфу остается ограниченным для тех, кто обладает правильным ключом.
Когда держатель ключа желает перевести средства, он разблокирует хранилище. Этот процесс включает в себя создание нового чека, ссылающегося на оригинальный (, который становится недействительным ) и надежно хранится в хранилище, доступном только предполагаемому получателю. Новый получатель следует тем же шагам при использовании этих средств.
В этой статье рассматривается Bitcoin Script - язык программирования, который узлы сети Bitcoin используют для управления механизмами блокировки и разблокировки этих цифровых хранилищ.
Механика транзакций Биткойна
Следуя нашей аналогии, каждая транзакция Bitcoin состоит из двух основных компонентов: ключа ( для доступа к хранилищу) и замка. Ключ открывает хранилище, содержащее чек, который вы хотите перевести, в то время как новый чек помещается в другое хранилище, защищенное другим замком. Доступ к средствам из этого нового хранилища требует другого конкретного ключа.
Эта система предлагает замечательную гибкость. Сеть поддерживает различные типы блокировок - некоторые сейфы могут требовать несколько ключей, другие могут требовать подтверждения полномочий для доступа. Пользователи могут настраивать множество условий в соответствии со своими конкретными требованиями.
В техническом смысле ключ называется scriptSig, а замок называется scriptPubKey. При более детальном рассмотрении эти компоненты представляют собой комбинации фрагментов данных и блоков кода, которые вместе образуют компактную программу.
Во время выполнения транзакции это сочетание распространяется по сети. Каждый принимающий узел проверяет действительность транзакции. Неудачная проверка приводит к недоступности средств.
Чеки (монеты) технически известны как неиспользованные выходы транзакций (UTXO). Любой пользователь, обладающий соответствующим ключом, может использовать эти средства. В частности, scriptSig выполняет функцию ключа, в то время как scriptPubKey служит замком.
Если ваш кошелек содержит UTXO, они, скорее всего, имеют условие, которое гласит, что только лица, которые могут доказать право собственности на определенный открытый ключ, могут разблокировать связанные средства. Чтобы разблокировать их, вы должны предоставить цифровую подпись scriptSig с закрытым ключом, соответствующим открытому ключу, указанному в scriptPubKey.
Основы Биткойн Стека
Скрипт работает как язык, основанный на стеке. Инструкции располагаются в вертикальном столбце, а выполнение начинается с верхнего элемента. Например, элементы A, B и C формируют стек, где C находится на вершине, а A на дне. При выполнении инструкций операции начинаются с элементов верхней части стека.
Элементы добавляются в стек и "выталкиваются" из него во время выполнения.
Элементы данных (, такие как подписи, хеши и открытые ключи ), отличаются от инструкций ( или опкодов ). Инструкции удаляют данные и выполняют операции с ними. Рассмотрим этот упрощенный пример:
** **
Данные отображаются красным, опкоды синим. Читая слева направо, строка сначала попадает в стек. Опкод (гипотетический для этого примера) затем удаляет верхний элемент стека () и применяет хеширование MD5, помещая результат обратно в стек: d16fb36f0911f878998c136191af705e.
Далее, добавляется в стек, в результате чего появляются два идентичных элемента. Наконец, удаляет два верхних элемента и сравнивает их, добавляя <1> в стек, если они идентичны, или <0>, если они различны.
Достигнув конца списка инструкций, проверка скрипта подчиняется двум правилам: ошибка возникает, если оставшийся элемент равен null или если инструкция завершается неудачей из-за невыполненных условий. В этом примере ни одно из условий не применимо - у нас есть ненулевой элемент (\u003c1\u003e), что подтверждает действительность скрипта. Эти же правила регулируют реальные транзакции Bitcoin.
Платеж на публичный ключ (P2PK)
Pay-to-Pubkey (P2PK) представляет собой наиболее элементарную форму транзакции. Он блокирует средства на конкретном открытом ключе. Чтобы получить средства таким образом, получатели должны предоставить отправителям свой открытый ключ, а не адрес Bitcoin.
Первая транзакция между Сатоши Накамото и Халом Финни в 2009 году использовала P2PK. Эта структура была распространена в ранние дни Биткойна, но в значительной степени была заменена на Pay-to-Pubkey-Hash (P2PKH).
Скрипт блокировки для P2PK следует простому формату: OP_CHECKSIG. Как следует из названия, OP_CHECKSIG проверяет подпись по предоставленному открытому ключу. Соответствующий scriptSig просто содержит .
Процесс выполнения не может быть более простым: подпись попадает в стек, за ней следует открытый ключ. OP_CHECKSIG проверяет оба элемента и сопоставляет подпись с открытым ключом. В случае совпадения к стеку добавляется <1>; в противном случае появляется <0>.
P2PK вышел из употребления, причины чего будут рассмотрены в следующем разделе.
Плата за пабки-хащ (P2PKH)
Pay-to-Pubkey-Hash (P2PKH) представляет собой наиболее распространенный тип транзакции в сети Bitcoin. Современное программное обеспечение для кошельков обычно реализует этот формат по умолчанию.
Скрипт scriptPubKey для P2PKH имеет следующую структуру:
OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG
Прежде чем рассмотреть соответствующий scriptSig, давайте поймем задействованные опкоды:
ОП_DUP
OP_DUP удаляет верхний элемент, создает его дубликат и помещает обе версии обратно в стек. Это позволяет выполнять операции с копией, сохраняя оригинал.
OP_HASH160
Этот опкод удаляет верхний элемент и применяет двойное хеширование: сначала SHA-256, затем RIPEMD-160 к выходным данным SHA-256. Полученный хеш возвращается в стек.
OP_EQUALVERIFY
OP_EQUALVERIFY сочетает в себе две операции: OP_EQUAL и OP_VERIFY. OP_EQUAL удаляет два элемента и проверяет их идентичность, помещая <1>, если они идентичны, или <0>, если они различны. OP_VERIFY удаляет верхний элемент и проверяет его истинность (non-null). В сочетании как OP_EQUALVERIFY это приводит к сбою транзакции, если верхние два элемента не совпадают.
Соответствующая структура scriptSig выглядит следующим образом:
** <открытый ключ="">**
Чтобы разблокировать P2PKH-выходы, необходимо предоставить как действительную подпись, так и соответствующий открытый ключ.
Этот процесс основан на потоке выполнения P2PK, добавляя проверку того, что предоставленный открытый ключ соответствует хэшу, встроенному в скрипт.
Важное различие: в скриптах блокировки P2PKH открытый ключ остается скрытым - виден только его хеш. Изучение неиспользуемого вывода P2PKH в блокчейн-эксплорерах не показывает информации об открытом ключе. Ключ становится видимым только тогда, когда получатель переводит средства.
Этот подход предлагает несколько преимуществ. Во-первых, хеши открытых ключей обеспечивают более компактную передачу, чем полные открытые ключи - это стало причиной реализации Сатоши в 2009 году. Эти хеши открытых ключей представляют собой адреса Bitcoin, которыми обмениваются пользователи.
Во-вторых, хеширование публичного ключа вводит дополнительный уровень безопасности против угроз квантовых вычислений. Поскольку публичный ключ остается скрытым до момента осуществления транзакции, определение соответствующего приватного ключа становится значительно более сложной задачей. Любая атака потребует реверсирования двух последовательных хеширующих операций (RIPEMD-160 и SHA-256).
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
Декодирование Биткойн-скрипта: Язык программирования за Цифровыми деньгами
Введение
Биткойн часто называют программируемыми деньгами. Его цифровая природа предоставляет пользователям повышенную гибкость в определении условий использования своих средств.
Когда речь заходит о Биткойне, обсуждения обычно вращаются вокруг кошельков и монет. Однако более точное понимание заключалось бы в том, чтобы рассматривать кошельки как ключи, монеты как чеки, а блокчейн как безопасный сейф. Каждый сейф имеет узкое отверстие, через которое можно вставлять чеки или проверять содержимое. Доступ к самому сейфу остается ограниченным для тех, кто обладает правильным ключом.
Когда держатель ключа желает перевести средства, он разблокирует хранилище. Этот процесс включает в себя создание нового чека, ссылающегося на оригинальный (, который становится недействительным ) и надежно хранится в хранилище, доступном только предполагаемому получателю. Новый получатель следует тем же шагам при использовании этих средств.
В этой статье рассматривается Bitcoin Script - язык программирования, который узлы сети Bitcoin используют для управления механизмами блокировки и разблокировки этих цифровых хранилищ.
Механика транзакций Биткойна
Следуя нашей аналогии, каждая транзакция Bitcoin состоит из двух основных компонентов: ключа ( для доступа к хранилищу) и замка. Ключ открывает хранилище, содержащее чек, который вы хотите перевести, в то время как новый чек помещается в другое хранилище, защищенное другим замком. Доступ к средствам из этого нового хранилища требует другого конкретного ключа.
Эта система предлагает замечательную гибкость. Сеть поддерживает различные типы блокировок - некоторые сейфы могут требовать несколько ключей, другие могут требовать подтверждения полномочий для доступа. Пользователи могут настраивать множество условий в соответствии со своими конкретными требованиями.
В техническом смысле ключ называется scriptSig, а замок называется scriptPubKey. При более детальном рассмотрении эти компоненты представляют собой комбинации фрагментов данных и блоков кода, которые вместе образуют компактную программу.
Во время выполнения транзакции это сочетание распространяется по сети. Каждый принимающий узел проверяет действительность транзакции. Неудачная проверка приводит к недоступности средств.
Чеки (монеты) технически известны как неиспользованные выходы транзакций (UTXO). Любой пользователь, обладающий соответствующим ключом, может использовать эти средства. В частности, scriptSig выполняет функцию ключа, в то время как scriptPubKey служит замком.
Если ваш кошелек содержит UTXO, они, скорее всего, имеют условие, которое гласит, что только лица, которые могут доказать право собственности на определенный открытый ключ, могут разблокировать связанные средства. Чтобы разблокировать их, вы должны предоставить цифровую подпись scriptSig с закрытым ключом, соответствующим открытому ключу, указанному в scriptPubKey.
Основы Биткойн Стека
Скрипт работает как язык, основанный на стеке. Инструкции располагаются в вертикальном столбце, а выполнение начинается с верхнего элемента. Например, элементы A, B и C формируют стек, где C находится на вершине, а A на дне. При выполнении инструкций операции начинаются с элементов верхней части стека.
Элементы добавляются в стек и "выталкиваются" из него во время выполнения.
Элементы данных (, такие как подписи, хеши и открытые ключи ), отличаются от инструкций ( или опкодов ). Инструкции удаляют данные и выполняют операции с ними. Рассмотрим этот упрощенный пример:
** **
Данные отображаются красным, опкоды синим. Читая слева направо, строка сначала попадает в стек. Опкод (гипотетический для этого примера) затем удаляет верхний элемент стека () и применяет хеширование MD5, помещая результат обратно в стек: d16fb36f0911f878998c136191af705e.
Далее, добавляется в стек, в результате чего появляются два идентичных элемента. Наконец, удаляет два верхних элемента и сравнивает их, добавляя <1> в стек, если они идентичны, или <0>, если они различны.
Достигнув конца списка инструкций, проверка скрипта подчиняется двум правилам: ошибка возникает, если оставшийся элемент равен null или если инструкция завершается неудачей из-за невыполненных условий. В этом примере ни одно из условий не применимо - у нас есть ненулевой элемент (\u003c1\u003e), что подтверждает действительность скрипта. Эти же правила регулируют реальные транзакции Bitcoin.
Платеж на публичный ключ (P2PK)
Pay-to-Pubkey (P2PK) представляет собой наиболее элементарную форму транзакции. Он блокирует средства на конкретном открытом ключе. Чтобы получить средства таким образом, получатели должны предоставить отправителям свой открытый ключ, а не адрес Bitcoin.
Первая транзакция между Сатоши Накамото и Халом Финни в 2009 году использовала P2PK. Эта структура была распространена в ранние дни Биткойна, но в значительной степени была заменена на Pay-to-Pubkey-Hash (P2PKH).
Скрипт блокировки для P2PK следует простому формату: OP_CHECKSIG. Как следует из названия, OP_CHECKSIG проверяет подпись по предоставленному открытому ключу. Соответствующий scriptSig просто содержит .
Процесс выполнения не может быть более простым: подпись попадает в стек, за ней следует открытый ключ. OP_CHECKSIG проверяет оба элемента и сопоставляет подпись с открытым ключом. В случае совпадения к стеку добавляется <1>; в противном случае появляется <0>.
P2PK вышел из употребления, причины чего будут рассмотрены в следующем разделе.
Плата за пабки-хащ (P2PKH)
Pay-to-Pubkey-Hash (P2PKH) представляет собой наиболее распространенный тип транзакции в сети Bitcoin. Современное программное обеспечение для кошельков обычно реализует этот формат по умолчанию.
Скрипт scriptPubKey для P2PKH имеет следующую структуру:
OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG
Прежде чем рассмотреть соответствующий scriptSig, давайте поймем задействованные опкоды:
ОП_DUP
OP_DUP удаляет верхний элемент, создает его дубликат и помещает обе версии обратно в стек. Это позволяет выполнять операции с копией, сохраняя оригинал.
OP_HASH160
Этот опкод удаляет верхний элемент и применяет двойное хеширование: сначала SHA-256, затем RIPEMD-160 к выходным данным SHA-256. Полученный хеш возвращается в стек.
OP_EQUALVERIFY
OP_EQUALVERIFY сочетает в себе две операции: OP_EQUAL и OP_VERIFY. OP_EQUAL удаляет два элемента и проверяет их идентичность, помещая <1>, если они идентичны, или <0>, если они различны. OP_VERIFY удаляет верхний элемент и проверяет его истинность (non-null). В сочетании как OP_EQUALVERIFY это приводит к сбою транзакции, если верхние два элемента не совпадают.
Соответствующая структура scriptSig выглядит следующим образом:
** <открытый ключ="">**
Чтобы разблокировать P2PKH-выходы, необходимо предоставить как действительную подпись, так и соответствующий открытый ключ.
Этот процесс основан на потоке выполнения P2PK, добавляя проверку того, что предоставленный открытый ключ соответствует хэшу, встроенному в скрипт.
Важное различие: в скриптах блокировки P2PKH открытый ключ остается скрытым - виден только его хеш. Изучение неиспользуемого вывода P2PKH в блокчейн-эксплорерах не показывает информации об открытом ключе. Ключ становится видимым только тогда, когда получатель переводит средства.
Этот подход предлагает несколько преимуществ. Во-первых, хеши открытых ключей обеспечивают более компактную передачу, чем полные открытые ключи - это стало причиной реализации Сатоши в 2009 году. Эти хеши открытых ключей представляют собой адреса Bitcoin, которыми обмениваются пользователи.
Во-вторых, хеширование публичного ключа вводит дополнительный уровень безопасности против угроз квантовых вычислений. Поскольку публичный ключ остается скрытым до момента осуществления транзакции, определение соответствующего приватного ключа становится значительно более сложной задачей. Любая атака потребует реверсирования двух последовательных хеширующих операций (RIPEMD-160 и SHA-256).