Solidity数据存储位置

EVM提供以下四种用于存储变量的数据结构: 

1.storage:可以被合约内所有函数访问的全局变量。是以太坊将其存储在环境中每个结点上的永久存储。

2.memory:合约中的每个函数都可以访问的本地内存。它是生命周期的短暂的内存,当函数执行完成后会被销毁。
大多数时候数据有默认的位置,但也可以通过在类型名后增加关键字storage或memory进行修改;

3.calldata:一块只读的不可修改的且不会永久存储的位置,存储所有传入的函数执行数据,包括函数参数。外部函数的参数(非返回参数)的数据位置被强制指定为calldata,效果跟memory差不多。

4.堆栈:EVM维护用于加载变量和使用以太坊指令集的变量和中间值的堆栈。

复杂类型,即数组、结构和映射类型,都有一个额外属性,“数据位置”,用来说明数据是保存在内存memory中还是存储storage中;
函数参数(包括返回的参数)的数据位置默认是memory, 局部变量(函数级,仅在函数内可用)的数据位置默认是storage,状态变量(合约中没有在任何函数内声明的(全局)变量)的数据位置强制是storage;

强制指定的数据位置:1.外部函数的参数(不包括返回参数); 2.状态变量:storage

默认数据位置:1.函数参数(包括返回参数):memory;2.引用类型(数组、结构和映射)的局部变量:storage(跟以太坊数据采用哈希表存储结构有关,memory没办法随意改); 3.值类型的局部变量:栈(stack)

specially:public类型的函数参数一定是memory类型,如果想让一个函数参数是storage类型,必须把这个函数本身指定为private或者public,这是为了防止随意的公开调用占用资源。

局部storage到storage类型的赋值是引用,不是copy.

参考资料:《Solidity编程-构建以太坊和区块链智能合约的初学者指南》+尚硅谷关于区块链的教学视频

                  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值