512 / 736OP_RET

OP_RETURN

Нульові дані та доведено невитратні виходи

OP_RETURN дає змогу додати до транзакції Bitcoin дані, наприклад відбиток документа. При цьому створюється вихід, який неможливо витратити. Проте запис у blockchain сам собою не підтверджує правдивість повідомлення чи особу автора.

OP_RETURN — інструкція Bitcoin Script із кодом 0x6a. На початку скрипту виходу вона робить його доведено невитратним: жоден підпис не розблокує кошти. Після інструкції можна додати дані. Це не платіжна адреса й не гроші, надіслані одержувачу, а спосіб включити запис до транзакції.

Яна хоче додати інформацію, а не надіслати комусь ще одну суму. Тому вона починає вихід із OP_RETURN. Під час спроби витрачання виконання цієї інструкції завершило б перевірку скрипту невдачею, незалежно від підпису. Технічна назва скрипту виходу — scriptPubKey. Важливі місце та виконання: той самий байт усередині даних не є командою, що запускається. OP_RETURN у невиконуваній гілці також не тотожний OP_RETURN на початку. Отже, просто знайти назву чи байт десь у транзакції недостатньо. [1] [5]

Bitcoin Core відносить звичну форму до NULL_DATA. Назва не означає, що даних немає. Функція Solver вимагає початковий OP_RETURN і решту, яка проходить IsPushOnly, тобто містить лише інструкції вставлення даних. Це може бути текст, hash — короткий обчислений відбиток — або запис для іншого протоколу. Класифікація не підтверджує зміст повідомлення та сама не гарантує прийняття до черги вузла. Запис також автоматично не встановлює власність на файл, авторство чи правові наслідки; такі твердження потребують додаткових правил і доказів. [3]

Вузли підтримують набір UTXO — ще не витрачені виходи, які можна використати. Якщо вихід починається з OP_RETURN, наперед відомо, що ніхто його не витратить. IsUnspendable його розпізнає, а AddCoin не додає до кешу UTXO. Це заощаджує поточний робочий облік, а не місце в усій історії: підтверджена транзакція залишається в блоці, а дані передаються та зберігаються в його історичних копіях. Вилучення з UTXO не стирає даних. Якщо хтось призначає такому виходу суму, це не винагорода майнеру. Її неможливо витратити чи повернути пізнішим підписом. [2] [6] [1]

Консенсус визначає, які блоки вузол вважає чинними. Натомість локальна політика обирає, що потрапляє в mempool, чергу непідтверджених транзакцій, що передається далі та пропонується для видобування. Так вузол захищає ресурси. Оператори можуть мати різні налаштування: відмова передавати транзакцію не означає, що блок із нею порушує консенсус. Прийняття в mempool теж не обіцяє підтвердження. datacarriersize задає місцевий бюджет даних; сам параметр не змінює чинність блоків і не стирає підтверджений вміст. [8]

Часто цитований попередній стандарт дозволяв 1 вихід даних зі скриптом до 83 байтів, зазвичай 80 байтів вмісту плюс інструкції. Bitcoin Core 30.0 підвищив стандартне datacarriersize до 100000 і дозволив кілька виходів даних. Код віднімає довжину всього scriptPubKey кожного такого виходу зі спільного бюджету. Він рахує не лише повідомлення і не включає зовнішнє поле, що записує довжину скрипту. Інші обмеження транзакції залишаються. Значення 83 повертає попередній бюджет, але не правило єдиного виходу. Це опис конкретної зміни версії, а не незмінний закон мережі. [7] [4] [8]

Яна може помістити hash документа в OP_RETURN замість самого файлу. Коли пізніше покаже оригінал, можна заново обчислити відбиток тим самим методом і порівняти із записом. Для цього треба зберегти точні байти файлу та метод: відбиток не замінює документа. Збіг не доводить правдивість змісту, авторство Яни чи точний час створення. Публічний запис також може пов’язувати особи, а хешовані дані не стають автоматично приватними. Вартість залежить від усієї транзакції та попиту на місце в блоках, а не лише від довжини повідомлення. [1] [8]

Є важливий, чітко визначений виняток зі звичайних повідомлень застосунків. BIP 141 використовує OP_RETURN у coinbase, початковій транзакції блока, для witness commitment: криптографічного зв’язку з супровідними даними для перевірки транзакцій. Відповідний scriptPubKey має щонайменше 38 байтів і починається з 0x6a24aa21a9ed. Якщо підходять кілька виходів, обирають найбільший індекс, тобто останній відповідний вихід у порядку. Якщо блок не містить даних witness, включати witness commitment не обов’язково. Мережа перевіряє конкретну структуру, а не правдивість довільного тексту після OP_RETURN. [9]

Спершу з’ясуйте, якого клієнта, версії та конфігурації стосується ліміт. Далі потрібно декодувати справжню транзакцію та відрізнити scriptPubKey від полів навколо нього в байтовому записі. Тест mempool_datacarrier.py показує граничні випадки реалізації; ця стаття його не запускає. BIP 110 пропонував додаткові консенсусні обмеження, але це закрита пропозиція, а не правило, що вмикається datacarriersize. Опис старої версії не гарантує однакової поведінки всіх вузлів чи майбутніх версій. Конкретне налаштування та справжнє підтвердження транзакції — різні відомості. [10] [8] [11]

Приклад · OP_RET

Чому повідомлення та скрипт мають різну довжину

Яна хоче додати 32 байти даних. Її простий скрипт містить OP_RETURN, інструкцію прямого вставлення та самі дані: 1 + 1 + 32 = 34 байти. Це довжина scriptPubKey. Поля суми та довжини скрипту є іншими частинами кодування виходу й не входять до цього підрахунку. Бюджет даних вимірює скрипт, а комісія оцінюється для всієї транзакції. Приклад нічого не транслює та не доводить прийняття конкретним вузлом.

Для повної картини прочитайте також Bitcoin Script, Транзакція, UTXO, Mempool, Transaction Fees, BIP 110. На цю статтю також посилаються Runes, BRC-20.

01Якщо призначити цьому виходу біткоїни, чи отримає їх майнер?

Ні. Суму, призначену доведено невитратному виходу, неможливо витратити. Комісія — різниця між загальною вартістю входів та всіх виходів. Призначення коштів OP_RETURN саме не перетворює їх на комісію.

02Чи змінює більший дозволений запис правила всього Bitcoin?

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

DOC · 001Bitcoin Developer Reference — OP_RETURNДокументація DOC · 002Bitcoin Core — script.h IsUnspendableПервинне джерело DOC · 003Bitcoin Core — solver.cpp NULL_DATAПервинне джерело DOC · 004Bitcoin Core 30.0 release notesПервинне джерело DOC · 005Bitcoin Core 30.0 — InterpreterПервинне джерело DOC · 006Bitcoin Core 30.0 — CoinsПервинне джерело DOC · 007Bitcoin Core 29.0 — Policy implementationПервинне джерело DOC · 008Bitcoin Core 30.0 — Policy implementationПервинне джерело DOC · 009BIP 141 — Witness commitmentСпецифікація DOC · 010Bitcoin Core 30.0 — Datacarrier testsПервинне джерело DOC · 011BIP 110 — SpecificationСпецифікація
Переглянуто: Спочатку джерела · Не інвестиційна порада