Solidity-006-不可变变量

87 阅读1分钟

背景

通过学习Solidity,然后输出文章检验自己的学习成果github仓库

基础知识

  • 不可变变量类似于常量,但是少了一些约束
  • 不可变变量的值可以在构造函数中初始化或在声明时初始化,但初始化后就不能被修改了,这样可以节省gas,提高合约的安全性
  • 值类型变量可以声明为immutable
  • constant不同,string和bytes不可以声明为immutable
  • Solidity 0.8.21之前,如果不对不可变变量,在构造函数或声明时初始化赋值,会报TypeError: Construction control flow ends without initializing all immutable state variables.

例子

例子

该例子是如何对不可变变量进行赋值

// SPDX-License-Identifier: MIT  
pragma solidity ^0.8.20;  
  
contract Immutable {  
    address public immutable MY_ADDRESS;  
    uint public immutable MY_UINT;  
    uint public immutable MY_LOVE = 1118;  
    uint public immutable NO_USAGE;  
  
    constructor(uint _myUint){  
        MY_ADDRESS = msg.sender;  
        MY_UINT = _myUint;  
    }  
}  

程序解析

address public immutable MY_ADDRESS;  
uint public immutable MY_UINT;  
uint public immutable MY_LOVE = 1118;  
uint public immutable NO_USAGE;  
  • 大写不可变变量的名称是一种编码习惯
  • NO_USAGE 是用来展示不对不可变变量进行初始化,但是由于Solidity对每个变量都有默认值,所以部署后,访问这个值会返回0
constructor(uint _myUint){  
    MY_ADDRESS = msg.sender;  
    MY_UINT = _myUint;  
}  
  • 不可变变量必须在构造函数的时候就赋值,构造函数只会在合约部署的时候调用一次