call调用必定要消耗gas吗?与直接使用函数名调用有啥区别?

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??

请先 登录 后评论

1 个回答

zen
请先 登录 后评论
  • 0 关注
  • 1 收藏,3081 浏览
  • kugool 提出于 2022-03-08 09:55