首页 > 其他分享 >Solidity极简入门#19. 接收ETH

Solidity极简入门#19. 接收ETH

时间:2023-02-20 19:05:44浏览次数:39  
标签:极简 函数 19 Solidity receive msg fallback 合约 ETH

Solidity支持两种特殊的回调函数,receive()和fallback(),他们主要在两种情况下被使用:

  1. 接收ETH
  2. 处理合约中不存在的函数调用(代理合约proxy contract)

注意⚠️:在solidity 0.6.x版本之前,语法上只有 fallback() 函数,用来接收用户发送的ETH时调用以及在被调用函数签名没有匹配到时,来调用。 0.6版本之后,solidity才将 fallback() 函数拆分成 receive() 和 fallback() 两个函数。

我们这一讲主要讲接收ETH的情况。

接收ETH函数 receive

receive()只用于处理接收ETH。一个合约最多有一个receive()函数,声明方式与一般函数不一样,不需要function关键字:receive() external payable { ... }。receive()函数不能有任何的参数,不能返回任何值,必须包含external和payable。

当合约接收ETH的时候,receive()会被触发。receive()最好不要执行太多的逻辑因为如果别人用send和transfer方法发送ETH的话,gas会限制在2300,receive()太复杂可能会触发Out of Gas报错;如果用call就可以自定义gas执行更复杂的逻辑(这三种发送ETH的方法我们之后会讲到)。

我们可以在receive()里发送一个event,例如:

// 定义事件
event Received(address Sender, uint Value);
// 接收ETH时释放Received事件
receive() external payable {
emit Received(msg.sender, msg.value);
}

有些恶意合约,会在receive() 函数(老版本的话,就是 fallback() 函数)嵌入恶意消耗gas的内容或者使得执行故意失败的代码,导致一些包含退款和转账逻辑的合约不能正常工作,因此写包含退款等逻辑的合约时候,一定要注意这种情况。

回退函数 fallback

fallback()函数会在调用合约不存在的函数时被触发。可用于接收ETH,也可以用于代理合约proxy contract。fallback()声明时不需要function关键字,必须由external修饰,一般也会用payable修饰,用于接收ETH:fallback() external payable { ... }。

我们定义一个fallback()函数,被触发时候会释放fallbackCalled事件,并输出msg.sender,msg.value和msg.data:

// fallback
fallback() external payable{
emit fallbackCalled(msg.sender, msg.value, msg.data);
}

receive和fallback的区别

receive和fallback都能够用于接收ETH,他们触发的规则如下:

触发fallback() 还是 receive()?
接收ETH
|
msg.data是空?
/ \
是 否
/ \
receive()存在? fallback()
/ \
是 否
/ \
receive() fallback()

简单来说,合约接收ETH时,msg.data为空且存在receive()时,会触发receive();msg.data不为空或不存在receive()时,会触发fallback(),此时fallback()必须为payable。

receive()和payable fallback()均不存在的时候,向合约直接发送ETH将会报错(你仍可以通过带有payable的函数向合约发送ETH)。

Remix 演示

  1. 首先在 Remix 上部署合约 "Fallback.sol"。
  2. "VALUE" 栏中填入要发送给合约的金额(单位是 Wei),然后点击 "Transact"。

Solidity极简入门#19. 接收ETH_solidity

  1. 可以看到交易成功,并且触发了 "receivedCalled" 事件。

Solidity极简入门#19. 接收ETH_智能合约_02

  1. "VALUE" 栏中填入要发送给合约的金额(单位是 Wei),"CALLDATA" 栏中填入随意编写的msg.data,然后点击 "Transact"。

Solidity极简入门#19. 接收ETH_solidity_03

  1. 可以看到交易成功,并且触发了 "fallbackCalled" 事件。

Solidity极简入门#19. 接收ETH_web3_04

总结

这一讲,我介绍了Solidity中的两种特殊函数,receive()和fallback(),他们主要在两种情况下被使用,他们主要用于处理接收ETH和代理合约proxy contract。

标签:极简,函数,19,Solidity,receive,msg,fallback,合约,ETH
From: https://blog.51cto.com/sleep666/6069308

相关文章

  • 18th-19th
    [1]二叉树基本概念(三种遍历)+不用递归模式的遍历:4种+层次遍历法(用queue来帮助实现)[2]queue:https://www.weixueyuan.net/a/hbkjae.html[3]hashMaphttps://blog.cs......
  • Tekla Structures 2019中文破解版软件安装包下载及安装图文教程​
    TeklaStructures是一款钢结构详图设计软件,功能包括3D实体结构模型与结构分析完全整合、3D钢结构细部设计、3D钢筋混凝土设计、专案管理、自动ShopDrawing、BOM表自动......
  • HDU 1219 AC Me
    ACMeTimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):13482    AcceptedSubmission(s):5934Pro......
  • Autodesk Powermill Ultimate 2019 中文破解版安装包下载及图文安装教程​
    powermill2019是powermill系列软件的最新版本,也是目前互联网上最优秀的用于高速三轴、五轴及多轴加工的专业数控编程CAM软件,拥有多轴数控加工、多轴机床的五轴编程、专业控......
  • Catia P3 V5 R19 中文破解版安装下载及图文安装教程​
    CATIA软件是机械三维设计行业非常受欢迎的一款软件,因为它功能强大且易学易用的特点,许多企业和培训机构都愿意选择这款产品进行产品的三维设计。其中CATIAV5版本是非常受欢......
  • 818~819 登录验证实现,过滤敏感词汇分析
    登录验证的过滤器假如未登录访问页面提示你返回到登录页面登录后在访问该页面实现:/***登录验证的过滤器*/@WebFilter("/*")publicclassLoginFilterimplem......
  • SqlServer2017、2019安装注意事项
    SqlServer2017、2019安装详解目录文章目录​​SqlServer2017、2019安装详解目录​​​​前言​​​​安装主意事项​​​​SqlServer2019客户端安装注意事项​​前言微软......
  • ESXi 主机补丁升级(OpenSLP 堆溢出漏洞CVE-2021-21974)
    ESXi主机补丁升级(OpenSLP堆溢出漏洞CVE-2021-21974)一、环境说明漏洞名称:VMwareESXiOpenSLP堆溢出漏洞CVE-2021-21974漏洞危害:组件名称:VMwareESXi影响范围:VMware......
  • 力扣---19. 删除链表的倒数第 N 个结点
    给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。示例1:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]示例2:输入:head=[1],n=1输出:[]示例......
  • HDOJ1194 Beat the Spread!
    BeattheSpread!TimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):7501    AcceptedSubmission(s)......