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]
Почему сообщение и скрипт имеют разную длину
Яна хочет добавить 32 байта данных. Её простой скрипт состоит из OP_RETURN, инструкции прямого помещения и самих данных: 1 + 1 + 32 = 34 байта. Это длина scriptPubKey. Поля суммы и длины скрипта относятся к другим частям кодировки выхода и в этот расчёт не входят. Бюджет данных измеряет скрипт, а комиссия оценивается для всей транзакции. Пример ничего не рассылает и не доказывает принятия конкретным узлом.
Для полной картины прочитайте эту статью вместе с Bitcoin Script, Транзакция, UTXO, Mempool, Transaction Fees, BIP 110. На эту статью также ссылаются Runes, BRC-20.
01Если назначить этому выходу биткоины, их получит майнер?+
Нет. Деньги в доказуемо нерасходуемом выходе нельзя потратить. Комиссия — разница между общей стоимостью входов и всех выходов. Назначение суммы OP_RETURN само не превращает её в комиссию.
02Меняет ли более длинное разрешённое сообщение правила всего Bitcoin?+
Не обязательно. Узел может изменить локальную политику и передавать больше транзакций, не меняя допустимость блоков. Следует различать настройки клиента, консенсус и реальное подтверждение конкретной транзакции.