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. Он не эффективен и не имеет практического применения в реальных смарт-контрактах из-за своей природы намеренно вызывать сбой из-за исчерпания газа.