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

相关推荐
木西10 小时前
硬核拆解 Uniswap V4:从单例架构、EIP-1153 到 Hooks 落地源码复刻
web3·智能合约·solidity
明月_清风13 小时前
💰 DeFi 入门完全指南:从 Uniswap 到 Aave,一文读懂去中心化金融
后端·web3
明月_清风13 小时前
🎨 NFT 全景解析:从 JPEG 到数字所有权革命
后端·web3
IvorySQL1 天前
PG 日报|优化缓冲区批量扫描,降低多套接字并发竞争
数据库·人工智能·postgresql·开源·区块链
mrbande1 天前
Vatee万腾:把信息透明度做扎实,更谨慎的使用者更容易感受到的清单
区块链
Web3李李1 天前
Web3 创业最大误区:DApp 能跑≠能上线!无数项目死在这个
金融·web3·区块链·智能合约·软件开发·dapp开发·defi开发
ithadoop1 天前
CLOB-FIRST:当永续合约把“订单簿“重新变成主角
区块链·clob·amm·永续合约·hyperliquid·dydx v4·gmx v2
木西2 天前
从理论到实践:Solidity 高性能集中流动性(CLMM)代码复刻与架构优化实战
web3·智能合约·solidity
明月_清风2 天前
🛡️ Web3 安全入门:新手防骗完全指南
后端·web3
明月_清风2 天前
🔐 Solidity 完全指南:关键语法解析与智能合约中的核心作用
后端·web3