0%

solidity | 引用类型

这里说一下 solidity 的引用类型。


存储位置


  • storage 「区块链中,具备永久性」
    • 状态变量
    • 复杂类型的局部变量
  • memory「EVM 内存」
    • 局部变量及参数

storage

1
2
3
4
5
6
7
8
9
contract A{
uint a;
}

contract A{
function b(){
uint[] a;
}
}

上面的 a 都存储在 storage 中。

memory

1
2
3
4
5
contract A{
function a(uint[] a){
uint b;
}
}

a,b 放在 memory 中。

规则

  • memorystorage 之间总是会创建一个完全独立的拷贝
  • 状态变量相互赋值总是会创建一个完全独立的拷贝
  • 同样位置的数据存储之间赋值只是引用传递
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
pragma solidity ^0.4.18;

contract Test{

uint[] x; // x 的存储位置是 storage

function f(uint[] memoryArray) public returns(uint[]){
x = memoryArray; // 从 memory 复制到 storage

uint[] y = x; // storage 引用传递局部变量 y(y 是一个 storage 引用)
y[1] = 2; // x y 都会改变

// 错误不能把 memory 赋值给局部变量
// y = memoryArray;

g(x); // 引用传递,g 可以改变 x 的值
h(x); // 拷贝到 memory 不可以改变 x 的值
return x;
}

function g(uint[] storage storageArray) internal {
storageArray[2] = 3;
}
function h(uint[] memoryArray){
memoryArray[2] = 4;
}

}
请我喝杯咖啡吧~