Расчет комиссий
Этот документ описывает, как в Tycho считаются и списываются комиссии, связанные с выполнением транзакции.
Общая схема списания комиссий
В Tycho существует несколько типов комиссий. Комиссии списываются в момент выполнения транзакции и зависят от контекста исполнения и параметров конфигурации сети.
Основные типы комиссий:
- комиссия за хранение аккаунта с момента последней оплаты
- комиссия за импорт внешнего входящего сообщения
- комиссия за вычисления в VM, зависит от потребленного газа
- комиссия за создание исходящих сообщений
Стоимость операций в masterchain и в рабочих цепочках может отличаться.
Информация о комиссиях сети хранится onchain как часть глобальной конфигурации.
Storage fee
storage fee - это плата за хранение аккаунта.
Она взимается каждый раз, когда на этом аккаунте выполняется транзакция.
Комиссия рассчитывается по формуле за интервал времени с момента последней оплаты и пропорциональна размеру хранимого состояния. Если тарифы менялись во времени, расчет выполняется по участкам тарифа и суммируется.
storage_fee = ceil(((bit_price * bits) + (cell_price * cells)) * delta_seconds / 2^16)
Стоимость хранения регулируется значениями из ConfigParam 18.
Этот параметр хранится onchain в глобальной конфигурации и содержит словарь Hashmap 32 со значениями типа StoragePrices.
Каждая запись задает цены на хранение начиная с utime_since.
Отдельно задаются цены для рабочей цепочки и для masterchain.
ConfigParam 18 = Hashmap(32, StoragePrices)
StoragePrices:
utime_since: uint32
bit_price_ps: uint64
cell_price_ps: uint64
mc_bit_price_ps: uint64
mc_cell_price_ps: uint64
Import fee
Если транзакция выполняется на основе внешнего входящего сообщения, то с баланса аккаунта списывается комиссия за импорт этого сообщения. Эта комиссия зависит от размера входящего сообщения.
Комиссия рассчитывается по формуле forwarding fee.
При расчете учитываются биты и ячейки сообщения без корневой ячейки и без битов в корневой ячейке.
Стоимость берется из onchain-конфига ConfigParam 25.
import_fee = lump_price + ceil((bit_price * msg_bits + cell_price * msg_cells) / 2^16)
lump_price - это фиксированная часть комиссии, которая добавляется независимо от размера сообщения.
Она покрывает базовую стоимость пересылки и, в частности, включает оплату за данные в корневой ячейке сообщения.
Пример данных из ConfigParam 25.
ConfigParam 25 = MsgForwardPrices
MsgForwardPrices:
lump_price: 1_000
bit_price: 2<<16
cell_price: 100<<16
ihr_price_factor: 0
first_frac: 0x8000
next_frac: 0x8000
При расчете import_fee используются только lump_price, bit_price и cell_price.
Поля ihr_price_factor, first_frac и next_frac в расчете import_fee не участвуют.
Compute fee
compute fee - это комиссия за выполнение кода в VM.
Она состоит из минимальной платы за запуск VM и платы за фактически потраченный газ.
- минимальная плата за запуск VM задается параметром
flat_gas_price - расход газа сверх порога
flat_gas_limitоплачивается по тарифуgas_price
Формула комиссии задается параметрами GasLimitsPrices из конфигурации сети.
Для рабочей цепочки используется ConfigParam 21.
gas_fee = flat_gas_price + ceil(gas_price * max(0, gas_used - flat_gas_limit) / 2^16)
Пример данных из ConfigParam 21.
ConfigParam 21 = GasLimitsPrices
GasLimitsPrices:
flat_gas_limit: 100
flat_gas_price: 10_000
gas_price: 1_000<<16
gas_limit: 1_000_000
Action fee
При выполнении транзакции списывается комиссия за выполнение действий в action phase. Эта комиссия связана с созданием событий и исходящих сообщений. Комиссия зависит от размера создаваемых исходящих сообщений.
Комиссия для одного исходящего сообщения рассчитывается по формуле forwarding fee.
msg_fee = lump_price + ceil((bit_price * msg_bits + cell_price * msg_cells) / 2^16)
lump_price - это фиксированная часть комиссии, которая добавляется независимо от размера сообщения.
Она покрывает базовую стоимость обработки исходящего сообщения и включает оплату за данные в корневой ячейке сообщения.
Параметры lump_price, bit_price и cell_price берутся из onchain-конфига MsgForwardPrices.
Для рабочей цепочки используется ConfigParam 25.
Пример данных из ConfigParam 25.
ConfigParam 25 = MsgForwardPrices
MsgForwardPrices:
lump_price: 1_000
bit_price: 2<<16
cell_price: 100<<16
ihr_price_factor: 0
first_frac: 0x8000
next_frac: 0x8000