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Спецификация
Обновлено: Сначала источники · Не является инвестиционной рекомендацией