Appearance
不可变量 
Solidity 是一种智能合约编程语言,具有不可变量的概念。
在 Solidity 中有两种类型的不可变量:常量和不可变状态变量。常量是在编译时确定的只读变量,并且只能是值类型(如整数、字符串、地址等)。
不可变状态变量是在合约发布时确定的变量,它们的值在部署合约后不能被修改。下面将分别解释这两种不可变量。
常量 
常量可以通过关键字 constant 或 immutable 定义。
两者的不同之处在于,constant定义的常量在 Solidity 0.5.0 版本后已经废弃,建议使用immutable 代替。
solidity
pragma solidity ^0.8.0;
contract MyContract {
    uint256 constant MY_CONSTANT = 12345;
    // 或者使用不推荐的语法:
    // uint256 constant public MY_CONSTANT_2 = 23456;
    
    function getValue() public pure returns (uint256) {
        return MY_CONSTANT;
    }
}在上述代码中,我们定义了一个名为 MY_CONSTANT 的常量,它的值为 12345 ,类型是 uint256。
在本例中,我们还提供了一个名为 getValue() 的公共函数,该函数返回这个常量的值,因为它是一个只读变量,所以我们将这个函数定义为 pure 类型。
不可变状态变量 
不可变状态变量是在合约发布时确定的,它的值不能被改变。
我们可以使用关键字 immutable 定义它们,这些变量必须在声明时或在构造函数中被初始化。
与常量不同,不可变状态变量可以是值类型或引用类型(如结构体)。
solidity
pragma solidity ^0.8.0;
contract MyContract {
    struct Person {
        string name;
        uint age;
    }
    // 不可变状态变量
    immutable Person public MY_PERSON = Person("Alice", 25);
    function getPersonName() public view returns (string memory) {
        return MY_PERSON.name;
    }
    function getPersonAge() public view returns (uint) {
        return MY_PERSON.age;
    }
}在上述代码中,我们定义了一个结构体 Person,它有两个属性:name 和 age。
接下来,我们定义了一个不可变状态变量 MY_PERSON ,它的类型是 Person ,并在声明时初始化。
我们还提供了两个函数 getPersonName() 和 getPersonAge() ,它们分别返回 MY_PERSON 的 name 和 age属性。
通过使用不可变变量,我们可以确保某些值在合约发布后不会被修改,这有助于确保智能合约的安全性。