GAS - demonoved/A-trial-run-in-solidity GitHub Wiki
// SPDX-License-Identifier: MIT
// compiler version must be greater than or equal to 0.8.20 and less than 0.9.0
pragma solidity ^0.8.23;
// gas - единица вычисления
// gas spent - общая сумма использованого газа в транзакции
// gas prise - то сколько готовы заплатить газа
// gas limit - максимальное количество газа которое вы готовы использовать в транзакции
// block gas limit - максимально количество газа установленое сетью для блока
contract Gas {
uint public i = 0;
// использование всего отправленого газа приведет к сбою транзакции
// потраченый газ не возвращается
function forever() public {
//запускаем цикл пока не потратится весь газ
// в конце будет неудача из-за потраченного газа
while (true) {
i += 1;
}
}
}
Данный сегмент кода представляет собой простой контракт на языке Solidity для блокчейн-платформы Ethereum. Конкретный код иллюстрирует некоторые базовые концепции, связанные с газом в Ethereum - единицей измерения вычислительных усилий, необходимых для выполнения операций.
// SPDX-License-Identifier: MIT
Это лицензионное уведомление, которое говорит о том, что код распространяется под лицензией MIT. Такое уведомление обычно добавляется, чтобы уточнить условия использования и распространения кода.
// compiler version must be greater than or equal to 0.8.20 and less than 0.9.0 pragma solidity ^0.8.23;
Эта директива pragma устанавливает версию компилятора, который должен использоваться для компиляции контракта. В данном случае контракт совместим с версиями компилятора Solidity от 0.8.20 до 0.9.0.
Комментарии объясняют различные термины, связанные с газом в Ethereum:
gas - это единица измерения работы, которую необходимо выполнить.
gas spent - всего потрачено газа на транзакцию.
gas price - цена газа, то есть сколько эфира (ETH) отправитель готов заплатить за единицу газа.
gas limit - максимальное количество газа, которое отправитель готов потратить на транзакцию.
block gas limit - максимальное количество газа, которое может быть использовано в блоке, установленное сетью Ethereum.
contract Gas {
uint public i = 0;
function forever() public {
while (true) {
i += 1;
}
}
}
В контракте объявлен публичный целочисленный переменный i. Функция forever запускает бесконечный цикл, который увеличивает переменную i на единицу на каждой итерации. Важно отметить, что такая функция, когда вызывается, гарантированно застрянет и потребляет весь доступный газ (gas spent), что в конечном итоге приведёт к тому, что транзакция не пройдет, поскольку достигнет gas limit установленного отправителем или block gas limit. Затраченный газ не возвращается, и эфир, потраченный на газ, теряется.
Этот код является демонстрационным и носит обучающий характер, показывая как работает система газа в Ethereum. Он не эффективен и не имеет практического применения в реальных смарт-контрактах из-за своей природы намеренно вызывать сбой из-за исчерпания газа.