Solidity 练习:数据位置
睡不醒的鲤鱼 2022-12-29 Web3 Solidity
# 一、题目说明
变量存储在以下三个位置。
- storage:变量是状态变量 (存储在区块链上)。
- memory:变量在内存中,并且在函数调用期间暂时存在。
- calldata:包含函数参数的特殊数据位置。
memory 和 calldata 的区别?
calldata 和 memory 类似,但是不支持修改,而且节省 gas。
# 二、任务列表
- 完成函数 set(address _addr, string calldata _text),该函数将存储在 _addr 的 MyStruct 的 text 属性设置为 _text(注意:_text 被声明为 calldata 而不是 memory,最小化 gas 花费)。
- 完成函数 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
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