25.接收ETH
接收 ETH(不太理解)¶
三个关键字
- payable
- 使用 payable 标记的函数可以用于发送和接收 Eth。
- 使用 payable 标记的地址变量,允许发送和接收 Eth。
- fallback
- 一个合约可以最多有一个回退函数。
- receive
- 一个合约最多有一个
receive
函数
fallback 和 receive 不是普通函数,而是新的函数类型,有特别的含义,它们前面不需要加 function
这个关键字。加上 function
之后,它们就变成了一般的函数,只能按一般函数来去调用。同时 receive
和 fallback
需要注意 gas 消耗。
本节介绍的是合约如何接收 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;
}
}