Solidity中能否在view函数内调用状态修改函数?
在view函数中调用状态修改函数是否可行?
合约代码
ViewContract
contract ViewContract{ function callStateModifyingFunc() public view { require(address(this).balance >= gasleft(), "Insufficient balance in contract to cover gas costs."); modifyContract.setName("Blovario"); } }
ModifyContract
contract ModifyContract { string name; function setName(string newName){ name = newName; } }
报错信息
TypeError: Function declared as view, but this expression
(potentially) modifies the state and thus requires non-payable (the
default) or payable.
这种操作完全不可行,原因如下:
- Solidity对
view函数有严格约束:它只能读取链上状态,绝对不允许执行任何修改状态的操作,编译器会自动检测这类违规行为并报错。 - 你调用的
setName是普通函数(默认non-payable),它的作用是修改ModifyContract的状态变量name,属于明确的状态修改操作,和view函数的核心定义完全冲突。
如果需要在函数中同时完成读取和修改状态的操作,直接去掉view修饰符即可,使用默认的non-payable类型(无需接收ETH时),或根据需求标记为payable。
内容的提问来源于stack exchange,提问作者Blovnar
相关产品推荐
相关产品推荐

