Концепции APTOS | Газ и плата за транзакции
Tags: blockchain, aptos, webdev, tutorial
Published: 2022-08-30 13:09:45

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

## Введение

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

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

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

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

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

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

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

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

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

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

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

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

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


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jsr8rchknx5suzhc2d6x.jpg)
_РИСУНОК 1.0 Поток газа и транзакций_
На диаграмме секции пролога и эпилога отмечены одним и тем же цветом. Это связано с тем, что эти участки потока транзакций должны быть не измерены:

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

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

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

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

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

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

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

Например:

- Bob отправляет транзакцию с `gas_price` 10.
- Alice в то же время посылает транзакцию с `gas_price` 20.

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

## Основные принципы разработки

Три центральных принципа лежали в основе разработки газа в Aptos и Move:

**Move является полным по Turing** - Из-за этого, определение того, завершается ли данная программа Move, не может быть решено статически. Однако, гарантируя, что
- каждая инструкция bytecode имеет ненулевое потребление газа, и
- количество газа, с которым может быть запущена любая программа, ограничено,
мы получаем это свойство завершения для программ почти бесплатно.

**Противодействие DDoS-атакам и поощрение разумного использования сети** - Использование газа для транзакции коррелирует с потреблением ресурсов этой транзакции. Цена газа и, следовательно, плата за транзакцию должны расти и падать в зависимости от уровня конкуренции в сети. При запуске мы ожидаем, что цена газа будет равна или близка к нулю. Но в периоды высокой загруженности сети вы можете определять приоритетность транзакций с помощью цены на газ, что будет стимулировать отправку только жизненно важных транзакций в такие периоды.

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