有三种通过调用函数发送以太币的方式:
<address payable>.transfer(uint256 amount)
<address payable>.send(uint256 amount) returns (bool)
<address>.call{gas: gasLimit, value: amount}(bytes memory) returns (bool, bytes memory)
transfer 和 send 要求接收方地址是 payable 的。会固定发送 2300 gas 的矿工费,不可调节。如果接收方是合约,那么合约的 receive 或 fallback 方法不能执行复杂的操作,否则会耗尽 gas,导致转账失败。
transfer 失败后会抛出异常,交易回滚。send 和 call 不会自动回滚交易,需要根据返回值处理回滚逻辑,这点特别需要注意。
call 是低级别方法,可以调用合约的任何函数,转账只是其中一种用法,具体用法可以参考 合约交互。仅就转账而言,其用法: