Solidity 中 receive 函数 和 callback函数分析

本文详细介绍了以太坊智能合约中的receive和fallback函数。receive函数是合约接收以太币的默认入口,仅在无附加数据的转账交易中触发,拥有有限的gas限制。fallback函数作为备用入口,在函数调用不匹配或无receive函数时执行,也可接收以太币,同样受到gas限制。理解并恰当使用这两个函数对于智能合约的 Gas 效率和功能实现至关重要。
摘要由CSDN通过智能技术生成

在使用transfer 和 send 方法的是后需要关注一下 receive方法和callback方法。

receive 接收以太函数

  • 一个合约最多有一个 receive 函数, 声明函数为: receive() external payable { ... }
  • 不需要 function 关键字,也没有参数和返回值并且必须是 external 可见性和 payable 修饰. 它可以是 virtual 的,可以被重载也可以有 修改器modifier 。
  • 在对合约没有任何附加数据调用(通常是对合约转账)是会执行 receive 函数. 例如 通过 .send() or .transfer() 如果 receive 函数不存在, 但是有payable 的 fallback 回退函数fallback 回退函数fallback 回退函数 那么在进行纯以太转账时,fallback 函数会调用.
  • 如果两个函数都没有,这个合约就没法通过常规的转账交易接收以太(会抛出异常).
  • 更糟的是,receive 函数可能只有 2300 gas 可以使用(如,当使用 send 或 transfer 时), 除了基础的日志输出之外,进行其他操作的余地很小。

Fallback 回退函数

  • 合约可以最多有一个回退函数。函数声明为: fallback () external [payable] 或 fallback (bytes calldata _input) external [payable] returns (bytes memory _output)
  • 没有 function 关键字。 必须是 external 可见性,它可以是 virtual 的,可以被重载也可以有 修改器modifier 。
  • 如果在一个对合约调用中,没有其他函数与给定的函数标识符匹配fallback会被调用. 或者在没有 receive 函数
     时,而没有提供附加数据对合约调用,那么fallback 函数会被执行。
  • fallback 函数始终会接收数据,但为了同时接收以太时,必须标记为 payable 。
  • 如果使用了带参数的版本,_input 将包含发送到合约的完整数据(等于 msg.data ),并且通过 _output 返回数据。 返回数据不是 ABI 编码过的数据,相反,它返回不经过修改的数据。
  • 更糟的是,如果回退函数在接收以太时调用,可能只有 2300 gas 可以使用,参考 receive接收函数
  • 与任何其他函数一样,只要有足够的 gas 传递给它,回退函数就可以执行复杂的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值