solidity(8)

 🌟 Solidity数据之旅:掌握storage、memory和calldata🧠

在Solidity的世界里,数据就像是不同宇宙中的物质,根据它们存放的地方,拥有不同的特性和能量消耗(Gas)。

### 数据存储宝典:三种藏宝地📚

🛠️ storage - 永恒的宝库

- storage就像以太坊的金库,存储的数据珍贵且长久,就如同你在链上雕刻的篆文。
- 自然,状态变量(比如合约账本)都躺在这间安全的宝库里。
- 但要小心,每次访问或变更storage,就像是在金库里转动重重密码锁,需要消耗较多的Gas。

🔍 memory - 眼前即逝的记忆

- memory则相当于合约执行期间的短期记忆。它来得快,去得也快,随着函数的终止而消散。
- 函数的参数和局部变量喜欢待在这里,玩一场明快的游戏,Gas的花费也更加经济。

📦 calldata - 一次呼唤的回声

- calldata是特别的临时储藏室,它仅用于外部函数调用的那些参数,一旦设定,便不可更改。
- calldata是不可变的,正因为这个特性,与之打交道的Gas花费通常较低。

掌握了storage、memory和calldata,你也能成为数据存储的大师。在智能合约的设计中妙用这三种存储方式,既能保证数据安全,又能经济有效地使用Gas。

pragma solidity ^0.8.0;

contract StorageExample {
    // storage 类型的状态变量
    uint256 public storageVar;

    // 使用 memory 的函数
    function fMemory(uint256[] memory _arr) public pure returns (uint256[] memory) {
        // 对 memory 类型的数据进行操作
        // _arr[0] = 0; // 这样修改是允许的
        return _arr;
    }

    // 使用 calldata 的函数
    function fCalldata(uint256[] calldata _arr) public pure returns (uint256[] memory) {
        // 参数为 calldata 数组,不能被修改
        // _arr[0] = 0; // 这样修改会报错
        return _arr;
    }
}

🧪`fMemory`函数迎接你带来的记忆,并允许你在函数的一生中任意变换它,但随着函数的结束,所作的一切也会随之消失。

📜`fCalldata`函数却是个规矩之人,接受你给予的数据,但严格守护原貌,哪怕一丝毫的改变也是不被允许的。
这些存储位置的理解对于Solidity合约的编写至关重要,可以帮助你优化Gas消耗,提高合约的效率和安全性。

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值