view和pure的区别

在 Solidity 中,view 是一个函数修饰符 ,用于声明不修改状态变量 的函数。它告诉编译器和调用者:这个函数只读不写,不会消耗 gas(除非在交易中调用)。


view 的核心作用

特性 说明
只读 不会修改区块链上的任何状态(如变量、余额、事件等)。
不消耗 gas 如果通过 call 调用(如 Web3.js、Ethers.js 的 .call()),不消耗 gas。
可在合约内部调用 其他函数可以安全地调用它,不用担心副作用。
不能修改状态 以下操作会报错: • 修改状态变量 • 触发事件 • 创建合约 • 使用 selfdestruct

✅ 使用示例

solidity 复制代码
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