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

相关推荐
傻小胖13 小时前
21.ETH-权益证明-北大肖臻老师客堂笔记
笔记·区块链
硅基流动16 小时前
硅基流动 × ValueCell:8K+Star,去中心化金融智能体加速投资决策
金融·去中心化·区块链
devmoon17 小时前
使用 Hardhat 在 Polkadot Hub 测试网部署基础 Solidity 合约(完整实战指南)
web3·区块链·智能合约·波卡·hardhat
威胁猎人18 小时前
【黑产大数据】2025年全球KYC攻击风险研究报告
大数据·区块链
焦点链创研究所18 小时前
去中心化实体基础设施网络的崛起:比较分析
网络·去中心化·区块链
MicroTech20251 天前
微算法科技(NASDAQ :MLGO)量子测量区块链共识机制:保障数字资产安全高效存储与交易
科技·安全·区块链
区块链蓝海1 天前
Ardor v2.6.0 正式发布:Nxt迁移完成,Ardor迈入多链协同新阶段
人工智能·区块链
MQLYES1 天前
02-UniswapV1-源码篇
去中心化·区块链
devmoon1 天前
快速了解兼容 Ethereum 的 JSON-RPC 接口
开发语言·网络·rpc·json·区块链·智能合约·polkadot
devmoon1 天前
用Remix IDE在Polkadot Hub部署一个最基础的Solidity 合约(新手友好)
web3·区块链·智能合约·编译·remix·polkadot