view和pure的区别
在 Solidity 中,view
是一个函数修饰符,用于声明不修改状态变量的函数。它告诉编译器和调用者:这个函数只读不写,不会消耗 gas(除非在交易中调用)。
✅ view
的核心作用
特性 | 说明 |
---|---|
只读 | 不会修改区块链上的任何状态(如变量、余额、事件等)。 |
不消耗 gas | 如果通过 call 调用(如 Web3.js、Ethers.js 的 .call() ),不消耗 gas。 |
可在合约内部调用 | 其他函数可以安全地调用它,不用担心副作用。 |
不能修改状态 | 以下操作会报错: • 修改状态变量 • 触发事件 • 创建合约 • 使用 selfdestruct |
✅ 使用示例
pragma solidity ^0.8.0;contract Example {uint public number = 42;// ✅ 正确:只读函数function getNumber() public view returns (uint) {return number;}// ✅ 正确:使用 view 读取多个变量function getDouble() public view returns (uint) {return number * 2;}// ❌ 错误:试图修改状态,编译失败function setNumber(uint _n) public view {number = _n; // Error: Function declared as view}
}
✅ 什么时候用 view
场景 | 示例 |
---|---|
获取变量值 | balanceOf(address) |
计算结果 | getPrice() |
验证条件 | isValidUser(address) |
返回数组/结构体 | getUserInfo(address) |
✅ 对比其他修饰符
修饰符 | 是否修改状态 | 是否消耗 gas | 用途 |
---|---|---|---|
view | ❌ 不修改 | ❌ 不消耗(除非在交易中) | 只读 |
pure | ❌ 不读也不写 | ❌ 不消耗 | 纯计算 |
payable | ✅ 可接收 ETH | ✅ 消耗 gas | 转账 |
✅ 总结一句话
如果你的函数只是读取数据,就用
view
;如果连数据都不读,只是计算,就用pure
。