3分钟Solidity: 5.2 发送以太币(传输、发送、调用)

如需获取本内容的最新版本,请参见 Cyfrin.io 上的"发送以太币(传输、发送、调用)(代码示例)"

如何发送以太币?

您可以通过以下方式向其他合约发送以太币:

  • transfer(2300 gas,抛出错误)
  • send(2300 gas,返回布尔值)
  • call(转发所有 gas 或设置 gas,返回布尔值)

如何接收以太币?

一个接收以太币的合约必须至少包含以下函数之一:

  • receive() external payable
  • fallback() external payable

如果 msg.data为空,则会调用 receive(),否则会调用 fallback()

你应该使用哪种方法?

2019年12月之后,推荐使用结合了重入防护的call方法。

防范重入攻击的方法包括:

  • 在调用其他合约之前完成所有状态变更
  • 使用重入防护修饰器
solidity 复制代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract ReceiveEther {
    /*
    调用的函数是fallback()还是receive()?

           send Ether
               |
         msg.data is empty?
              / \
            yes  no
            /     \
    receive() exists?  fallback()
         /   \
        yes   no
        /      \
    receive()   fallback()
    */

    // receive函数。msg.data必须为空。
    receive() external payable {}

    // 当msg.data不为空时,将调用fallback函数
    fallback() external payable {}

    function getBalance() public view returns (uint256) {
        return address(this).balance;
    }
}

contract SendEther {
    function sendViaTransfer(address payable _to) public payable {
        // 此函数不再推荐用于发送以太币。
        _to.transfer(msg.value);
    }

    function sendViaSend(address payable _to) public payable {
        // Send返回一个布尔值,表示成功或失败。.
        // 不建议使用此函数发送以太币。
        bool sent = _to.send(msg.value);
        require(sent, "发送以太币失败");
    }

    function sendViaCall(address payable _to) public payable {
        // Call 返回一个布尔值,表示成功或失败。
        // 这是目前推荐使用的方法。
        (bool sent, bytes memory data) = _to.call{value: msg.value}("");
        require(sent, "发送以太币失败");
    }
}

Remix Lite 尝试一下

END

相关推荐
ChannelLab2 小时前
BONK FAQ:关于生态、产品、社区与金融化的 24 个核心问题
金融·区块链
超级架构师9 小时前
【区块链技术】区块链101:比特币是什么?
人工智能·区块链·比特币
维克兜率天11 小时前
4.3.2.1 日常监控:上线只是开始
服务器·数据库·python·区块链·php·量化
磐链科技2 天前
交易所开发核心:钱包提现引擎的设计——从风控拦截、多级审批到自动广播上链
web3·区块链
2601_962077982 天前
阿里二面,前端开发在web3.0中该如何应用,记录面经
区块链·前端开发·web3.0·技术趋势·学习准备
baopixiaoz2 天前
BeeQuant × BeeAgent:AI驱动智能交易
大数据·人工智能·python·区块链
ZDGJ60993 天前
恒指期货什么意思,恒指期货怎么看
区块链
综合简报3 天前
东南亚发稿多少钱一篇?预算怎么规划?如何选到高性价比服务商?
区块链
磐链科技4 天前
区块链开发入门实战:用 Hardhat 与 Ethers.js 搭建你的第一个 DApp
开发语言·javascript·区块链
磐链科技4 天前
Web3钱包开发中的交易风控体系:模拟执行、沙盒隔离与授权拦截
web3·区块链