Предварительно скомпилированные контракты
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
Предварительно скомпилированный смарт-контракт — это контракт с реализацией C++ в узле. Когда валидатор запускает транзакцию по такому смарт-контракту, он может выполнить эту реализацию вместо TVM. Это повышает производительность и позволяет снизить затраты на вычисления.
Конфигурация
Список предварительно скомпилированных контрактов хранится в конфигурации мастерчейна:
precompiled_smc#b0 gas_usage:uint64 = PrecompiledSmc;
precompiled_contracts_config#c0 list:(HashmapE 256 PrecompiledSmc) = PrecompiledContractsConfig;
_ PrecompiledContractsConfig = ConfigParam 45;
list:(HashmapE 256 PrecompiledSmc) — это карта (code_hash -> precomplied_smc).
Если хэш кода контракта найден в этой карте, то контракт считается предварительно скомпилированным.
Выполнение контракта
Любая транзакция по предварительно скомпилированному смарт-контракту (т. е. любому контракту с хэшем кода, найденным в ConfigParam 45) выполняется следующим образом:
- Получите
gas_usageиз конфигурации мастерче йна. - Если баланса недостаточно для оплаты газа
gas_usage, то фаза вычислений завершается неудачей с причиной пропускаcskip_no_gas. - Код может быть выполнен двумя способами:
- Если предварительно скомпилированное выполнение отключено или реализация C++ недоступна в текущей версии узла, то TVM работает как обычно. Лимит газа для TVM устанавливается rкак лимит газа транзакции (1M газа).
- Если предварительно скомпилированная реализация включена и доступна, то выполняется реализация C++.
- Переопределите значения фазы вычисления: установите
gas_usedнаgas_usage; установитеvm_steps,vm_init_state_hash,vm_final_state_hashна ноль. - Плата за вычисления основана на
gas_usage, а не на фактическом использовании газа TVM.
Когда предварительно скомпилированный контракт выполняется в TVM, 17-й элемент c7 устанавливается на gas_usage и может быть извлечен с помощью инструкции GETPRECOMPILEDGAS. Для не предварительно скомпилированных контрактов это значение равно null.
Выполнение предварительно скомпилированных контрактов по умолчанию отключено. Запустите validator-engine с флагом --enable-precompiled-smc, чтобы включить его.
Обратите внимание, что оба способа выполнения предварительно скомпилированного контракта приводят к одной и той же транзакции.
Таким образом, валидаторы с реализацией C++ и без нее могут безопасно сосуществовать в сети.
Это позволяет добавлять новые записи в ConfigParam 45, не требуя от всех валидаторов немедленного обновления программного обеспечения узла.
Доступные реализации
Hic sunt dracones.