Предварительно скомпилированные контракты
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @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.