数据类型
在 Solidity 中,类型系统非常丰富,主要分为 值类型(Value Types)和 引用类型(Reference Types)。此外,还有一些特殊类型和全局变量。
一.值类型
布尔型(bool)
bool isActive = true;
二. 整数型(int/uint)
int:带符号整数(可以是负数),uint:无符号整数(只能是非负数)- 指定位宽:
int8到int256(步长为 8 位),默认int等于int256 - 同理,
uint默认等于uint256
int256 minValue = -1000;
uint256 maxValue = 1000;
三. 地址类型(address 和 address payable)
可以使用 balance 属性查询地址的余额,并使用 transfer 函数向可支付地址发送以太币(以 wei 为单位)
address payable x = payable(0x123);
address myAddress = address(this);
if (x.balance < 10 && myAddress.balance >= 10) x.transfer(10);
固定长度字节数组(bytes1 到 bytes32)
bytes32 data = "hello";
动态字节数组(bytes 和 string)
//bytes:动态长度的字节数组,适合存储任意二进制数据
//string:动态长度的 UTF-8 字符串
bytes dynamicData = "Hello";
string greeting = "Hello, World!";
枚举(enum)
enum Status { Pending, Shipped, Accepted, Rejected, Canceled }
Status public currentStatus = Status.Pending;
函数类型(function)
//分为 internal 和 external,表示合约内外的函数调用方式。function add(uint a, uint b) public pure returns (uint) {return a + b;
}
二.引用类型(Reference Types)
引用类型的数据存储在内存(Memory)或存储(Storage)中,传递时是「引用传递」,改变值会影响原数据。
数组(Array)
- 固定长度数组:
uint[5] arr; - 动态长度数组:
uint[] dynamicArr; - 可以使用
push()、pop()、length等方法操作。
uint[] numbers;
numbers.push(1);
结构体(Struct)
自定义数据结构,用于封装多种类型的变量
struct Person {string name;uint age;
}
Person public person = Person("Alice", 30);
映射(Mapping)
类似哈希表,key 映射到 value,key 可以是任何基本类型,但 value 可以是任意类型。
mapping(address => uint) public balances;
存储位置(Data Location)
memory:函数调用时使用的临时内存,函数返回后即丢弃。storage:合约的持久存储,状态变量默认是storage。calldata:函数的参数存储在calldata中,无法修改,节省 Gas 费。
三、特殊类型和全局变量
合约类型(Contract)
可以定义合约类型,支持合约之间的交互。
contract MyContract {function greet() public pure returns (string memory) {return "Hello!";}
}
全局变量
提供区块链信息和交易信息:
msg.sender:调用合约的地址msg.value:调用时发送的以太币数量block.timestamp:当前区块的时间戳
address sender = msg.sender;
总结
- 值类型:
bool、int/uint、address、bytes、string、enum、function - 引用类型:
array、struct、mapping - 存储位置:
memory、storage、calldata - 特殊类型:
contract、interface、library