Декодування скрипта Біткойн: мова програмування за Цифровими грошима

Вступ

Біткоїн часто називають програмованими грошима. Його цифрова природа забезпечує користувачам підвищену гнучкість у визначенні умов використання своїх коштів.

Коли йдеться про Біткойн, розмови зазвичай обертаються навколо гаманців і монет. Однак більш точним уявленням було б думати про гаманці як про ключі, монети як про чеки, а блокчейн як про безпечний сейф. Кожен сейф має вузький отвір, через який можна вставляти чеки або переглядати вміст. Доступ до самого сейфу залишається обмеженим для тих, хто має правильний ключ.

Коли власник ключа бажає перевести кошти, він відкриває сховище. Цей процес передбачає створення нового чека, що посилається на оригінальний (, який стає недійсним ), і його зберігання в сховищі, доступному лише для призначеного отримувача. Новий отримувач дотримується ідентичних кроків при витрачанні цих коштів.

Ця стаття розглядає Bitcoin Script - мову програмування, яку вузли в мережі Bitcoin використовують для контролю механізмів блокування та розблокування цих цифрових сховищ.

Механіка транзакцій Bitcoin

Відповідно до нашої аналогії, кожна транзакція Bitcoin складається з двох основних компонентів: ключа ( для доступу до сховища ) і замка. Ключ розблокує сховище, що містить чек, який ви хочете перевести, тоді як новий чек поміщається в інше сховище, захищене іншим замком. Доступ до коштів з цього нового сховища вимагає іншого специфічного ключа.

Ця система пропонує значну гнучкість. Мережа підтримує різні типи блокувань - деякі сховища можуть вимагати кілька ключів, інші можуть вимагати підтвердження повноважень для доступу. Користувачі можуть налаштовувати численні умови відповідно до своїх специфічних вимог.

У технічному терміні ключ називається scriptSig, тоді як замок називається scriptPubKey. При більш детальному розгляді ці компоненти виявляються комбінаціями фрагментів даних і кодових блоків, які разом формують компактну програму.

Під час виконання транзакції ця комбінація поширюється по мережі. Кожен приймаючий вузол перевіряє дійсність транзакції. Невдала перевірка призводить до недоступності коштів.

Чеки (coins) технічно відомі як невитрачені виходи транзакцій (UTXOs). Будь-який користувач, що має відповідний ключ, може використати ці кошти. Зокрема, scriptSig функціонує як ключ, тоді як scriptPubKey служить як замок.

Якщо ваш гаманець містить UTXO, ймовірно, що він має умову, що тільки ті особи, які можуть довести право власності на певний публічний ключ, можуть розблокувати пов'язані кошти. Щоб їх розблокувати, ви повинні надати цифрово підписаний scriptSig з приватним ключем, що відповідає публічному ключу, зазначеному в scriptPubKey.

Основи Bitcoin Stack

Скрипт працює як мова, основана на стеку. Інструкції розташовані у вертикальному стовпчику, виконання починається з верхнього елемента. Наприклад, елементи A, B та C формують стек, де C знаходиться зверху, а A внизу. Під час виконання інструкцій операції починаються з елементів з верхньої частини стека.

Елементи додаються до стека та "виймаються" з нього під час виконання.

Елементи даних (, такі як підписи, хеші та відкриті ключі ), відрізняються від інструкцій ( або опкоду ). Інструкції видаляють дані та виконують над ними операції. Розгляньте цей спрощений приклад:

<md5 hasher=""">

Дані з'являються червоним, опкоди синім. Читаючи зліва направо, рядок спочатку потрапляє в стек. Опкод (гіпотетичний для цього прикладу) потім видаляє верхній елемент стека () і застосовує MD5 хешування, поміщаючи результат назад у стек: d16fb36f0911f878998c136191af705e.

Далі, входить у стек, в результаті чого утворюються два ідентичні елементи. Нарешті, видаляє два верхні елементи та порівнює їх, додаючи <1> у стек, якщо вони ідентичні, або <0>, якщо різні.

Досягнувши кінця списку інструкцій, перевірка скрипту підпорядковується двом правилам: відмова відбувається, якщо залишковий елемент є null або якщо інструкція не виконується через невиконані умови. У цьому прикладі жодна з умов не застосовується - у нас є ненульовий елемент (<1>), що підтверджує дійсність скрипту. Ці ж правила регулюють фактичні транзакції Bitcoin.

Платний (P2PK) Pubkey

Pay-to-Pubkey (P2PK) представляє найелементарнішу форму транзакції. Вона блокує кошти за конкретним публічним ключем. Щоб отримати кошти через цей метод, отримувачі повинні надати відправникам свій публічний ключ, а не адресу Bitcoin.

Перша транзакція між Сатоші Накамото і Халом Фінні в 2009 році використовувала P2PK. Ця структура була поширена в ранні дні Bitcoin, але в основному була замінена на Pay-to-Pubkey-Hash (P2PKH).

Скрипт блокування для P2PK має простий формат: OP_CHECKSIG. Як випливає з назви, OP_CHECKSIG перевіряє підпис на відповідність наданому відкритому ключу. Відповідний scriptSig просто містить .

Процес виконання не може бути простішим: підпис потрапляє в стек, за ним йде публічний ключ. OP_CHECKSIG перевіряє обидва елементи та підтверджує підпис щодо публічного ключа. У разі збігу <1> додається до стеку; в іншому випадку з'являється <0>.

P2PK вийшов з ужитку, причини чого розглядаються в наступному розділі.

Хеш-(P2PKH) з оплатою до pubkey-хешу

Pay-to-Pubkey-Hash (P2PKH) представляє найбільш поширений тип транзакцій у мережі Bitcoin. Сучасне програмне забезпечення гаманців зазвичай реалізує цей формат за замовчуванням.

Скрипт P2PKH scriptPubKey має таку структуру:

OP_DUP OP_HASH160 <public key="" hash="> OP_EQUALVERIFY OP_CHECKSIG

Перед тим, як розглянути відповідний scriptSig, давайте зрозуміємо задіяні опкоди:

OP_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).

BTC-0.07%
Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • Прокоментувати
  • Репост
  • Поділіться
Прокоментувати
0/400
Немає коментарів
  • Закріпити