Solidity 中的`bytes`

在 Solidity 中,bytesbytes32 都是用来保存二进制数据 的类型,但它们的长度、使用场景、Gas 成本完全不同。


✅ 一句话区分

类型 一句话总结
bytes32 定长 32 字节,适合做哈希、地址、标识符等固定长度数据。
bytes 动态长度字节数组,适合任意长度数据(如字符串、序列化数据)。

📌 对比表

特性 bytes32 bytes (bytes memory / bytes calldata)
长度 固定 32 字节 (256 位) 动态长度,可以是 0~任意长度
存储位置 可作为 storage / memory / calldata 多为 memorycalldata(不能是 storage 直接存储)
Gas 成本 极便宜(固定大小) 随长度线性增加(32 字节为一个 slot)
可变性 不可变(定长) 可变(动态数组)
常见用途 哈希值、地址、UUID、枚举键 UTF-8 字符串、序列化数据、签名、IPFS 哈希
与字符串互转 bytes32 <=> string 需手动转换 bytesstring 可强制转换

✅ 代码示例

1. bytes32 用法
solidity 复制代码
bytes32 public constant ROLE_ADMIN = keccak256("ROLE_ADMIN");

function getHash(string memory text) public pure returns (bytes32) {
    return keccak256(abi.encodePacked(text)); // 返回 bytes32
}
2. bytes 用法
solidity 复制代码
function concat(string memory a, string memory b)
    public
    pure
    returns (string memory)
{
    return string(abi.encodePacked(a, b)); // 先转 bytes 再转 string
}
3. 二者互转
solidity 复制代码
// bytes32 -> bytes
bytes32 data = keccak256("hello");
bytes memory b = abi.encodePacked(data);

// bytes -> bytes32(必须保证长度 ≤ 32)
bytes memory b = "hello";
bytes32 data;
assembly {
    data := mload(add(b, 32)) // 手动加载前 32 字节
}

✅ 何时用哪个?

场景 推荐类型
哈希值 (如 keccak256 结果) bytes32
地址 (如 address 转 bytes) bytes32
UTF-8 字符串(不定长) stringbytes
ABI 编码数据 bytes memory
签名数据(>= 65 字节) bytes

✅ 一句话总结

  • bytes32:定长、省 gas,存哈希、存标识符
  • bytes:动态长度,存任意二进制或字符串数据
相关推荐
luckys.one3 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
~|Bernard|5 小时前
在 PyCharm 里怎么“点鼠标”完成指令同样的运行操作
算法·conda
战术摸鱼大师5 小时前
电机控制(四)-级联PID控制器与参数整定(MATLAB&Simulink)
算法·matlab·运动控制·电机控制
Christo35 小时前
TFS-2018《On the convergence of the sparse possibilistic c-means algorithm》
人工智能·算法·机器学习·数据挖掘
凡哥btczf6665 小时前
M61S 214T矿机详细参数解析与性能评估
区块链
好家伙VCC6 小时前
数学建模模型 全网最全 数学建模常见算法汇总 含代码分析讲解
大数据·嵌入式硬件·算法·数学建模
liulilittle7 小时前
IP校验和算法:从网络协议到SIMD深度优化
网络·c++·网络协议·tcp/ip·算法·ip·通信
bkspiderx9 小时前
C++经典的数据结构与算法之经典算法思想:贪心算法(Greedy)
数据结构·c++·算法·贪心算法
中华小当家呐10 小时前
算法之常见八大排序
数据结构·算法·排序算法
沐怡旸11 小时前
【算法--链表】114.二叉树展开为链表--通俗讲解
算法·面试