Solidity 教程 - 视图函数、虚函数讲解
Solidity 教程 - 视图函数, ,虚函数讲解
视图函数(View Functions)
一个函数可以声明为view
函数,但以下情况会被视为对状态的修改:
- 写入状态变量.
- 触发事件(events)。
- 创建其他合约。
- Using
selfdestruct
. - 通过
call
调用并附加了以太币。 - 调用任何没有标记为
view
orpure
的函数。 - 使用低级别的调用(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 之后已被弃用,因为它存在一些歧义,而view
更能清晰地表达函数的返回值不会修改状态。- 所有访问函数,也就是不修改状态的函数,应该都被标记为
view
,以明确表明它们不会对状态进行更改。 - 虽然当前编译器尚未强制要求声明函数为
view
,但强烈建议开发者在编写不会修改状态的函数时使用view
修饰符,以提高可读性和可维护性。
纯函数(Pure Functions)
函数可以声明为pure,表示它即不读取状态,也不修改状态,除了上一节介绍的几种修改状态的情况,以下几种情况被认为是读取了状态:
- 读状态变量
- 访问了 this.balance or <address>.balance
- 访问了block, tx, msg 的成员 (msg.sig 和 msg.data除外).
- 调用了任何没有pure修饰的函数
- 使用了包含特定操作符的内联汇编
Example.
pragma solidity ^0.4.16;
contract C {
function f(uint a, uint b) public pure returns (uint) {
return a * (b + 42);
}
}
虽然编译器目前没有强制要求使用 view
. pure
修饰符,且它们不会影响智能合约的 gas 消耗,但使用这些修饰符是一种良好的编码习惯,有助于提高智能合约的可维护性和可读性,同时可以更容易地发现潜在的错误。
Copyrights:Dexnav Posted on 2023年10月18日 am9:54。
Please specify source if reproducedSolidity 教程 - 视图函数、虚函数讲解 | Dexnav 区块链导航网
Please specify source if reproducedSolidity 教程 - 视图函数、虚函数讲解 | Dexnav 区块链导航网
Related posts
No comments...