Solidity - 变量



Solidity 支持三种类型的变量。

  • 状态变量 (State Variables) − 值永久存储在合约存储中的变量。

  • 局部变量 (Local Variables) − 值仅在函数执行期间存在的变量。

  • 全局变量 (Global Variables) − 存在于全局命名空间中,用于获取有关区块链信息的特殊变量。

Solidity 是一种静态类型语言,这意味着在声明期间需要指定状态变量或局部变量的类型。每个声明的变量都根据其类型具有默认值。没有“未定义”或“空”的概念。

状态变量

值永久存储在合约存储中的变量。

pragma solidity ^0.5.0;
contract SolidityTest {
   uint storedData;      // State variable
   constructor() public {
      storedData = 10;   // Using State variable
   }
}

局部变量

值仅在其定义的函数内可用的变量。函数参数始终是该函数的局部变量。

pragma solidity ^0.5.0;
contract SolidityTest {
   uint storedData; // State variable
   constructor() public {
      storedData = 10;   
   }
   function getResult() public view returns(uint){
      uint a = 1; // local variable
      uint b = 2;
      uint result = a + b;
      return result; //access the local variable
   }
}

示例

pragma solidity ^0.5.0;
contract SolidityTest {
   uint storedData; // State variable
   constructor() public {
      storedData = 10;   
   }
   function getResult() public view returns(uint){
      uint a = 1; // local variable
      uint b = 2;
      uint result = a + b;
      return storedData; //access the state variable
   }
}

使用Solidity 第一个应用章节中提供的步骤运行上述程序。

输出

0: uint256: 10

全局变量

这些是存在于全局工作区中的特殊变量,它们提供有关区块链和交易属性的信息。

名称 返回值
blockhash(uint blockNumber) returns (bytes32) 给定区块的哈希值 - 仅适用于最近的 256 个区块(不包括当前区块)
block.coinbase (address payable) 当前区块矿工的地址
block.difficulty (uint) 当前区块难度
block.gaslimit (uint) 当前区块 gas 限制
block.number (uint) 当前区块编号
block.timestamp (uint) 自 Unix 纪元以来的当前区块时间戳(以秒为单位)
gasleft() returns (uint256) 剩余 gas
msg.data (bytes calldata) 完整的 calldata
msg.sender (address payable) 消息发送者(当前调用者)
msg.sig (bytes4) calldata 的前四个字节(函数标识符)
msg.value (uint) 随消息发送的 wei 数
now (uint) 当前区块时间戳
tx.gasprice (uint) 交易的 gas 价格
tx.origin (address payable) 交易发送者

Solidity 变量命名

在 Solidity 中命名变量时,请记住以下规则。

  • 您不应使用任何 Solidity 保留关键字作为变量名。这些关键字将在下一节中提及。例如,break 或 boolean 变量名无效。

  • Solidity 变量名不能以数字 (0-9) 开头。它们必须以字母或下划线开头。例如,123test 是无效的变量名,但 _123test 是有效的变量名。

  • Solidity 变量名称区分大小写。例如,Name 和 name 是两个不同的变量。

广告