Виртуальная машина

Расчет комиссий

Этот документ описывает, как в 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