400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

Solidity语法constant/view/pure关键字定义是什么

这篇文章主要讲解了“Solidity语法constant/view/pure关键字定义是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Solidity语法constant/view/pure关键字定义是什么”吧!

成都创新互联主要从事网页设计、PC网站建设(电脑版网站建设)、wap网站建设(手机版网站建设)、响应式网站建设、程序开发、网站优化、微网站、小程序定制开发等,凭借多年来在互联网的打拼,我们在互联网网站建设行业积累了丰富的成都网站设计、成都网站制作、网站设计、网络营销经验,集策划、开发、设计、营销、管理等多方位专业化运作于一体。

1

区别总结

在Solidity中constant,view,pure三个函数修饰词的作用是告诉编译器,函数不改变/不读取状态变量,这样函数执行就可以不消耗gas了(是完全不消耗!),因为不需要矿工来验证。

在Solidity v4.17之前,只有constant,后来有人嫌constant这个词本身代表变量中的常量,不适合用来修饰函数,所以将constant拆成了view和pure。

大家可以运行以下测试代码来加深这3个关键字的理解。

contract constantViewPure{

    string name;

    uint public age;

        function constantViewPure() public{

        name = "liushiming";

        age = 29;

    }

        function getAgeByConstant() public constant returns(uint){

        age += 1;  //声明为constant,在函数体中又试图去改变状态变量的值,编译会报warning, 但是可以通过

        return age;  // return 30, 但是!状态变量age的值不会改变,仍然为29!

    }

         function getAgeByView() public view returns(uint){

        age += 1; //view和constant效果一致,编译会报warning,但是可以通过

        return age; // return 30,但是!状态变量age的值不会改变,仍然为29!

    }

        function getAgeByPure() public pure returns(uint){ 

       return age; //编译报错!pure比constant和view都要严格,pure完全禁止读写状态变量!

        return 1;

    }

}

2

详细描述

2.1 Constant 状态变量

状态变量可以被声明为 constant。在这种情况下,只能使用那些在编译时有确定值的表达式来给它们赋值。 任何通过访问 storage,区块链数据(例如 now, this.balance 或者 block.number)或执行数据( msg.gas ) 或对外部合约的调用来给它们赋值都是不允许的。 在内存分配上有边界效应(side-effect)的表达式是允许的,但对其他内存对象产生边界效应的表达式则不行。 内建(built-in)函数 keccak256,sha256,ripemd160,ecrecover,addmod 和 mulmod 是允许的(即使他们确实会调用外部合约)。

允许带有边界效应的内存分配器的原因是这将允许构建复杂的对象,比如查找表(lookup-table)。 此功能尚未完全可用。

编译器不会为这些变量预留存储,它们的每次出现都会被替换为相应的常量表达式(这将可能被优化器计算为实际的某个值)。

不是所有类型的状态变量都支持用 constant 来修饰,当前支持的仅有值类型和字符串。

pragma solidity ^0.4.0;

contract C {

    uint constant x = 32**22 + 8;

    string constant text = "abc";

    bytes32 constant myHash = keccak256("abc");

}

2.2 View 函数

可以将函数声明为 view 类型,这种情况下要保证不修改状态。

下面的语句被认为是修改状态:

pragma solidity ^0.4.16;

contract C {

    function f(uint a, uint b) public view returns (uint) {

        return a * (b + 42) + now;

    }

}

注解:

2.3 Pure 函数

函数可以声明为 pure ,在这种情况下,承诺不读取或修改状态。

除了上面解释的状态修改语句列表之外,以下被认为是从状态中读取:

pragma solidity ^0.4.16;

contract C {

    function f(uint a, uint b) public pure returns (uint) {

        return a * (b + 42);
   }
}

警告

编译器没有强制 pure 方法不能读取状态。

感谢各位的阅读,以上就是“Solidity语法constant/view/pure关键字定义是什么”的内容了,经过本文的学习后,相信大家对Solidity语法constant/view/pure关键字定义是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


当前文章:Solidity语法constant/view/pure关键字定义是什么
URL标题:http://mzwzsj.com/article/gdcehh.html

其他资讯

让你的专属顾问为你服务