Solidity 数据类型详解:值类型与引用类型

基本概念

Solidity 是一种用于编写以太坊智能合约的高级编程语言。在 Solidity 中,数据类型分为值类型(基本数据类型)和引用类型。理解这些数据类型及其使用场景是编写高效、安全智能合约的基础。本文将详细介绍 Solidity 中的值类型和引用类型,并通过示例说明它们的使用场景。

1. 值类型(基本数据类型)

值类型在赋值或传递时总是按值拷贝,而不是按引用。修改拷贝的值不会影响原始值。

(1) 布尔类型

  • 类型 :bool
  • 取值 :true 或 false
  • 示例:
ini 复制代码
bool isReady = true;
bool isFinished = false;
  • 使用场景:用于表示状态或条件,例如合约中的开关或权限控制。

(2) 整数类型

  • 有符号整数:
    • 类型:int8 到 int256,以 8 位为步长(如 int8, int16, ..., int256)。
    • int 是 int256 的别名。
    • 示例:
ini 复制代码
int256 a = -10;
int b = 20; // int 是 int256 的别名
    • 使用场景:用于表示有符号的数值,例如温度、账户余额变化等。
  • 无符号整数:
    • 类型:uint8 到 uint256,以 8 位为步长(如 uint8, uint16, ..., uint256)。
    • uint 是 uint256 的别名。
    • 示例:
ini 复制代码
uint256 c = 100;
uint d = 200; // uint 是 uint256 的别名
    • 使用场景:用于表示无符号的数值,例如账户余额、计数器等。

(3) 地址类型

  • 类型:
    • address:存储 20 字节的以太坊地址。
    • address payable:与 address 类似,但可以接收以太币(ether)。
  • 示例:
ini 复制代码
address user = 0x1234567890123456789012345678901234567890;
address payable recipient = payable(user);
  • 使用场景:用于存储以太坊地址,例如用户地址、合约地址等。

(4) 固定大小字节数组

  • 类型 :bytes1 到 bytes32
  • 示例:
ini 复制代码
bytes32 hash = keccak256("Hello, Solidity!");
bytes1 firstByte = 0x01;
  • 使用场景:用于存储固定长度的字节数据,例如哈希值、加密数据等。

(5) 枚举类型

  • 类型 :enum
  • 示例:
ini 复制代码
enum State { Created, Locked, Inactive }
State public state = State.Created;
  • 使用场景:用于表示一组常量,例如订单状态、用户角色等。

2. 引用类型

引用类型在赋值或传递时按引用传递,修改引用会影响原始数据。

(1) 数组

  • 固定大小数组:
    • 类型:T[k],其中 T 是元素类型,k 是固定长度。
    • 示例:
ini 复制代码
uint[5] fixedArray;
    • 使用场景:用于存储固定长度的数据集合,例如投票结果、固定大小的列表等。
  • 动态大小数组:
    • 类型:T[],其中 T 是元素类型。
    • 示例:
ini 复制代码
uint[] dynamicArray;
    • 使用场景:用于存储可变长度的数据集合,例如用户列表、动态数据集等。

(2) 字节数组

  • 类型:
    • bytes:动态大小的字节数组。
    • string:动态大小的 UTF-8 字符串(本质上是 bytes 的特殊形式)。
  • 示例:
ini 复制代码
bytes data = "Hello";
string name = "Solidity";
  • 使用场景:用于存储字节数据或字符串,例如文件内容、文本信息等。

(3) 结构体

  • 类型 :struct
  • 示例:
ini 复制代码
struct User {
    string name;
    uint age;
}
User alice = User("Alice", 25);
  • 使用场景:用于定义复杂的数据结构,例如用户信息、订单详情等。

(4) 映射

  • 类型 :mapping
  • 示例:
ini 复制代码
mapping(address => uint) balances;
balances[0x123...] = 100;
  • 使用场景:用于存储键值对数据,例如账户余额、用户权限等。

3. 特殊类型

(1) 合约类型

  • 类型 :contract
  • 示例:
csharp 复制代码
contract MyContract {
    function foo() public pure returns (string memory) {
        return "Hello";
    }
}
MyContract c = new MyContract();
  • 使用场景:用于创建和调用其他合约。

总结

  • 值类型 :bool、int、uint、address、bytes1 到 bytes32、enum、function。
  • 引用类型 :数组、bytes、string、struct、mapping。
  • 特殊类型 :contract
相关推荐
木西8 天前
从 “跑鞋” 到实体卡牌藏品:户外 AR 互动游戏 GoCollect,产品架构全景解析
web3·智能合约·solidity
木西17 天前
把 NEAR 的 “链抽象与 AI 智能体” 搬进以太坊:用 Solidity 0.8.28 打造元交易意图结算核心底座
智能合约·solidity·以太坊
木西19 天前
链上再保险怎么落地?Re Protocol RWA 分层合约架构深度拆解
web3·智能合约·solidity
木西22 天前
CME 大宗商品链上实验:基于 Uniswap v4 Hook 的合约架构深度解析
web3·智能合约·solidity
木西25 天前
深度拆解 Ether.fi 核心架构:当 Liquid Restaking 遇上 ERC-4337 与智能金库
web3·智能合约·solidity
明月_清风25 天前
Foundry Invariant Testing 实战:ERC-4626 + Handler + Ghost Variable
后端·web3·solidity
明月_清风25 天前
Foundry Invariant Testing:让测试自动寻找复杂状态下的 Solidity Bug
后端·web3·solidity
明月_清风1 个月前
Foundry Cheatcode 详解:prank、warp、deal、expectRevert、expectEmit
后端·web3·solidity
明月_清风1 个月前
Foundry Fuzz Testing:让测试自动寻找 Solidity Bug
后端·web3·solidity
明月_清风1 个月前
Foundry Web3 测试框架入门:从 0 开始写 Solidity 测试
后端·web3·solidity