前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Solidity 教程系列11 - 视图函数、虚函数讲解

Solidity 教程系列11 - 视图函数、虚函数讲解

作者头像
Tiny熊
发布2018-08-23 14:47:24
4790
发布2018-08-23 14:47:24
举报

Solidity 教程系列第11篇 - Solidity 视图函数、虚函数讲解。 Solidity 系列完整的文章列表请查看分类-Solidity。

写在前面

Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊、智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么

视图函数(View Functions)

一个函数如果它不修改状态变量,应该声明为view函数,不过下面几种情况认为是修改了状态:

  1. 写状态变量
  2. 触发事件(events)
  3. 创建其他的合约
  4. call调用附加了以太币
  5. 调用了任何没有viewpure修饰的函数
  6. 使用了低级别的调用(low-level calls)
  7. 使用了包含特定操作符的内联汇编

看一个例子:

代码语言:javascript
复制
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;
    }
}

有几个地方需要注意一下:

  1. 声明为view 和声明为constant是等价的,constant是view的别名,constant在计划Solidity 0.5.0版本之后会弃用(constant这个词有歧义,view 也更能表达返回值可视)。
  2. 访问函数都被标记为view。

当前编译器并未强制要求声明为view,但建议大家对于不会修改状态的函数的标记为view。

纯函数(Pure Functions)

函数可以声明为view,表示它即不读取状态,也不修改状态,除了上一节介绍的几种修改状态的情况,以下几种情况被认为是读取了状态:

  1. 读状态变量
  2. 访问了 this.balance\ .balance
  3. 访问了block, tx, msg 的成员 (msg.sig 和 msg.data除外).
  4. 调用了任何没有pure修饰的函数
  5. 使用了包含特定操作符的内联汇编

看一个例子:

代码语言:javascript
复制
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 消耗的改变,但是更好的编码习惯让我们跟容易发现智能合约中的错误。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 深入浅出区块链技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面
  • 视图函数(View Functions)
  • 纯函数(Pure Functions)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档