在Solidity中,storage、
memory和calldata
是用于声明和处理数据的三个关键字,它们具有不同的用途和作用域。
一、storage
storage
关键字用于声明永久存储在区块链上的数据,也就是合约的状态变量。使用storage
关键字声明的变量将持久保存在区块链上,直到合约被销毁。对于storage
变量,数据存储在合约的存储空间中,并且状态的更改将永久记录在区块链上。默认情况下,合约的状态变量是storage
类型。
在函数参数中使用storage
关键字是无效的,因为storage
关键字只用于声明合约的状态变量,而不适用于函数的形参,否则会报错。但在以下情况中必须使用:
//角色库(管理所有角色地址)
// 1. 实现增加角色地址
// 2. 移除角色地址
// 3. 判断角色地址是否被授权
library Roles {
struct Role {
mapping (address=>bool) bearer;
}
function add(Role storage role,address account) internal {
require(!has(role,account),"account already has role");