Объяснение того, как выглядит транзакция OP_RETURN

Как используется OP_RETURN и почему он был введен в первую очередь?

39 голосов | спросил almel 18 J000000Friday14 2014, 01:56:00

2 ответа


57

Примечание. Я вышел и узнал о том, как код операции OP_RETURN работает на байтовом уровне в транзакции биткойнов. Я пишу его здесь, чтобы другие могли быстро учиться. Во-первых, краткая история о том, почему мы даже говорим о OP_RETURN.

Еще в 2013 году различные игроки в экосистеме биткойнов пытались включить в транзакции биты информации, чтобы они могли воспользоваться необратимостью блочной цепи. Представьте себе, например, вы хотели написать контракт и поместить его в неизменное место, которое в любой будущей дате можно было бы вернуться, чтобы проверить его существование. Вы можете сделать это, используя блок-цепочку. Вы добавляете некоторые биты к значению scriptSig транзакции, которые не изменяют конечный результат запуска этого сценария, но позволяют хранить информацию, например «Я настоящим заявляю, что должен предоставить актив A для обращения к XYZ в момент UNIX_TIMESTAMP». Были даже незнакомые люди, которые добавили бы лишние биты, например, включили его в значение BTC выхода. Некоторым членам сообщества это не понравилось, так как они увидели эти дополнительные биты как загрязняющие блокчейн. Дополнительные биты были проблемой с точки зрения эффективности сети, поскольку большее количество бит означало большие цепочки блоков и больше ответственности за тех, кто работает с полным узлом, и это также вызывало озабоченность сообщества, потому что они думали: «Мы все неявно согласились хранить финансовые данные в блокхейн, который важен для всех, но мы не согласились хранить данные, такие как небольшие текстовые сообщения и текст фактуры.

Чтобы достичь промежуточной точки в этих противоположных представлениях, ядро-разработчики сделали opcode OP_RETURN действительным кодом операции, который будет использоваться в транзакции биткойнов, что позволяет использовать 80 произвольных байтов в транзакции с непереносимостью. Хорошее объяснение этого можно найти здесь:

https://bitcoinfoundation.org/bitcoin/core-development-update-5/

Позже в феврале 2014 года количество байтов было уменьшено с 80 до 40 байт. Это изменение описано в приведенной ниже ссылке. Обратите внимание, что в этой дискуссии мы узнаем, что в одну транзакцию можно включить не более одного вывода с OP_RETURN:

https://github.com/bitcoin/bitcoin/pull/3737

Теперь, когда у нас есть причина для OP_RETURN, давайте рассмотрим пример OP_RETURN. Я использовал API-интерфейс chain.com, чтобы найти транзакцию с OP_RETURN в ее скриптеSig. Этот хэш-символ tx имеет значение 8bae12b5f4c088d940733dcd1455efc6a3a69cf9340e17a981286d3778615684

Убедитесь, что вы подключены к полностью загруженному узлу биткойн и выполните следующую команду:

$> bitcoind getrawtransaction 8bae12b5f4c088d940733dcd1455efc6a3a69cf9340e17a981286d3778615684 1

, который даст вам этот результат:

