WTF Solidity极简入门第十九讲: 接收ETH receive和fallback

현재 언어 번역이 없어 원문을 표시합니다.
本文介绍了Solidity中的两种特殊函数,receive()和fallback()。

原文:《Solidity 极简入门: 19. 接收 ETH receive 和 fallback》

我最近在重新学 solidity,巩固一下细节,也写一个「Solidity 极简入门」,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。

所有代码和教程开源在 github: github.com/AmazingAng/WTFSolidity

回调函数

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,例如:

WTF Solidity极简入门第十九讲: 接收ETH receive和fallback

有些恶意合约,会在 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:

WTF Solidity极简入门第十九讲: 接收ETH receive和fallback

receive 和 fallback 的区别

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

WTF Solidity极简入门第十九讲: 接收ETH receive和fallback

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

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

总结

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

推特:@0xAA_Science

社区:Discord微信群官网 wtf.academy

所有代码和教程开源在github: github.com/AmazingAng/WTFSolidity

공유하기:

작성자: 0xAA

이 글은 PANews 입주 칼럼니스트의 관점으로, PANews의 입장을 대표하지 않으며 법적 책임을 지지 않습니다.

글 및 관점은 투자 조언을 구성하지 않습니다

이미지 출처: 0xAA. 권리 침해가 있을 경우 저자에게 삭제를 요청해 주세요.

PANews 공식 계정을 팔로우하고 함께 상승장과 하락장을 헤쳐나가세요
PANews APP
드래곤플라이 주소가 1억 3700만 개의 SKY 토큰을 코인베이스로 이체한 것으로 추정되는데, 이는 토큰이 인출되었을 당시 가치의 절반 이상 하락한 수치입니다.
PANews 속보