注:
仅作技术交流,禁止商用
如有侵权,请联系删除
目前理解相对比较浅,后续看以太坊数据结构的时候再进一步深入
1 基于hash槽(slot)方式来存取数据
合约的参数按顺序存储在slot上
每个slot大小为32字节, slot个数上限为2的256次方,可以理解为无限
slot上有数据才会占用数据空间
参数的可见性以slot为单位
2 每个合约有自己独立的命名空间,数据不冲突
3 编译器在编译合约时,会按类似c的方式优化数据存储分布,尽量减少空间占用
4 支持mapping, list, bytes, string, struct等常见数据结构
list
slot上存储实际长度。数据存储在keccak256(slotId),按顺序紧凑存储
string
<=31字节,单槽,长度2n,长度和数据在slotId上两头存储
>31字节,多槽,长度2n+1, 数据存在keccak256(slotId), 长度存在slotId
mapping
不可以遍历,如果需要遍历,额外使用list存储mapping的key
数据存储在 keccak256(key + "." + slotId)上,所以无法遍历
参考文档
《以太坊技术与实现》作者