неизменая immutable - 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;
contract Immutable {
    //соглашение о кодирование константы в верхнем регистре
    address public immutable MY_ADDRESS;
    uint public immutable MY_UINT;
    constructor (uint _myUint){
        MY_ADDRESS = msg.sender;
        MY_UINT = _myUint;
    }
}
  • contract Immutable определяет новый контракт под названием Immutable.

Внутри контракта Immutable:

  • address public immutable MY_ADDRESS; - определяет неизменяемую (immutable) переменную MY_ADDRESS типа address. "Иммутабельность" позволяет установить значение этой переменной только один раз при создании контракта (в конструкторе) и затем значение не может быть изменено. Это экономит газ, поскольку доступ к иммутабельным переменным требует меньше газа, чем к обычным переменным состояния.

  • uint public immutable MY_UINT; - аналогично создает неизменяемую переменную MY_UINT типа uint (беззнаковое целое).

  • constructor (uint _myUint) - конструктор контракта, который вызывается один раз при деплое (размещении) контракта в блокчейне Ethereum. Он принимает один аргумент uint _myUint.

Внутри конструктора:

  • MY_ADDRESS = msg.sender; присваивает MY_ADDRESS адрес отправителя транзакции, который является адресом того, кто развертывает контракт.

  • MY_UINT = _myUint; присваивает MY_UINT значение, переданное в аргументе конструктора при развертывании контракта.

Как только контракт будет развернут на блокчейне Ethereum, значения в MY_ADDRESS и MY_UINT останутся постоянными на всё время жизни контракта - это и есть суть использования immutable переменных. Это позволяет сэкономить на газе при последующих вызовах этих переменных, так как они хранятся прямо в коде контракта, а не в его хранилище.