Solidity - 变量

Solidity 支持三种类型的变量。

  • 状态变量 − 其值永久存储在合约存储中的变量。

  • 局部变量 − 其值在函数执行之前一直存在的变量。

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

Solidity 是一种静态类型语言,这意味着需要在声明时指定状态或局部变量类型。 每个声明的变量始终具有基于其类型的默认值。 不存在"未定义"或"null"的概念。

状态变量

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

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 First 应用 章节中提供的步骤运行上述程序。

输出

0: uint256: 10

全局变量

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

名称 返回
blockhash(uint blockNumber) returns (bytes32) 给定区块的哈希值 - 仅适用于 256 个最新区块(不包括当前区块)
block.coinbase (address payable) 当前区块矿工地址
block.difficulty (uint) 当前区块难度
block.gaslimit(uint) 当前区块gaslimit
block.number (uint) 当前区块号
块.timestamp(uint) 当前区块时间戳(自unix纪元以来的秒数)
gasleft() returns (uint256) Remaining gas
msg.data (bytes calldata) Complete 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 是两个不同的变量。