Skip to content

Latest commit

 

History

History
71 lines (47 loc) · 2.89 KB

16 数据位置.md

File metadata and controls

71 lines (47 loc) · 2.89 KB

数据位置

在Solidity中,数据位置非常重要,因为它可以影响变量、函数参数和返回值的行为。本文将详细探讨Solidity中的三种数据位置:storage、memory和calldata。

Storage

Storage是永久性存储位置,存储在以太坊区块链上。在合同中定义的变量、在结构体和数组中的元素及其映射键/值对都在storage中存储。对storage的访问是最昂贵的,并且只能使用整数类型、地址类型、定长数组和结构体。

下面是一个例子,演示了如何在storage中存储和读取变量:

pragma solidity ^0.8.0;

contract Storage {
    uint256 number; // stored in storage    function setNumber(uint256 _number) public {
        number = _number;
    }

    function getNumber() public view returns (uint256) {
        return number;
    }
}

在这里,number变量存储在合同的storage中。setNumber函数将_uint256_类型的参数存储到number变量中,而getNumber函数从storage中读取number变量的值并返回它。

Memory

Memory是临时性存储位置,它不会持久化在以太坊区块链中。在函数调用期间,函数参数和局部变量都存储在memory中。对memory的访问较便宜,但是只能使用整数类型、地址类型、定长数组、结构体、枚举和字符串。

下面是一个演示如何在memory中存储和读取数据的例子:

pragma solidity ^0.8.0;

contract Memory {
 function doSomething(uint256[] memory values) public pure returns (uint256) {
 uint256 sum;

 for (uint256 i =0; i < values.length; i++) {
 sum += values[i];
        }

        return sum;
    }
}

在这里,函数doSomething接收一个uint256类型的动态数组values。在函数执行期间,values数组存储在memory中。函数计算values数组中所有元素的总和,然后将其作为返回值返回。

Calldata

Calldata是一种特殊的存储位置,它用于存储在函数调用期间传递给合同的参数和数据。与memory相似,calldata的访问较便宜,但是只能使用定长字节数组。

下面是一个演示如何在calldata中读取数据的例子:

pragma solidity ^0.8.0;

contract Calldata {
    function doSomething(bytes memory data) public pure returns (bytes memory) {
        return data;
    }
}

在这里,函数doSomething接收一个bytes类型的参数data。data参数传递给函数在calldata中存储。函数返回接收到的参数data,然后返回它。

结论

在Solidity中,数据位置非常重要。Storage用于在区块链上永久存储数据,它很昂贵,只能使用基本类型和结构体。Memory用于在函数调用期间存储临时数据,它相对便宜,但不能存储动态数组。Calldata用于在函数调用期间传递参数和数据,它相对便宜,但只能使用定长字节数组。了解这些位置对于编写高效和经济的代码至关重要。