首页 > 上网技巧 > 电脑小技巧 > Solidity教程之视图函数 虚函数讲解

Solidity教程之视图函数 虚函数讲解

时间:2019-11-04 17:42 作者:QQ地带 我要评论

Solidity 系列完整的文章列表请查看分类 - Solidity。
 
写在前面
Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊、智能合约有所了解,
如果你还不了解,建议你先看以太坊是什么
 
欢迎订阅区块链技术专栏阅读更全面的分析文章。
 
视图函数(View Functions)
一个函数如果它不修改状态变量,应该声明为 view 函数,不过下面几种情况认为是修改了状态:
 
写状态变量
触发事件(events)
创建其他的合约
使用 selfdestruct。
call 调用附加了以太币
调用了任何没有 view 或 pure 修饰的函数
使用了低级别的调用(low-level calls)
使用了包含特定操作符的内联汇编
看一个例子:
 
pragma solidity ^0.4.16;
 
contract C {
    uint public data = 0;
 
    function f(uint a, uint b) public view returns (uint) {
        return a * (b + 42) + now;
    }
 
    // 错误做法,虽然可以编译通过
    function df(uint a) public view  {
        data = a;
    }
}
有几个地方需要注意一下:
 
声明为 view 和声明为 constant 是等价的,constant 是 view 的别名,constant 在计划 Solidity 0.5.0 版本之后会弃用(constant 这个词有歧义,view 也更能表达返回值可视)。
访问函数都被标记为 view。
当前编译器并未强制要求声明为 view,但建议大家对于不会修改状态的函数的标记为 view。
 
纯函数(Pure Functions)
函数可以声明为 pure,表示它即不读取状态,也不修改状态,除了上一节介绍的几种修改状态的情况,以下几种情况被认为是读取了状态:
 
读状态变量
访问了 this.balance 或 \
.balance
访问了 block, tx, msg 的成员 (msg.sig 和 msg.data 除外).
调用了任何没有 pure 修饰的函数
使用了包含特定操作符的内联汇编
看一个例子:
 
pragma solidity ^0.4.16;
 
contract C {
    function f(uint a, uint b) public pure returns (uint) {
        return a * (b + 42);
    }
}
尽管 view 和 pure 修饰符编译器并未强制要求使用,view 和 pure 修饰也不会带来 gas 消耗的改变,但是更好的编码习惯让我们跟容易发现智能合约中的错误。

标签: Solidity
顶一下
(0)
0%
踩一下
(0)
0%

Google提供的广告