Solidity参数
动态数据类型存储
String
- string 作为动态类型:
- 短
string(<31bytes),baseSlot存储string以及size(len(string) * 2),string中每个字符占据两位 - 短
string,string data编码在高位,size编码在低位
- 短
- 长
string(>31bytes),baseSlot仅存储size(len(string) * 2 + 1) - 长
string data存储的起始slot = keccak256(baseSlot),依次顺延存储
size
- 长/短
string的size计算方式不同的原因在于让字节码更好的区分string的长短 - 短
string的size = len(string)*2表示偶数,因此最后一位一定是0 - 长
string的size = len(string)*2+1表示奇数,最后一位一定是1
// SPDX-License-Identifier: MIT
pragma solidity =0.8.26;
contract ModMethod {
// Gas cost: 326
function isEvenMod(uint256 num) public pure returns (bool x) {
x = (num % 2) == 0;
}
// Gas cost: 272
function isEvenAnd(uint256 num) public pure returns (bool x) {
x = (num & 1) == 0;
}
}
Bytes
bytes动态数组slot存储规则和string一致bytes0x固定大小数组 和array固定数组存储规则一致