# Газ и комиссия за транзакции

Во время выполнения транзакции в Aptos Blockchain, использование ресурсов отслеживается и измеряется в газе.

### Введение

Газ гарантирует, что все программы Move, работающие в Aptos Blockchain, в конечном итоге завершатся. Это ограничивает используемые вычислительные ресурсы. Газ также предоставляет возможность взимать комиссию за транзакцию, частично основанную на потребленных ресурсах во время выполнения.

Когда клиент отправляет транзакцию для выполнения в Aptos Blockchain, она содержит указанные:

* `max_gas_amount`: максимальное количество единиц газа, которое можно использовать для выполнения транзакции. Это ограничивает вычислительные ресурсы, которые могут потребляться транзакцией.
* `gas_price`: цена газа в утилитарном (служебном) токене блокчейна. Цена газа — это способ перевода единиц газа (абстрактных единиц ресурсов, потребляемых виртуальной машиной) в комиссию за транзакцию в утилитарном токене блокчейна.

Комиссия за транзакцию, взимаемая с клиента, будет составлять не более `gas_price * max_gas_amount`.

Цена газа и, следовательно, комиссия за транзакцию должны соответствовать рыночным характеристикам Aptos Blockchain, поскольку предложение и спрос на ресурсы колеблются.

### Типы использования ресурсов

Чтобы виртуальная машина (VM) могла выполнить транзакцию, система газа должна отслеживать основные ресурсы, используемые транзакцией. Они делятся на три ресурсных измерения:

1. Вычислительная стоимость выполнения транзакции.
2. Сетевые затраты на продвижение транзакции по экосистеме Aptos.
3. Затраты на хранение данных, созданных и используемых во время выполнения транзакции в Aptos Blockchain.

Первые два из этих ресурсов (вычислительный и сетевой) являются эфемерными. Однако третий (хранение) является долговечным. После выделения данных эти данные сохраняются до тех пор, пока не будут удалены. В случае с учетными записями данные живут бессрочно.

Каждое из этих измерений ресурсов может изменяться независимо. Однако существует только одна цена на газ. В результате это означает, что потребление газа в каждом измерении должно отслеживаться правильно, поскольку только цена на газ действует как единственный коэффициент к общему потреблению газа. Таким образом, использование газа в транзакции должно быть тесно связано с реальными затратами, связанными с выполнением транзакции.

### Использование газа для расчета комиссий за транзакции

Когда вы отправляете транзакцию, плата за выполнение транзакции представляет собой цену газа, умноженную на расчетное использование ресурсов виртуальной машины для этой транзакции.

В разное время в потоке транзакций взимается плата за разные аспекты использования ресурсов. Основы потока транзакций и логика, связанная с газом, подробно показаны на следующей диаграмме:

![РИСУНОК 1.0 Газ и поток транзакций](https://3871566903-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FIkxeboWqDfSlpSyOiYpf%2Fuploads%2FtKZt3AAHyC6ACJVEiuYy%2Fusing-gas-fde9a181d8b64370aad7c5fad67aeb2e.svg?alt=media\&token=01cd220b-6f7c-4d4b-948b-5180ff866d03)

На диаграмме пролог и эпилог отмечены одним цветом. Это связано с тем, что эти участки потока транзакций не должны измеряться:

* В прологе неизвестно, имеет ли отправляющая учетная запись достаточно средств для покрытия своих обязательств по газу, или если пользователь, отправляющий транзакцию, даже имеет полномочия на отправляющую учетную запись. Из-за этого недостатка знаний, когда выполняется пролог, его не нужно измерять. Удержание газа для транзакций, которые не соответствуют прологу, может привести к несанкционированным списаниям со счетов. Вычет газа для транзакций, не прошедших пролог, может привести к несанкционированным списаниям с учетных записей.
* Эпилог частично отвечает за списание платы за исполнение с аккаунта отправителя и ее распределение. Из-за этого эпилог должен выполняться, даже если во время выполнения транзакции закончился газ. Аналогично, мы не хотим, чтобы при списании средств со счета отправителя заканчивался газ, поскольку это привело бы к выполнению дополнительных вычислений без взимания какой-либо комиссии за транзакцию.

Это означает, что минимальная комиссия за транзакцию `MIN_TXN_FEE` должна быть достаточной для покрытия средней стоимости запуска пролога и эпилога.

После того, как пролог был запущен, и мы частично проверили, что аккаунт может покрыть свои обязательства по газу, остальная часть потока транзакций начинается с наполнения "gas tank" по `max_gas_amount`. Взимается `MIN_TXN_FEE` , после чего за каждую инструкцию, выполняемую виртуальной машиной. Это списание за каждую инструкцию продолжается до тех пор, пока либо:

* Выполнение транзакции не завершится, после чего взимается стоимость хранения данных транзакции, выполняется эпилог и вычитается комиссия за выполнение, или
* "gas tank" не опустеет, в этом случает возникает ошибка `OutOfGas`.

В первом случае взимается комиссия, а результат транзакции сохраняется в Aptos Blockchain. В последнем случае при возникновении ошибки выполнение транзакции останавливается. После чего собирается общая задолженность газа по транзакции. Никаких иных остатков исполнения, кроме вычета в данном случае, не совершается.

### Использование газа для определения приоритетности транзакции

Когда вы отправляете транзакцию, она получает приоритет на основе различных критериев. Одним из них является нормализованная цена газа транзакции.

Например:

* Боб отправляет транзакцию с `gas_price` 10.
* Алиса отправляет транзакцию в то же самое время с `gas_price` 20.

Транзакция Алисы будет иметь более высокий рейтинг, чем транзакция Боба.

### Основные принципы архитектуры проекта

Три ключевых принципа легли в основу архитектуры проекта на основе газа в Aptos и Move:

| Принцип                                                                       | Описание                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| ----------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Move полный с точки зрения Тьюринга                                           | <p>Из-за этого определить, завершается ли данная программа Move, нельзя статически. </p><p>Однако, гарантируя, что</p><ul><li>каждая инструкция байт-кода имеет ненулевое потребление газа, и</li><li>количество газа, с которым может быть запущена любая программа, ограничено, мы получаем это свойство завершения для программ почти бесплатно.</li></ul>                                                                                                              |
| Пресечение DDoS-атаки и поощрение разумного использования сети                | Использование газа для транзакции коррелирует с потреблением ресурсов этой транзакцией. Цена на газ и, следовательно, комиссия за транзакцию должны расти и падать в зависимости от конкуренции в сети. При запуске мы ожидаем, что цены на газ будут равны или близки к нулю. Но в периоды высокой конкуренции вы можете расставить приоритеты транзакций, используя цену на газ, что будет способствовать отправке только существенно важных транзакций в такие периоды. |
| Использование ресурсов программы должно быть согласовано на основе консенсуса | Это означает, что метод учета потребления ресурсов должен быть детерминированным. Это исключает другие средства отслеживания использования ресурсов, такие как счетчики циклов или любые методы, основанные на времени, поскольку они не гарантируют детерминированность между нодами. Метод отслеживания использования ресурсов должен быть абстрактным.                                                                                                                  |
