跳转至

25.接收ETH

接收 ETH(不太理解)

三个关键字

  • payable
  • 使用 payable 标记的函数可以用于发送和接收 Eth。
  • 使用 payable 标记的地址变量,允许发送和接收 Eth。
  • fallback
  • 一个合约可以最多有一个回退函数。
  • receive
  • 一个合约最多有一个 receive 函数

fallback 和 receive 不是普通函数,而是新的函数类型,有特别的含义,它们前面不需要加 function 这个关键字。加上 function 之后,它们就变成了一般的函数,只能按一般函数来去调用。同时 receivefallback 需要注意 gas 消耗。

image-20230925104656487

本节介绍的是合约如何接收 ETH,至于合约如何发送 ETH,请阅读 两种形式的地址 这一节。

payable

Functions and addresses declared payable can receive ether into the contract.

  • 使用 payable 标记的函数可以用于发送和接收 Eth。
  • payable 意味着在调用这个函数的消息中可以附带 Eth。
  • 使用 payable 标记的 地址变量,允许发送和接收 Eth。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.1;

contract Payable{
    address payable public owner;

    constructor(){
        owner =payable (msg.sender);
    }

    function deposit() external payable {}

    function getBalance() external view returns (uint){
        return address(this).balance;
    }
}

Fallback

fallback()会在以下情况执行

  • 方法不存在(我调用foo方法,但是这个方法不存在
  • 直接发送ETH
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract Fallback {
    event Log(string func, uint gas);

    // Fallback function must be declared as external.
    fallback() external payable {
        // send / transfer (forwards 2300 gas to this fallback function)
        // call (forwards all of the gas)
        emit Log("fallback", gasleft());
    }

    // Receive is a variant of fallback that is triggered when msg.data is empty
    receive() external payable {
        emit Log("receive", gasleft());
    }

    // Helper function to check the balance of this contract
    function getBalance() public view returns (uint) {
        return address(this).balance;
    }
}