Solidity极简入门|第十八讲: Import

import 用法

通过源文件相对位置导入,例子:  

783139dfea66a7197df8d14a6695e145.jpeg

  通过源文件网址导入网上的合约

3452284f5c89e957fb18a9377547025d.jpeg

通过 npm 的目录导入 

ae4c8a0ec3e2c51d40c6957634f7ec91.jpeg

通过全局符号导入特定的合约

c56972e4b5577b6ee594df346ad5bb94.jpeg

测试导入结果

我们可以用下面这段代码测试是否成功导入了外部源代码:

e1520625ba406ca5462a87f98631203d.jpeg

回调函数

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

- 接收 ETH 

- 处理合约中不存在的函数调用(代理合约 proxy contract)

我们这一讲主要介绍接收 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,例如:

bfdb7dd990b62a3eaaf5bd7e20e740e7.jpeg

有些恶意合约,会在 receive() 函数嵌入恶意消耗 gas 的内容,使得一些退款合约不能正常工作:Akutar NFT项目因此被永久锁定了 11539 ETH,接近 2 亿元!因此写包含退款等逻辑的合约时候,一定要注意这种情况。

回退函数 fallback

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

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

d88aafa3a762f7ebb82a6336f493f661.jpeg

receive 和 fallback 的区别

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

87d0de71556dc524d7a91b1407ee2bf4.jpeg

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

receive() 和 payable fallback() 均不存在的时候,向合约发送 ETH 将会报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值