К основному содержанию
T TON Adoption
← Словарь
NODE/03 · Term

Opcode

32-битный префикс в теле сообщения смарт-контракту. По нему контракт определяет, какой запрос пришёл — перевод jetton, mint, burn или произвольное действие — и вызывает соответствующий обработчик.

Синонимы: op-код, операционный код, message opcode

Opcode в контексте TON — это числовой идентификатор операции, размещённый в начале тела входящего сообщения смарт-контракту. Контракт читает первые 32 бита body, сравнивает их со списком известных значений и решает, какую функцию выполнить: принять jetton, выпустить NFT, обновить параметр и так далее.

Зачем это нужно

В TON у смарт-контракта нет фиксированного набора методов на уровне VM. Контракт получает входящее сообщение, и сам же должен распарсить его тело и понять, что от него хотят. Чтобы это было унифицировано, экосистема договорилась о соглашении:

  • Тело внутреннего сообщения начинается с 32-битного беззнакового opcode (op-кода).
  • За ним идут поля сообщения — структура полей зависит от opcode и описана либо в TEP, либо в ABI конкретного контракта.
  • Контракт реализует диспетчер: «если opcode равен такому-то — это transfer, парсить в соответствующую структуру».

Без этого соглашения каждый контракт изобретал бы свой формат, и совместимости между ними не было бы.

Стандартизованные opcode-ы

Распространённые операции — jetton transfer, jetton internal transfer, NFT transfer, NFT ownership notify и так далее — имеют зафиксированные opcode-ы в TEP-ах. Это значит, что все совместимые контракты одного типа отвечают на одни и те же числовые префиксы, и кошельки/SDK могут с ними работать без знания конкретной реализации.

Конкретные числовые значения этих opcode-ов смотрите в актуальных TEP-ах (TEP-74 для jetton, TEP-62 для NFT и т. д.) — мы намеренно не дублируем их здесь, чтобы избежать рассинхронизации со стандартом.

Пользовательские opcode-ы

Помимо стандартных, контракт может принимать свои собственные операции — например, «изменить параметр», «инициировать аукцион», «закрыть позицию». Для них автор контракта выбирает любые свободные значения, не пересекающиеся со стандартными. Эти opcode-ы фиксируются в ABI контракта и должны быть известны всем, кто хочет с ним взаимодействовать.

Особенности

  • Нулевой opcode (0x00000000) имеет особое назначение: тело, начинающееся с такого префикса, по соглашению несёт текстовый комментарий. Так работают, например, переводы TON с подписью — после нулевого префикса идёт UTF-8 строка.
  • Опция bounce. Если контракт получил сообщение с неизвестным opcode и не смог его обработать, грамотно реализованный контракт отправит исходное сообщение обратно (bounce), чтобы пользователь не потерял средства.
  • Безопасность. Если контракт диспетчеризует op-коды без проверки отправителя, можно нечаянно дать любому возможность вызвать чувствительную функцию. Хорошие реализации в каждом обработчике проверяют адрес отправителя и контекст сообщения.

Практически

Для разработчика opcode — это первое, что он определяет, проектируя контракт: список операций, числовые значения, схема полей. Для интегратора (бекенд биржи, кошелёк, индексер) opcode — то, по чему он узнаёт смысл транзакции при разборе входящих сообщений.

См. также