{
"hex" : "0100000001c858ba5f607d762fe5be1dfe97ddc121827895c2562c4348d69d02b91dbb408e010000008b4830450220446df4e6b875af246800c8c976de7cd6d7d95016c4a8f7bcdbba81679cbda242022100c1ccfacfeb5e83087894aa8d9e37b11f5c054a75d030d5bfd94d17c5bc953d4a0141045901f6367ea950a5665335065342b952c5d5d60607b3cdc6c69a03df1a6b915aa02eb5e07095a2548a98dcdd84d875c6a3e130bafadfd45e694a3474e71405a4ffffffff020000000000000000156a13636861726c6579206c6f766573206865696469400d0300000000001976a914b8268ce4d481413c4e848ff353cd16104291c45b88ac00000000",
"txid" : "8bae12b5f4c088d940733dcd1455efc6a3a69cf9340e17a981286d3778615684",
"version" : 1,
"locktime" : 0,
"vin" : [
    {
        "txid" : "8e40bb1db9029dd648432c56c295788221c1dd97fe1dbee52f767d605fba58c8",
        "vout" : 1,
        "scriptSig" : {
            "asm" : "30450220446df4e6b875af246800c8c976de7cd6d7d95016c4a8f7bcdbba81679cbda242022100c1ccfacfeb5e83087894aa8d9e37b11f5c054a75d030d5bfd94d17c5bc953d4a01 045901f6367ea950a5665335065342b952c5d5d60607b3cdc6c69a03df1a6b915aa02eb5e07095a2548a98dcdd84d875c6a3e130bafadfd45e694a3474e71405a4",
            "hex" : "4830450220446df4e6b875af246800c8c976de7cd6d7d95016c4a8f7bcdbba81679cbda242022100c1ccfacfeb5e83087894aa8d9e37b11f5c054a75d030d5bfd94d17c5bc953d4a0141045901f6367ea950a5665335065342b952c5d5d60607b3cdc6c69a03df1a6b915aa02eb5e07095a2548a98dcdd84d875c6a3e130bafadfd45e694a3474e71405a4"
        },
        "sequence" : 4294967295
    }
],
"vout" : [
    {
        "value" : 0.00000000,
        "n" : 0,
        "scriptPubKey" : {
            "asm" : "OP_RETURN 636861726c6579206c6f766573206865696469",
            "hex" : "6a13636861726c6579206c6f766573206865696469",
            "type" : "nulldata"
        }
    },
    {
        "value" : 0.00200000,
        "n" : 1,
        "scriptPubKey" : {
            "asm" : "OP_DUP OP_HASH160 b8268ce4d481413c4e848ff353cd16104291c45b OP_EQUALVERIFY OP_CHECKSIG",
            "hex" : "76a914b8268ce4d481413c4e848ff353cd16104291c45b88ac",
            "reqSigs" : 1,
            "type" : "pubkeyhash",
            "addresses" : [
                "1HnhWpkMHMjgt167kvgcPyurMmsCQ2WPgg"
            ]
        }
    }
],
"blockhash" : "000000000000000004c31376d7619bf0f0d65af6fb028d3b4a410ea39d22554c",
"confirmations" : 2655,
"time" : 1404107109,
"blocktime" : 1404107109

}

Теперь просмотрите список транзакций, в частности, 1-й. Со ссылкой на страницу Биткойн-Вики на скрипте , язык программирования на языке Биткойна, мы можем видеть здесь что код операции OP_RETURN представлен шестнадцатеричным значением 0x6a. Этот первый байт сопровождается байтом, который представляет длину остальных байтов в scriptPubKey. В этом случае мы видим шестнадцатеричное значение Ox13, что означает, что еще 19 байтов. Эти байты содержат произвольные менее 40 байт, которые вы можете отправить в транзакции, отмеченной операционным кодом OP_RETURN. Если вы поместите байты сообщения в декодер UTF8, вы увидите, что

636861726c6579206c6f766573206865696469

превращается в «хорошенькую любовь к хейди». Оу! Это почти как цифровая версия романтической резьбы по дереву. Теперь вы понимаете на уровне байтов, как OP_RETURN должен работать. Теперь вы можете написать программное обеспечение, которое ищет код операции OP_RETURN в файле outputPubKey и использует его для проверки контракта или другого цифрового актива.

ответил almel 18 J000000Friday14 2014, 02:00:30
7

Если вы хотите написать OP_RETURNs в блок-цепочку, не вдаваясь во внутренние принципы построения транзакций, простой способ - использовать наши библиотеки для PHP и Python:

https://github.com/coinspark/php-OP_RETURN

https://github.com/coinspark/python-OP_RETURN

Они поддерживают либо отправку отдельных транзакций с одним подключенным OP_RETURN, либо отправляют пакет связанных транзакций для встраивания больших частей контента. Это содержимое затем может быть извлечено из блок-цепи с использованием одного идентификатора.

Предполагая, что вы используете Bitcoin Core 0.11, вы можете изменить значение OP_RETURN_MAX_BYTES на 80, а не 40, как он сейчас стоит в коде.

ответил Gideon Greenspan 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 21 Sep 2015 08:44:27 +0300 2015, 08:44:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132