stateOject中有两个Storage类型的变量,是用来缓存智能合约中所有变量的值的。这个Storage类型的定义如下:
type Storage map[common.Hash]common.Hash
就是一个map,key跟value都是common.Hash类型,其实就是[]byte。这个map只有在EVM执行SSTORE指令时候会赋值,用于记录变量的值。那么这里面的key跟value具体是什么内容呢?经研究,结果如下:
- 对于基本数据类型,key = 合约中的变量声明位置(从0开始)
- 对于map类型,key = SHA3(map中的关键字,变量声明位置),也就是把map中的关键字和变量声明位置拼在一起成为一个64字节的[]byte,然后计算hash值
- value不管在哪种情况下都存储变量的实际值
可以使用browser-solidity查看编译出来的EVM指令:
在编辑器中写测试代码:
pragma solidity ^0.4.0; contract Demo { int a; int x; mapping(address => int) b; function myfunc() publi