contract A {
function a() public view{
}
}
contract B {
function functionNameCall(address addr) public view{
A(addr).a();
}
function rawCall(address addr) public view{
bytes4 SELECTOR = bytes4(keccak256(bytes("a()")));
(bool success, bytes memory returnedData) = addr.call(abi.encodeWithSelector(SELECTOR));
}
}
编译报错`Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default)or payable
两种方式调用另外一个合约的view函数,一个使用函数名直接调用,另外一个使用call调用,但是报错显示call调用会改变合约状态。
请问这是什么原因,难道call注定会消耗gas吗,为什么直接使用函数名调用就不会消耗gas??