Перейти к содержимому
buybitcoinsmart

Глоссарий / Справочник разработчика

Опкод

Другие названия: Opcode, Опкод передачи данных, Опкод без передачи данных.

Что такое опкод?
Опкод представляет собой один байт в Bitcoin Script, который указывает проверяющему узлу, что делать дальше: поместить данные в стек или выполнить одну операцию над тем, что уже находится в стеке.

В Bitcoin Script фиксированный словарь из 256 возможных значений байта, разделенных между опкодами, которые помещают в стек литеральные данные, и опкодами, которые действуют на уже помещенные в стек данные. Устаревший скрипт может выполнить не более 201 действующего опкода и не может превышать 10 000 байт. Для того, кто покупает биткоин, этот небольшой словарь объясняет, почему кошелек может назвать комиссию до отправки транзакции в сеть и почему биткоин не дает поверхности для неконтролируемых ошибок контрактов.

Как это работает

Проверяющий узел читает скрипт побайтно и ищет каждый байт в фиксированной таблице. Значения от 0x01 до 0x4b вообще не являются инструкциями: каждое из них говорит, что следующие N байт являются литеральными данными и принадлежат стеку, поэтому сжатый публичный ключ из 33 байт выглядит в скрипте как 0x21, за которым следует сам ключ. Еще три кода размещения данных, OP_PUSHDATA1, OP_PUSHDATA2 и OP_PUSHDATA4, покрывают более длинные элементы, а значения от 0x51 до 0x60 помещают в стек малые целые числа от 1 до 16, которые встречаются в подсчете кворума.

Все значения выше 0x60 выполняют работу, а не несут данные, и именно их считает биткоин. Скрипт до Taproot может содержать не более 201 такого опкода, не может иметь элемента стека размером более 520 байт, не может держать более 1000 элементов в своих стеках и не может занимать в целом более 10 000 байт. Все четыре цифры взяты из файла script.h в Bitcoin Core, и все четыре являются правилами консенсуса, а не предпочтениями, которые оператор узла может ослабить.

Пятнадцать опкодов перечислены в таблице, но являются мертвыми. OP_CAT, OP_MUL, OP_LSHIFT и еще двенадцать были отключены в 2010 году после ошибки, вызывавшей сбои, и скрипт, который просто содержит один из них, завершается ошибкой, даже внутри ветви, которая никогда не выполняется. Ни один из них так и не был включен снова. Это единственное решение является главной причиной того, что язык скриптов биткоина уже, чем позволяет ожидать слово «программируемый».

Tapscript переписал учет для расходов Taproot. BIP-342, действующий с блока 709 632 в ноябре 2021 года, отменил и потолок в 201 инструкцию, и ограничение размера в 10 000 байт, заменив их бюджетом подписей: транзакция должна нести 50 единиц веса на каждую подпись, которую проверяет скрипт. Он также превратил блок неопределенных значений байта в коды OP_SUCCESS, поэтому скрипт, содержащий такой код, является действительным, даже не выполняясь вовсе. Это намеренно оставленное место для будущих обновлений.

Почему это важно при покупке биткоина

Опкоды определяют, сколько стоит ваш вывод. Устаревший выход содержит четыре рабочие инструкции вокруг хеша из 20 байт в 25 байтах; нативный эквивалент SegWit представляет собой байт версии и размещение данных, 22 байта; выход Taproot занимает 34. Поскольку SegWit перенес сторону разблокировки в свидетель с четвертью веса, расход выхода bech32 занимает примерно 68 виртуальных байт против примерно 148 для устаревшей версии того же платежа. Выбор bech32 или bech32m при выводе, везде где биржа его предлагает, является едва ли не самым выгодным решением в этом глоссарии.

Опкоды также определяют, что ваше устройство подписи действительно может обработать. Аппаратный кошелек, который распознает только стандартные шаблоны с одним ключом, не может совместно подписать хранилище с блокировкой по времени или необычную политику, поэтому если планирование наследования или мультиподпись вообще входят в ваши планы, проверьте поддержку скриптов в обзорах до покупки устройства, а не после того, как биткоины уже на нем.

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

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

OP_NOP2 был байтом 0xb1 и не делал совершенно ничего, один из десяти пронумерованных пустых опкодов, оставленных в таблице для дальнейшего использования. BIP-65 дал ему работу: подтверждать, что блокировка времени транзакции прошла, и завершать скрипт ошибкой, если она не прошла. Применение началось с блока 388 381 14 декабря 2015 года, и с тех пор опкод называется OP_CHECKLOCKTIMEVERIFY.

Хитрость в том, что старое программное обеспечение по-прежнему видело байт, который ничего не делает, поэтому оно по-прежнему принимало новые транзакции как действительные. Только обновленные узлы обеспечивали соблюдение блокировки по времени. Именно эта асимметрия делает мягкую вилку мягкой, и тем же путем OP_NOP3 стал OP_CHECKSEQUENCEVERIFY на блоке 419 328 в июле 2016 года. Остается восемь зарезервированных пустых опкодов, и это большая часть оставшегося у биткоина пространства для обновлений по правилам до Taproot и значительная часть причины, по которой столько внимания в проектировании перешло к значениям OP_SUCCESS, созданным Tapscript.

Опкод vs Bitcoin Script

Bitcoin Script является языком, а опкод представляет собой одно слово его словаря. Это различие важно, когда вы читаете утверждения о том, что биткоин может или не может делать, потому что почти каждое серьезное предложение последнего десятилетия было предложением определить один новый опкод, а не изменить язык вокруг него. OP_CHECKTEMPLATEVERIFY, OP_CAT и OP_CHECKSIGADD представляют собой каждый один байт с одной задачей, и публичные споры о ковенантах или хранилищах являются спорами о том, должно ли конкретному байту быть разрешено что-то означать. Стек, ограничения и отсутствие циклов остаются точно такими же, когда появляется новый опкод.

Не путать с

Часто задаваемые вопросы

Может ли биткоин выполнять смарт-контракты так, как это делает Ethereum?

Нет, и так задумано. В Bitcoin Script нет циклов, нет постоянного хранилища между транзакциями, а пятнадцать его арифметических и строковых опкодов отключены с 2010 года, поэтому скрипт может лишь ответить «да» или «нет» на фиксированное условие расходования.

Нужно ли разбираться в опкодах, чтобы купить или хранить биткоин?

Нет. Кошельки составляют скрипты за вас. Знать опкоды стоит лишь тогда, когда вы выбираете формат адреса при выводе или настраиваете мультиподпись, потому что оба решения меняют, какие опкоды выполняются и сколько стоит расходование по комиссиям.

Как биткоин добавляет новый опкод, не разделяя цепочку?

Путем переопределения байта, который старые узлы уже игнорируют. Так OP_NOP2 и OP_NOP3 стали двумя опкодами временной блокировки в 2015 и 2016 годах, а Tapscript отвел новый блок значений OP_SUCCESS в 2021 году для той же цели.

Читайте далее

Связанные термины

Еще в разделе «Справочник разработчика»

Читать эту страницу на английском