合约数据的构成和分布 2023-02-26

注:

仅作技术交流,禁止商用

如有侵权,请联系删除


目前理解相对比较浅,后续看以太坊数据结构的时候再进一步深入

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)上,所以无法遍历 

参考文档

《以太坊技术与实现》作者

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容