transfer
(2300 gas,抛出错误)
send
(2300 gas,返回布尔值)
call
(转发所有gas或设置gas,返回布尔值)
三个方法的共同点:addr.transfer(1 ether)、addr.send(1 ether)、addr.call.value(1 ether)的接收方都是addr
如果使用addr.transfer(1 ether)、addr.send(1 ether),addr合约中必须增加fallback回退函数!
如果使用addr.call.value(1 ether),那么被调用的方法必须添加payable修饰符,否则转账失败!
源码:
pragma solidity ^0.8.7;
// 3 ways to send ETH
// transfer - 2300 gas, reverts
// send - 2300 gas, returns bool
// call -all gas, return bool and data
contract SendEther{
constructor() payable{}
receive() external payable {}
function sendViaTransfer(address payable _to) external payable {
_to.transfer(123);
}
function sendViaSend(address payable _to) external payable {
bool sent = _to.send(123);
require(sent, "send failed");
}
function sendViaCall(address payable _to) external payable {
(bool success,) = _to.call{value: 123}("");
require(success, "call failed");
}
}
contract EthReceiver {
event Log(uint amount, uint gas);
receive() external payable {
emit Log(msg.value,gasleft());
}
}