OP_RETURN в Bitcoin: data carrier, nulldata и неизрасходуемые выходы
Узнайте, как OP_RETURN записывает открытые данные, почему выход нельзя потратить, чем политика ретрансляции Bitcoin Core 31.1 отличается от консенсуса и как она отличается от witness-инскрипций.
В этом руководствеOP_RETURN помещает данные в блокирующий скрипт
Краткое резюме
OP_RETURN позволяет добавить открытые данные в скрипт выхода транзакции Bitcoin. Bitcoin Core считает выходы, скрипт которых начинается с OP_RETURN, заведомо неизрасходуемыми и исключает их из набора UTXO. Действующие ограничения ретрансляции относятся к локальной политике узлов, а не к общему для сети лимиту payload по правилам консенсуса.
OP_RETURN помещает данные в блокирующий скрипт
Выход транзакции Bitcoin содержит сумму и блокирующий скрипт scriptPubKey. Выход OP_RETURN, также называемый nulldata, начинается с опкода OP_RETURN, после которого можно поместить последовательность байтов. После включения транзакции в блок эти байты становятся общедоступной частью выхода. Такая схема не создает отдельный слой данных, баланс токена или личное сообщение.
Почему выход нельзя потратить повторно
OP_RETURN — опкод, выполнение которого завершается ошибкой. Попытка потратить выход со скриптом, начинающимся с него, не может пройти проверку. Поэтому Bitcoin Core помечает такой выход как неизрасходуемый и может сразу не включать его в набор UTXO, не храня монету, которой никогда нельзя воспользоваться. См. реализацию в script.h Bitcoin Core 31.1. Bitcoin Core 31.1 script implementation.
Скрипт больше, чем payload
Лимит data carrier может учитывать не только байты приложения. В необработанный скрипт выхода входят опкод OP_RETURN, инструкция push с кодированием длины и сам payload. Для payload в 80 байт может потребоваться скрипт в 83 байта: один байт опкода, два байта заголовка OP_PUSHDATA1 и 80 байт данных. В старых инструкциях «80 байт» часто относятся к payload, тогда как новые настройки могут измерять весь скрипт.
Политика data carrier по умолчанию в Bitcoin Core 31.1
В Bitcoin Core 31.1 параметр -datacarrier включен по умолчанию. Значение -datacarriersize по умолчанию — 100 000 байт; оно суммирует необработанные scriptPubKey всех выходов data carrier в одной транзакции. Несколько выходов NULL_DATA делят общий лимит, включая опкод и кодирование push. В Core 30.0 прежний предел скрипта 83 байта заменили общим пределом 100 000 байт и разрешили несколько выходов; Core 31.1 сохраняет эти настройки. См. параметры Core 31.1, реализацию политики и заметки к выпуску 30.0.

Ретрансляция и консенсус отвечают на разные вопросы
Узел может отключить ретрансляцию data carrier или уменьшить локальный размерный лимит; другие узлы и версии ПО могут работать с другими настройками. Если узел отверг транзакцию в своем mempool, это может означать лишь отказ ретранслировать ее по локальной политике, а не запрет консенсуса. Bitcoin Core применяет лимит data carrier при проверке стандартности, а правила консенсуса отдельно проверяет при валидации блока. Core consensus transaction checks. See Bitcoin Core 31.1 mempool standardness implementation.
Стоимость выхода теряется, комиссия считается отдельно
Выходу OP_RETURN можно назначить сумму, но вернуть ее нельзя: она навсегда остается неизрасходуемой. Кошельки обычно назначают ему нулевую сумму. Если указать 1 000 сат, они не становятся автоматически комиссией майнера. Комиссия по-прежнему равна сумме входов минус сумма всех выходов. Байты скрипта занимают вес транзакции и могут увеличить комиссию при той же ставке sat/vB. См. руководство по комиссиям Bitcoin.
Несколько выходов данных не увеличивают лимит
Bitcoin Core 31.1 разрешает несколько стандартных выходов NULL_DATA, но суммирует их скрипты в рамках общего лимита транзакции. Разделение payload не увеличивает доступный объем; дополнительные выходы добавляют данные и вес блока. Ретрансляция также зависит от веса, комиссий и других правил стандартности узла. Принятие кошельком или обозревателем не гарантирует распространение транзакции по всей сети.
OP_RETURN отличается от Taproot-инскрипции в witness
Данные OP_RETURN находятся в scriptPubKey выхода при создании транзакции. Данные SegWit witness сериализуются отдельно для каждого входа; BIP 141 описывает их как стековые данные входа. Taproot-расходование по пути скрипта может раскрыть скрипт и control block в witness входа. Программа Ordinals может распознать там формат inscription по прикладному соглашению, но это другой механизм, чем выход nulldata. См. BIP 141, BIP 341 и [руководство по Bitcoin Ordinals и инскрипциям](/learn/bitcoin-ordinals-inscriptions-satoshi-numbering-witness-data-explained).
Перед использованием проверьте политику, стоимость и приватность
Уточните версию Bitcoin Core и локальные параметры, от которых зависит ваше решение. Отдельно посчитайте полный размер необработанного скрипта выхода, общий вес транзакции, сумму неизрасходуемого выхода и комиссию майнера. Консенсус не придает значения произвольным байтам payload; также проверьте, распознает ли формат протокол или получатель. Данные в блокчейне публичны. О выходах и сдаче см. руководство по UTXO и coin control Bitcoin.
Частые вопросы
Q1Ограничивает ли консенсус Bitcoin OP_RETURN 80 байтами данных?
Нет. 80 байт — значение payload из старого примера политики стандартности, а не универсальный предел консенсуса. Bitcoin Core 31.1 по умолчанию использует общий лимит 100 000 байт для необработанных скриптов данных; каждый узел может изменить политику.
Q2Увеличит ли больший OP_RETURN комиссию транзакции?
Это возможно. Байты скрипта добавляют вес транзакции, поэтому при той же ставке sat/vB комиссия может вырасти. Саты, назначенные неизрасходуемому выходу, теряются отдельно и не являются комиссией майнера.
Q3OP_RETURN — это то же самое, что инскрипция Ordinals?
Нет. OP_RETURN находится в скрипте выхода и делает его неизрасходуемым. Типичная Taproot-инскрипция помещает содержимое в данные пути скрипта witness входа, которые Ordinals интерпретирует по собственным соглашениям.
Источники и дополнительное чтение
Сообщить о проблеме
Мы подготовим письмо со ссылкой на эту статью. Mark получит сообщение только после отправки
Быстрая проверка
Прочитали руководство? Проверьте себя в 3 вопросах
Вопрос 01
Что измеряет значение -datacarriersize по умолчанию в Bitcoin Core 31.1?
Выберите ответ, чтобы увидеть объяснение
Словарь опционов
Состояние, при котором страйк опциона близок к рыночной цене базового актива. Внутренняя стоимость может быть малой или нулевой, но премия способна сохраняться из-за оставшегося времени и неопределённости.
Читать подробное руководствоколл-опционКонтракт, который даёт держателю право, но не обязанность, купить базовый актив по страйку на условиях контракта. Продавец несёт соответствующую обязанность при исполнении и назначении.
Читать подробное руководствопут-опционКонтракт, который даёт держателю право, но не обязанность, продать базовый актив по страйку на условиях контракта.
Читать подробное руководство