Skip to content

不可变量

Solidity 是一种智能合约编程语言,具有不可变量的概念。

Solidity 中有两种类型的不可变量:常量和不可变状态变量。常量是在编译时确定的只读变量,并且只能是值类型(如整数、字符串、地址等)。

不可变状态变量是在合约发布时确定的变量,它们的值在部署合约后不能被修改。下面将分别解释这两种不可变量。

常量

常量可以通过关键字 constantimmutable 定义。

两者的不同之处在于,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,它有两个属性:nameage

接下来,我们定义了一个不可变状态变量 MY_PERSON ,它的类型是 Person ,并在声明时初始化。

我们还提供了两个函数 getPersonName()getPersonAge() ,它们分别返回 MY_PERSONnameage属性。

通过使用不可变变量,我们可以确保某些值在合约发布后不会被修改,这有助于确保智能合约的安全性。