数据类型——变量的数据位置规则

Seven 2022-01-04 17:01:44
Categories: > Tags:

规则1 – 状态变量

状态变量总是存储在存储区中。

1
2
3
4
5
6
7
8
pragma solidity ^0.5.0;  

contract DataLocation {

// storage
uint stateVariable;
uint[] stateArray;
}

此外,不能显式地标记状态变量的位置。

1
2
3
4
5
6
7
pragma solidity ^0.5.0;  

contract DataLocation {

uint storage stateVariable; // 错误
uint[] memory stateArray; // 错误
}

规则2 – 函数参数与返回值

函数参数包括返回参数都存储在内存中。

1
2
3
4
5
6
7
8
9
10
11
12
pragma solidity ^0.5.0;  

contract DataLocation {

// storage
uint stateVariable;
uint[] stateArray;

function calculate(uint num1, uint num2) public pure returns (uint result) {
return num1 + num2
}
}

此处,函数参数 uint num1uint num2,返回值 uint result 都存储在内存中。

规则3 – 局部变量

值类型的局部变量存储在内存中。但是,对于引用类型,需要显式地指定数据位置。

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
pragma solidity ^0.5.0;  

contract Locations {

/* 此处都是状态变量 */

//存储在storage中
bool flag;
uint number;
address account;

function doSomething() public {

/* 此处都是局部变量 */

// 值类型
// 所以它们被存储在内存中
bool flag2;
uint number2;
address account2;

// 引用类型,需要显示指定数据位置,此处指定为内存
uint[] memory localArray;
}
}

不能显式覆盖具有值类型的局部变量。

1
2
3
4
5
6
7
8
9
10
function doSomething() public  {  

/* 此处都是局部变量 */

// 值类型
bool memory flag2; // 错误
uint Storage number2; // 错误
address account2;

}

规则4 – 外部函数的参数

外部函数的参数(不包括返回参数)存储在Calldata中。

附言

基础学习资料

与智能合约交互

源码

示例项目

调试工具