23-02-26

First Post:

Last Update:

2023-02-26

calldata与memory的区别

在 Solidity 中,参数可以被声明为 calldata 或 memory。

calldata 表示参数值在调用函数时不会被修改,而是被传递到函数中。在函数内部,它们可以被视为常量,不能被修改。当函数调用结束时,这些值也将被销毁。在视觉上, calldata 参数类似于函数签名中的参数。

memory 表示参数值在调用函数时可以被修改,并且在函数调用结束后将保留修改后的值。在函数内部, memory 用于存储临时变量和复制的值,例如在函数内部创建的新数组或结构体。在函数结束后,调用方可以通过返回值或事件查看修改后的值。

在传递大量数据时,使用 calldata 通常比使用 memory 更高效,因为它不需要在函数调用中复制大量数据。但是,如果需要对传递的数据进行修改,则必须使用 memory

元组 Tuple

在solidity中经常看到返回值是元组的,记录一下(函数哪里会有更详细用法)

1
2
3
4
5
6
7
8
9
10
11
12
13
pragma solidity ^0.8.17;
//SPDX-License-Identifier:MIT
contract tuple_test {
function returnTul() public reuturns(uint, bool) {
//...
reuturn (0, true);
}
function getTul() view public {
uint myUint;
bool myBool;
(myUint, myBool) = returnTul();
}
}

比较memory跟storage类型数据的string

1
2
3
if (keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b))) {
// do something
}