Solidity 教程 – 视图函数、虚函数讲解

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

电报联系方式

视图函数(View Functions)

一个函数可以声明为view函数,但以下情况会被视为对状态的修改:

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

举一个例子:

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. viewconstant 是等效的,实际上 constantview 的别名。然而,constant 在 Solidity 版本 0.5.0 之后已被弃用,因为它存在一些歧义,而 view 更能清晰地表达函数的返回值不会修改状态。
  2. 所有访问函数,也就是不修改状态的函数,应该都被标记为 view,以明确表明它们不会对状态进行更改。
  3. 虽然当前编译器尚未强制要求声明函数为 view,但强烈建议开发者在编写不会修改状态的函数时使用 view 修饰符,以提高可读性和可维护性。

纯函数(Pure Functions)

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

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

例子:

pragma solidity ^0.4.16;

contract C {
function f(uint a, uint b) public pure returns (uint) {
return a * (b + 42);
}
}

虽然编译器目前没有强制要求使用 viewpure 修饰符,且它们不会影响智能合约的 gas 消耗,但使用这些修饰符是一种良好的编码习惯,有助于提高智能合约的可维护性和可读性,同时可以更容易地发现潜在的错误。

开发联系:DEXDAO

 

© 版权声明

相关文章

暂无评论

暂无评论...