类型
//SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
contract Variables{
// 定义常量,声明时就要赋值
address public constant MGR_ADDR = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
// immutable -- 不可变量,可以在声明时赋值,也可在构造函数赋值
address public immutable OWNER_ADDR = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
// 布尔值
bool public _bool = true;
// 字符串
string public s = "Hello world";
// 无符号整数
uint public ui;
// 有符号整数
int public i;
// 使用type(xx).min获取最小值
int public minInt = type(int).min;
// 使用type(xx).max获取最大值
int public maxInt = type(int).max;
// 地址类型
address public addr = 0xD4Be041fb762980D242Bba468Eb51f836d18cD4B;
// 地址余额
uint256 public balance = addr.balance;
}
在solidity中,声明但没赋值的变量都有它的初始值或默认值
- boolean: false
- string:“”
- int: 0
- uint: 0
- address:0x0000000000000000000000000000000000000000 (或 address(0))
布尔值的运算符,包括:
! (逻辑非)
&& (逻辑与, “and” )
|| (逻辑或, “or” )
== (等于)
!= (不等于)
常用的整型运算符包括:
比较运算符(返回布尔值): <=, <, ==, !=, >=, >
算数运算符: +, -, 一元运算 -, +, *, /, %(取余),**(幂)
变量作用域
状态变量:是数据存储在链上的变量,所有合约内函数都可以访问 ,gas消耗高。状态变量在合约内、函数外声明:
contract Variables {
uint public a = 1;
uint public b;
string public c;
局部变量:是仅在函数执行过程中有效的变量,函数退出后,变量无效。局部变量的数据存储在内存里,不上链,gas低。局部变量在函数内声明:
function bar() external pure returns(uint){
uint aa= 1;
uint bb= 3;
uint cc= aa+ bb;
return(cc);
}
全局变量:是全局范围工作的变量,都是solidity预留关键字。他们可以在函数内不声明直接使用,下面是一些常用的全局变量,完整的列表请看这个链接:
- blockhash(uint blockNumber): (bytes32)给定区块的哈希值 – 只适用于256最近区块,
不包含当前区块。 - block.coinbase: (address payable) 当前区块矿工的地址
- block.gaslimit: (uint) 当前区块的gaslimit
- block.number: (uint) 当前区块的number
- block.timestamp: (uint) 当前区块的时间戳,为unix纪元以来的秒
- gasleft(): (uint256) 剩余 gas
- msg.data: (bytes calldata) 完整call data
- msg.sender: (address payable) 消息发送者 (当前 caller)
- msg.sig: (bytes4) calldata的前四个字节 (function identifier)
- msg.value: (uint) 当前交易发送的wei值