变量
状态变量:状态变量是在合约内声明的变量;状态变量的数据存储在区块链上。
contract Demo {
uint public count; // 声明状态变量 count
}
本地变量:本地变量是在函数内声明的变量;本地变量的数据存储在内存中,函数执行完后 内存会被释放。
contract Demo {
function calculateSum(uint a, uint b) public pure returns (uint) {
uint c = a + b;
return c;
}
// 上例的 a b c 都是本地变量
}
全局变量:全局变量是 Solidity 提供的特殊变量,用于获取区块链相关的信息。
区块属性
block.basefee
(uint):当前区块的基础费用block.chainid
(uint):当前链的 IDblock.difficulty
(uint):当前区块的难度block.gaslimit
(uint):当前区块的 gas 限额block.number
(uint):当前区块号block.timestamp
(uint):当前区块的时间戳block.coinbase
(address):当前区块的矿工地址
交易属性
tx.gasprice
(uint):交易所需的 gastx.origin
(address):交易发起者的地址
消息属性
msg.data
(bytes):调用数据 (calldata)msg.sig
(bytes4):调用数据的前 4 个字节 (即函数选择器)msg.value
(uint):随调用发送的以太币数量 (以 wei 为单位)msg.sender
(address):调用者的地址
工具函数
gasleft() returns (uint)
:返回剩余的 gas 数量blockhash(uint blockNumber) returns (bytes32)
:返回指定区块的哈希值(仅适用于最近的 256 个区块)
contract Demo {
function getGlobalVariables() public view returns (address, uint) {
address sender = msg.sender; // 调用者的地址
uint timestamp = block.timestamp; // 当前区块的时间戳
return (sender, timestamp);
}
}
值类型
值类型的变量在赋值或作为函数参数传递时会被复制数据的值。
- 布尔类型:
contract Demo {
bool public isActive; // 默认为 false
}
整数类型:
无符号整数类型:
uint8
、uint16
、…、uint256
(uint256
可简写为uint
)有符号整数类型:
int8
、int16
、…、int256
(int256
可简写为int
)
contract Demo {
// 有符号整数类型
int public signedInt; // 默认为 0
// 无符号整数类型
uint public unsignedInt; // 默认为 0
}
- 在 Solidity 中可以直接通过 API 获取指定整数类型的最大最小值:
contract Demo {
uint public maxUint = type(uint).max; // 2^256-1
uint public minUint = type(uint).min; // 0
int public maxInt = type(int).max; // 2^255-1
int public minInt = type(int).min; // -2^255
}
- 地址类型:用于存储以太坊地址,占 20 字节
contract Demo {
address public owner; // 默认为 0x0000000000000000000000000000000000000000
}
定长字节类型:
bytes1
、bytes2
、…、bytes32
contract Demo {
bytes1 public dataHash1; // 默认为 0x00
bytes2 public dataHash2; // 默认为 0x0000
}
枚举类型:
枚举的默认值是其定义中的第一个值
枚举值在内部表示为 uint8,从 0 开始递增
contract Demo {
enum State {
PENDING, // 0
ACTIVE, // 1
INACTIVE // 2
}
State public state; // 默认值为 PENDING, 即 0
}
引用类型
引用类型的变量在赋值或作为函数参数传递时会被复制存储数据的地址。
- 字符串类型:
contract Demo {
string public stringData; // 默认为空字符串 ""
}
- 动态字节类型:
contract Demo {
bytes public byteData; // 默认为 0x
}
数组类型:
固定大小数组类型:
uint[5]
表示包含 5 个无符号整数的数组动态大小数组类型:
uint[]
表示大小可变的无符号整数数组
contract Demo {
// 固定大小数组类型
uint[3] public fixedArray1; // 默认为 [0, 0, 0]
// 动态大小数组类型
uint[] public dynamicArray; // 默认为 []
// 对于固定大小数组类型的变量, 还能如下创建
uint[] public fixedArray2 = new uint[](3); // 默认为 [0, 0, 0]
}
- 映射类型:用于存储 key-value
contract Demo {
mapping(address => uint) public balances;
// key-value 中, value 的默认值为对应类型的默认值, 这里为 uint 的默认值 0
}
- 结构体类型:用于将不同类型的数据组合在一起
contract Demo {
struct Person {
string name;
uint age;
}
Person public person;
// 数据的默认值为对应类型的默认值, 这里 name 默认为空字符串 "", age 默认为 0
}