Solidity-constant、view、pure的区别

最近在学智能合约的编写,其中,对constant view pure的认识很模糊,于是查了些资料总结一下。

首先,这三个修饰词都意味着不需要消耗gas。

1、constant 常量,意味着不可变化。可以读取状态变量但是不能改。不是所有的类型都支持常量,它只能修饰值类型的变量和字符串。

pragma solidity ^0.4.20;
 
contract Test {
    
    uint public m1 = 2; //普通uint类型
    uint constant m2 = 2;//constant修饰的uint常量
    
    string str1 = "string1";//普通string类型
    string constant str2 = "string2";//constant修饰的string常量
    
    function f1() public {
        m1  = 20;
        // m2 = 20;  // 出错,无法修改constant修饰的常量(值类型)
        
        str1 = "String1!"; 
        // str2 = "String2!";   // 出错,无法修改constant修饰的常量(string类型)
    }
    
    // 结构体类型(引用类型)
    struct Person {
        string name;
        uint age;
    }
    // Person constant p1;  // 出错, constant仅可以修饰值类型,无法修饰引用类型(string除外)
 
 
    function f2() constant public {
        m1 = 5; // constant修饰的函数内,如果修改了状态变量,那么状态变量的值是无法改变的!!
        // 状态变量m1的值还是2,并未被修改。
    }

2、view
只可以修饰函数,不可以修饰变量。
它表明该函数内部可以对storage类型的变量进行读取,无法修改。(类似constant修饰的函数)

3、pure
只能修饰函数。
它表明该函数内,无法读/写状态变量,否则编译通不过。

function f3() pure public returns(uint){
        //return m1;  
        // 出错, pure修饰的函数内部无法修改也无法读取状态变量。
    }

参考:https://blog.csdn.net/houyanhua1/article/details/88964166

发布了16 篇原创文章 · 获赞 4 · 访问量 1772

猜你喜欢

转载自blog.csdn.net/qq_40509206/article/details/104345864