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

文章介绍了在Solidity中发送代币的三种方式:transfer是最安全的方式,会抛出异常防止合约接管;send已过时且可能有问题;call虽然灵活但需小心重入攻击,需确保接收合约有payable函数。
摘要由CSDN通过智能技术生成

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());    
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值