对智能合约里的storage 和 memory两个关键字的理解

它们的概念可以分为两种:

  1. 智能合约是怎么样存储数据的, 在memory里还是storage里存储

  2. solidity变量怎么样存储数据的, 在memory里还是storage里

智能合约的数据存储:

  • 以下面这段代码为例:
pragma solidity^0.4.17;

contract Funding{

    Request[] public requests;
    
    //请求的结构体struct
    struct Request{
        string name;
    }

    //内容返回到request[]数组中
    function createRequest(string _name) public{
        Request memory request = Request({
            name:_name     
        });
        requests.push(request);
    }

 Request[] public requests;  这个数组包含的内容就存到了storage里,也就是直接写到了所有的区块链账本里了

  • storage : 它是成员变量. 能够跨函数调用(比如说在A函数里一个有requests,那就可以在B函数中把它取出来)
  • memory: 是临时数据的存储, 它只能在当前的函数生效, 比如说在矿工挖矿的函数里有一个临时变量, 在矿工电脑上完成了计算, 挖矿成功后变量就消失了, 别的函数是拿不到这个临时变量的. 函数的参数可以理解为memory类型

solidity变量的数据存储

实验一:

pragma solidity^0.4.17;

contract test{
    uint[] public array;
    
    function Array() public{
        array.push(1);
        array.push(2);
        
        uint[] storage a = array;
        
        a[0] = 27;
    }
}

//如果是storage,那么角标为0的时候输出为27
//如果是memory,那么角标为0的时候输出为1

可以得出的结论是: a和array指向的是相同的地方, a的值改了,那么也会把array里的值也改掉

实验二:

pragma solidity^0.4.17;

contract test{
    uint[] public array;
    
    function Array() public{
        array.push(1);
        array.push(2);
        
        uint[] a = array;
        
        // a[0] = 27;
        
        change(array);
    }
    
    function change(uint[] arr){
        arr[0] = 33;
    }
}

//这次角标为0的时候输出为1,角标为1的时候输出为2,和实验一不同了

总结实验一和实验二的区别:

值传递: memory

  • 引用实验一的数据: uint[] memory a = array;
  • 在array里已经存了1和2两个数据
  • memory是创建了一个array的copy, 地址不同,内容相同,a就指向了copy后的地址

引用传递: storage

  • 引用实验一的数据: uint[] storage a = array;
  • array指向一个地址
  • storage关键字声明a, 让a也找到和array相同的地址,传递的是array引用的东西,所以称为引用传递

memory是copy之前的变量然后创建新的变量,而storage是直接指向这个变量


如果是storage,那么角标为0的时候输出为27, 说明他是永久性的, 可以不断地进行调用
如果是memory,那么角标为0的时候输出为1, 说明是临时性的, 调用一次后就不能继续调用了

加一句: 

所有编程语言都只有值传递, 但是这个传递的是某个对象或者变量的地址时, 就可以理解为是引用传递

 

这个是编写solidity的工具网址

http://remix.ethereum.org/#optimize=false&version=soljson-v0.4.24+commit.e67f0147.js

 

阅读更多 登录后自动展开

更多精彩内容