Gas и его значение в сети Ethereum
Мы продолжаем цикл статей о сети Ethereum и EVM в частности. Сегодня мы затронем тему "горючего" (gas) в сети.
Введение
Gas - условная единица, необходимая для измерения вычислительных затрат, необходимых для выполнения конкретных действий в сети Ethereum.
Название было выбрано не с проста. Это - прямая аналогия со словом gasolin, что в переводе означает "бензин". Как бензин "питает" двигатель автомобиля, чтобы он мог работать, так и gas в сети Ethereum "питает" EVM (Ethereum Virtual Machine).
Таким образом, каждая операция в EVM стоит определенное количество gas. Например, операция "сложение" стоит 3 gas, баланс аккаунта - 400 gas, подтверждение транзакции - 21000 gas. Полный список "стоимости" всех операций в сети вы можете посмотреть здесь.
Сама стоимость операции в gas не говорит, сколько мы должны заплатить за транзакцию. Чтобы рассчитать реальную стоимость - необходимо умножить количество gas на его цену. Цена газа измеряется в gwei, где 1 gwei = 0,000000001 ETH. Актуальную цену газа всегда можно посмотреть здесь.
Как правило, вы можете увидеть 3 разных стоимости газа на данный момент:
- Транзакция должна завершится как можно быстрее (fast)
- Транзакция должна завершится за "обычное" время (medium)
- Транзакция может выполняться достаточно долго (slow)
Само понятие gas существует исключительно внутри EVM. Пользователи же всегда платят или получают валюту в ETH.
Модель построения стоимости gas выбрана таким образом, чтобы исключить зависимость от курса ETH на данный момент. Если же цена ETH начинает расти, то стоимость газа уменьшается (при этом цена за транзакцию остается прежней). Однако эта цена напрямую коррелирует с нагрузкой сети. Почему же так происходит?
Модель майнинга
Все транзакции отправленные в сеть Ethereum попадают в mempool (Memory pool), где находятся в ожидании включения их в последующие блоки транзакций. Майнеры, которые собирают транзакции в блоки, и затем их проверяют, заинтересованы в том, чтобы сначала включить в блок транзакции с высокой стоимостью газа. Поскольку за единицу работы (формирование блока и его проверка) они смогут получить больше награды (комиссии). Необходимо отметить, что в блок попадает ограниченное число транзакций. Это значение определяется максимальным количество gas на 1 блок. Более подробно про майнинг и другие технические особенности можно узнать по ссылкам в конце статьи.
Таким образом на данный момент, текущая модель оплаты основана на механизме аукциона. Пользователь, который хочет быстрее всех осуществить транзакция в сети, должен перебить "ставку" другого пользователя. То есть заплатить более высокую цену "газа". Тогда майнер с большей вероятностью включит их транзакцию в блок раньше других (т.к. получит большую комиссию за работу).
Для чего нужен Gas?
EVM является полной по Тьюрингу машиной. То есть, она позволяет выполнять любой пользовательский код. Однако, это делает машину уязвимой к проблеме остановки.
Проблема остановки - это необходимость по описанию произвольной компьютерной программы определить, сможет ли она остановится, или продолжит работать вечно. Таким образом, пользователь мог бы исполнить программу, которая бы выполнялась вечно (злонамеренно или по ошибке в написании кода). Для предотвращения этой возможности, разработчики EVM предусмотрели "стоимость" каждой операции.
Каждая транзакция имеет лимит gas (gasLimit), который должен быть больше или равен совокупной стоимости всех затрат на операции внутри транзакции. Перед выполнением каждой операции в транзакции EVM проверяет, достаточно ли газа для выполнения такой операции. Если недостаточно, то вся транзакция отменяется и все изменения "откатываются" назад (rollback). Однако, даже в случае отмены транзакции, которая завершилась неудачей, пользователь платит комиссию за транзакцию пропорционально выполненной майнером работы. Если же, газа было заложено больше, чем потребовалось, то неиспользованный остаток конвертируется в ETH и возвращается по завершении транзакции отправителю.
Gas используется не только для оплаты тех или иных вычислений, но также и для оплаты за использование хранилища. Но об этом мы поговорим уже завтра;)
Друзья, мы намеренно стараемся упрощать материал в статьях, опуская многие сложные технические моменты. Не все участники имеют достаточный опыт для того, чтобы с лёгкостью переваривать такой материал. Для тех, кто уже знает материал на таком уровне — мы стараемся прикладывать ссылки на более глубокие и сложные статьи.
Полезная информация, послужившая основой этой статьи:
- Прекрасная презентация с иллюстрациями принципов работы Ethereum
- Официальная документация Ethereum
- Большая статья на русском языке от 2017г (в переводе) об Ethereum (можно найти ответы на вопросы, которые могут появиться при изучении презентации из п.1 или при прочтении данной статьи)
- Видео, которое послужило основой статьи