037.Solidity入门——24发送代币

Solidity 有三种方法可以发送代币,分别是 transfer、sendcall。

方法

描述

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());    
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35369459/article/details/129134191
今日推荐