Solidity 有三种方法可以发送代币,分别是 transfer、send 和call。
方法 | 描述 |
transfer | 是 Solidity 中发送 代币 的最安全和推荐的方法。它会抛出异常并撤销整个交易,以防止攻击者接管合约。 |
send | 是一种比较早期的发送 代币 的方法。它返回一个布尔值,表示是否发送成功。但这种方法容易出现问题,不推荐使用。 |
call | 这种方法可以向其他合约发送 代币,并在调用函数时传递数据。这种方法需要在接收方合约中添加一个 payable 函数来接收 代币。如果接收方合约没有添加 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, uint amount) external payable {
//transfer方法
_to.transfer(amount);
}
function sendViaSend(address payable _to, uint amount) external payable {
//send 方法
bool sent = _to.send(amount);
require(sent, "send failed");
}
function sendViaCall(address payable _to, uint amount) external payable {
//call 方法
(bool success,) = _to.call{value: amount}("");
require(success, "call failed");
}
}
contract EthReceiver {//接收合约
event Log(uint amount, uint gas);
receive() external payable {
emit Log(msg.value,gasleft());
}
}