美文网首页
solidity的变量存储

solidity的变量存储

作者: 攻城老狮 | 来源:发表于2020-07-25 14:19 被阅读0次

状态变量与局部变量

状态变量:保存在区块链(合约)中的变量被称为状态变量

局部变量:函数的参数,返回参数以及在函数内部定义的变量称为局部变量

值类型和引用类型

值类型:值类型传递时,会临时拷贝一份内容,而不是拷贝指针。当修改新的变量时,不会影响原来变量的值。

  • 布尔(bool)
  • 整型(int/uint)
  • 地址(address)
  • 定长字节数组(bytes1,bytes2...bytes32)
  • 有理数和整数字面值常量
  • 枚举类型(enum)
  • 函数类型

引用类型:引用类型可以通过多个不同的名称修改它的值,这是因为新的变量同时指向同一个地址的原因。

  • 不定长字节数组(bytes)
  • 字符串(string)
  • 数组(array)
  • 结构体(struct)

引用类型的 memory 和 storage存储位置

  1. memory和storage的说明
    • memory:表示变量存储在内存中
    • storage:表示变量存储在区块链中
  2. 不同数据类型的变量默认的存储位置
    • 状态变量总是会存储在storage 中
    • 局部变量
      • 函数参数和返回值默认存放在 内存memory 中
      • 引用类型变量(结构、数组或映射类型)的局部变量,默认会存储在storage中
      • 值类型变量(除结构、数组及映射类型之外的简单类型),会储存在memory栈中
  3. 案例
    • memory赋值给局部变量
    • storage转storage
    • memory赋值给状态变量
    • storage转memory
    • memory转memory
pragma solidity ^0.4.17;

contract VarTest{
    string public name = "init";
    
    //memory赋值给局部变量
    function memoryToLocalval(string _name) pure public returns(string){
        string memory localName = _name;
        return localName; 
    }
    
    //storage转storage
    function storageToStorage(string storage _name) internal returns(string){
        string storage localName = _name;
        //error
        //localName = "yorick";
        bytes(localName)[0] = "h";
        return localName;
    }
    function callStorageToStorage() public returns(string){
        return storageToStorage(name); //状态变量的 init 变为 hnit
    }
    
    //memory赋值给状态变量,赋值之后再更改局部变量,不会影响状态变量
    function memoryToStorage(string _name) public{
        name = _name;
        _name = "hehe";
    }
    
    //storage转memory
    function storageToMemory(string storage _name) pure internal returns(string){
        string memory localName = _name;
        //此处修改局部变量不会影响状态变量
        localName = "hehe";
        return localName;
    }
    function callStorageToMemory() view public returns(string){
        return storageToMemory(name);
    }
    
    //memory转memory
    function memoryToMemory(string _name) pure internal{
        string memory localName = _name;
        bytes(localName)[0] = "h";
        //修改不会影响_name的值,可能是由于赋新的字符串指针执行另外的空间了
        //localName = "hehe";
    }
    function callMemoryToMemory() pure public returns(string){
        string memory localName = "yoyo";
        memoryToMemory(localName);
        return localName; //hoyo
    }
    
}

相关文章

网友评论

      本文标题:solidity的变量存储

      本文链接:https://www.haomeiwen.com/subject/khaplktx.html