在 Solidity 中,view 和 pure 是用于修饰函数的关键字,它们描述了函数对区块链状态的读写行为。正确使用这两个修饰符可以提高代码的可读性,并帮助编译器进行静态检查。
1. view 函数
- 承诺:不修改状态,但可以读取状态变量。
- 允许的操作:
- 读取状态变量(如
uint public data)。 - 调用其他
view或pure函数。 - 访问
address(this).balance或block.number等区块链数据(这些不属于“状态修改”)。
- 读取状态变量(如
- 禁止的操作:任何会改变状态的行为,例如:
- 修改状态变量。
- 触发事件。
- 创建其他合约。
- 使用
selfdestruct。 - 调用可能修改状态的函数(非
view/pure函数)。 - 发送以太币等。
- 用途:通常用于查询合约数据的函数。
示例:
1contract Example { 2 uint public data = 42; 3 4 function getData() public view returns (uint) { 5 return data; // 读取状态变量 6 } 7 8 function multiply(uint a) public view returns (uint) { 9 return a * data; // 可以读取状态变量 10 } 11} 12
2. pure 函数
- 承诺:既不读取也不修改状态,函数的输出完全由输入参数决定(纯计算)。
- 允许的操作:
- 使用函数参数或局部变量。
- 调用其他
pure函数。 - 读取编译时常量(
constant)或不可变变量(immutable)——因为这些值在编译或部署时已确定,不视为“状态”。 - 进行数学运算、字符串拼接等纯计算。
- 禁止的操作:
- 读取状态变量。
- 访问
address(this).balance、block.timestamp等与区块链相关的特殊变量。 - 任何
view禁止的操作(修改状态)。
- 用途:工具函数、数学计算、不依赖合约状态的辅助逻辑。
示例:
1contract Example { 2 uint public data = 42; 3 uint public constant FIXED = 100; 4 5 function add(uint a, uint b) public pure returns (uint) { 6 return a + b; // 仅使用输入参数 7 } 8 9 function multiplyWithFixed(uint a) public pure returns (uint) { 10 return a * FIXED; // 可以读取常量 constant 11 } 12} 13
| 特性 | view | pure |
|---|---|---|
| 读取状态变量 | ✅ 允许 | ❌ 不允许(除 constant/immutable) |
| 修改状态 | ❌ 不允许 | ❌ 不允许 |
| 读取区块链数据 | ✅ 允许(如 block.timestamp) | ❌ 不允许 |
| 调用限制 | 可调用 view/pure 函数 | 只能调用 pure 函数 |
| 典型用途 | 查询合约数据 | 纯计算逻辑 |
Gas 消耗
- 外部调用(通过
eth_call模拟执行):view和pure函数不消耗 Gas,因为它们不产生交易,只查询数据。 - 内部调用(作为交易的一部分):如果在一个交易中调用
view/pure函数(例如被非
总结:view 和 pure 是 Solidity 中重要的函数修饰符,用于明确函数对状态的访问意图。view 表示只读状态,pure 表示既不读也不写状态,后者更为严格。在开发智能合约时,根据函数实际行为正确使用它们,可以避免意外状态修改,并优化外部查询的效率。
编程作业
- 任务:创建一个Solidity智能合约,包含以下功能:
。一个pure函数,计算两个输入整数的乘积。
。一个view函数,返回智能合约中存储的一个状态变量的值。
1// SPDX-License-Identifier: MIT 2pragma solidity 0.8.7; 3 4contract MathContract{ 5 uint public sotredValue; 6 7 constructor(uint initialValue){ 8 sotredValue = initialValue; 9 } 10 11 // Pure function to calculate product of two numbers 12 function multiply(int a,int b) public pure returns (int){ 13 return a*b; 14 } 15} 16
《从零开始的Web3学习 10| Solidity 视图和纯函数 (View and Pure Functions)》 是转载文章,点击查看原文。