在以太坊区块链上,智能合约的编写离不开对数据类型的精确理解和运用,以太坊数据类型是 Solidity 编程语言(以太坊最主流的智能合约开发语言)的基础,它们定义了变量可以存储的数据种类、占用的内存或存储空间以及可执行的操作,掌握这些数据类型,对于编写安全、高效且符合逻辑的智能合约至关重要,本文将详细介绍以太坊(Solidity)中的主要数据类型。

以太坊的数据类型主要可以分为两大类:值类型(Value Types)和引用类型(Reference Types)。
值类型的变量在赋值或传递给函数参数时,总是被复制一份,这意味着对副本的修改不会影响原始变量。
布尔型 (bool)
true 或 false。&& (逻辑与)、 (逻辑或)、 (等于)、 (不等于) 等运算。bool public isActive = true;整数型 (Integers)
int) 和无符号整数 (uint)。int8 到 int256(8位到256位,有符号),uint8 到 uint256(8位到256位,无符号),默认是 int256 和 uint256。<, >, <=, >=)。uint256 public supply = 1000000000000000000; // 1e18地址型 (address)

balance:获取地址的以太币余额(单位是 wei)。transfer(uint amount):向地址发送指定数量的以太币(会抛出异常,消耗固定 2300 gas)。send(uint amount):向地址发送指定数量的以太币(返回 bool,可能失败,消耗最少 2300 gas)。call(bytes memory data):低级调用,可以发送数据和以太币,返回 (bool, bytes memory),消耗 gas 不固定。delegatecall(bytes memory data):低级委托调用,用于调用另一个合约的代码但使用当前合约的存储上下文。staticcall(bytes memory data):低级静态调用,确保不会修改状态变量。address public owner = msg.sender;定长字节数组 (Fixed-size Byte Arrays)
bytes1 到 bytes32。&, , ^)、长度访问(.length)、索引访问(如 bytesData[0])以及类型转换。bytes32 public constant HASH = keccak256("abc");枚举 (Enum)
enum State { Pending, Shipped, Delivered }
State public currentState; 函数类型 (Function Types)
public, private, internal, external)、状态可变性(pure, view, payable)以及是否返回值等特性。function add(uint a, uint b) public pure returns (uint) { return a b; }引用类型的变量存储的是数据的内存地址或位置,赋值或传递时传递的是引用,对引用的修改会影响原始数据,使用引用类型时需要特别注意数据位置(Data Location):storage(合约的持久化存储,昂贵)、memory(函数执行时的内存,临时且便宜)、calldata(函数参数的数据,只读,便宜)。
数组 (Arrays)

storage 或 memory(或 calldata,用于函数参数)。.length(获取/设置长度,动态数组可设置)、.push()(动态数组添加元素)、.pop()(动态数组移除最后一个元素)。uint[] public dynamicArray; // 动态数组,默认 storage
uint[5] public fixedArray; // 固定大小数组
function addToMemory() public pure {
uint[] memory memoryArray = new uint[](3); // memory 数组
memoryArray[0] = 1;
} 结构体 (Structs)
storage,也可以是 memory。struct User {
uint id;
string name;
bool isActive;
}
User public user = User(1, "Alice", true); 映射 (Mappings)
storage,不能用于 memory 或 calldata。mapping(address => uint) public balances; // 地址到余额的映射 mapping(uint => string) public idToName; // ID 到名称的映射
字符串 (string)
bytes),但提供了更方便的字符串操作。storage 或 memory。string public greeting = "Hello, Ethereum!";地址的成员 (address payable)
address payable 是 address 的子类型,增加了 transfer 和 send 方法(虽然 address 也有,但 payable 更明确表示可以接收以太币),普通地址可以通过 .call() 接收以太币。修饰符 (Modifiers)
onlyOwner 检查 msg.sender 是否为特定地址。view 和 pure 也是修饰符,用于声明函数不修改状态或读取状态。