неизменая 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
переменных. Это позволяет сэкономить на газе при последующих вызовах этих переменных, так как они хранятся прямо в коде контракта, а не в его хранилище.