Solidity 练习:数据位置

2022-12-29 Web3 Solidity

# 一、题目说明

变量存储在以下三个位置。

  • storage:变量是状态变量 (存储在区块链上)。
  • memory:变量在内存中,并且在函数调用期间暂时存在。
  • calldata:包含函数参数的特殊数据位置。

memory 和 calldata 的区别?

calldata 和 memory 类似,但是不支持修改,而且节省 gas。

# 二、任务列表

  1. 完成函数 set(address _addr, string calldata _text),该函数将存储在 _addr 的 MyStruct 的 text 属性设置为 _text(注意:_text 被声明为 calldata 而不是 memory,最小化 gas 花费)。
  2. 完成函数 get(address _addr),返回存储在 _addr 的 MyStruct 的 text 属性。

# 三、解答代码

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract DataLocations {
    // Data locations of state variables are storage
    uint public x;
    uint public arr;

    struct MyStruct {
        uint foo;
        string text;
    }

    mapping(address => MyStruct) public myStructs;

    // Example of calldata inputs, memory output
    function examples(uint[] calldata y, string calldata s)
        external
        returns (uint[] memory)
    {
        // Store a new MyStruct into storage
        myStructs[msg.sender] = MyStruct({foo: 123, text: "bar"});

        // Get reference of MyStruct stored in storage.
        MyStruct storage myStruct = myStructs[msg.sender];
        // Edit myStruct
        myStruct.text = "baz";

        // Initialize array of length 3 in memory
        uint[] memory memArr = new uint[](3);
        memArr[1] = 123;
        return memArr;
    }

    function set(address _addr, string calldata _text) external {
        MyStruct storage myStruct = myStructs[_addr];
        myStruct.text = _text;
    }

    function get(address _addr) external view returns (string memory) {
        return myStructs[_addr].text;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

# 四、参考资料

Last Updated: 2023-01-28 4:31:25