前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Solidity:数据存储位置

Solidity:数据存储位置

作者头像
孟斯特
发布2024-05-28 20:38:58
920
发布2024-05-28 20:38:58
举报
文章被收录于专栏:code人生code人生

在 Solidity 中,有三种数据存储位置:storage、memory 和 calldata。这三者的差异主要在于它们的数据保存位置和存储周期。

1.Storage: Storage 指的是合约在区块链上的持久存储空间。这类数据会永久存储在区块链上,即使交易被挖矿并添加到区块链后,这些数据也会一直保留。 Storage 是昂贵的,因为它需要使用区块链的磁盘空间。所有的状态变量都存储在 storage 中。2.Memory: Memory 数据在临时内存中存储,当前函数执行完毕后,这部分数据就会被清除。Memory 数据不会被永久写入区块链,使用 Memory 比 Storage 成本低。Function 中的局部变量默认在 memory 中。3.Calldata: Calldata 用于函数参数,特别是对于 external 函数参数,这类数据只读且在函数调用期间存在。Calldata 在 EVM 中像 memory,但不会被修改,并且在函数调用期间可访问。

下面的示例中展示了三种数据存储位置:

代码语言:javascript
复制
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

contract DataLactionsTest {
    uint256 storageData; // 状态变量默认存储在 storage, 即链上

    function f(uint256 x) external {
        uint256 y = x; // 默认存储在 memory,函数执行结束后就被清除
        storageData = y + x;
    }

    function g(uint256[] calldata x) external pure returns (uint256) {
        return x[1]; // calldata 用于 external 函数参数,只读属性
    }
}

在这个例子中,storageData 是一个保存在 storage 的状态变量;在函数 f 中,变量 y 在 memory 中;而函数 g 中,参数 x 是 calldata 类型,仅在函数调用期间可用。

理解这三种数据存储位置之间的差异以及它们如何影响合约的成本,能帮助我们更有效地编写和优化智能合约。如果需要长期存储数据,那么数据应被存储在 storage;否则,如果数据是临时的,它应在 memory 中存储。对于外部函数参数,应优先考虑使用 calldata 来降低 gas 成本。

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)[1]进行许可,使用时请注明出处。 Author: mengbin[2] blog: mengbin[3] Github: mengbin92[4] cnblogs: 恋水无意[5] 腾讯云开发者社区:孟斯特[6]

References

[1] 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0): https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh [2] mengbin: mengbin1992@outlook.com [3] mengbin: https://mengbin.top [4] mengbin92: https://mengbin92.github.io/ [5] 恋水无意: https://www.cnblogs.com/lianshuiwuyi/ [6] 孟斯特: https://cloud.tencent.com/developer/user/6649301

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 孟斯特 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • References
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档