Skip to content

变量

Solidity 中,有三种类型的变量:状态变量、局部变量和全局变量。

  • 状态变量是指变量值永久保存在智能合约的存储空间中的变量;
  • 局部变量是指变量值仅在函数执行期间有效的变量,在函数退出后无效;
  • 全局变量保存在全局命名空间中,是一种特殊变量,用于获取整个区块链相关信息,与当前合约无关,例如时间戳和块高等。

Solidity 在变量声明时指定变量类型。每个变量声明时都有一个基于其类型的默认值,例如 int 类型的默认值为 0,不存在 undefinednull 的概念。

1. 状态变量

状态变量的值可以被多次访问和修改,且在合约生命周期内保持不变。它们可以被用于存储重要的数据和状态信息,例如存储用户账户信息或者记录合约历史状态。

示例

solidity
pragma solidity ^0.8.0;

contract MyContract {
    uint public myUint; // 声明一个公共的无符号整数状态变量,名为 myUint

    function setUint(uint _myUint) public {
        myUint = _myUint; // 设置 myUint 的值为函数传入的参数 _myUint
    }
}

在这个示例程序中,我们定义了一个名为 MyContract 的合约,并在其中声明了一个公共的无符号整数状态变量 myUint。我们同时为这个合约定义了一个名为 setUint 的函数,用于设置 myUint 变量的值。

Solidity 中,公共变量可以被合约内外的所有人访问。在这个示例中,myUint 变量使用了 public 关键字,因此可以在合约外部访问这个变量,并查询它的值。同时,我们也可以调用 setUint 函数来修改 myUint 变量的值。

2. 局部变量

与状态变量不同,局部变量是在 Solidity 函数内部和生命周期期内有效,主要用于函数内部运算和临时数据存储,例如简单的数学运算或临时转换数据类型。

示例

solidity
pragma solidity ^0.8.0;

contract MyContract {
  
    function exampleFunction() public returns (uint) {
        uint num1 = 10; // 声明一个无符号整数局部变量,名为num1,赋初值为10
        uint num2 = 5; // 声明一个无符号整数局部变量,名为num2,赋初值为5
        uint sum = num1 + num2; // 声明一个无符号整数局部变量,名为sum,值为num1和num2的和
        return sum; // 返回sum的值
    }
}

在这个示例程序中,我们定义了一个名为 exampleFunction 的函数,在函数中声明了三个无符号整数类型的局部变量 num1、num2 和 sum。在函数执行过程中,我们将 num1num2 的和赋值给了 sum,并返回了 sum 的值。

需要注意的是,局部变量的作用域只限于当前函数中。在示例函数 exampleFunction 内部执行完成后,局部变量num1、num2和sum 的值会被销毁。

3. 全局变量

全局变量通常是一个只读的变量,可以用于获取区块链的相关信息,例如区块高度、当前时间戳、消息发送者地址等信息。以下是一些常见的 Solidity 内置全局变量:

  • block.number: 当前块的块号。
  • block.timestamp: 当前块的时间戳。
  • msg.sender: 消息发送者的地址。
  • msg.value: 以 wei 为单位的消息 value 植。
  • now: 当前区块时间戳(等同于 block.timestamp)。

示例

solidity
pragma solidity ^0.8.0;

contract MyContract {
    uint public blockNumber; // 声明一个公共的无符号整数状态变量,名为blockNumber

    function getCurrentBlockNumber() public {
        blockNumber = block.number; // 将当前块的块号赋值给blockNumber
    }
}

在这个示例程序中,我们定义了一个名为 MyContract 的合约,并声明了一个公共的无符号整数状态变量 blockNumber

getCurrentBlockNumber 函数中,我们将全局变量 block.number 的值赋给了 blockNumber 变量。

需要注意的是,全局变量通常是只读的,不允许修改。因此,我们只能将全局变量的值赋给其他变量,而不能修改全局变量的值。