Solidity支持两种特殊的函数,分别是Fallback以及Receive,一个是处理合约中不存在的功能时进行的回退机制,而另一个Receive则是负责收款后的动作,但两者称为特殊函数的原因主要是跟我们一般函数不同的地方于它们是属于匿名的函数,也就是不用给定Function名称,因此才会较为特殊,至于详细用途我们以下再逐一介绍。

Fallback

主要处理合约中不存在的函数调用,可以用来掌握谁调用了不存在的功能,例如: 讯息警告,

那些条件会触发Fallback

msg.data有资料时。 呼叫合约中不存在的function时。

具有哪些限制

由于Fallback可能是无意间被呼叫的,因此尽量在Fallback中减少额外的处理,避免燃料费的浪费,应尽量是少于2300 Gas 。 function名称直接以fallback命名。 仅能将可视范围设定为external。

范例:

实际操作Remix来Demo fallback()的过程

我们在Transact那边贴上帐号的地址,让calldata有值,预期触发Fallback,送出之后,由于没有指定任何function,因此会触发fallback机制,并发送Log讯息。

Receive

receive仅负责处理接收ETH,一个合约最多只能有一个receive函数。

什么条件下会触发Receive

msg.data为空时。 发送ether时。

具有哪些限制

一样会消耗Gas fee,因此不建议逻辑处理太过于复杂,应尽量是少于2300 Gas 。 function名称直接以receive命名。 仅能将可视范围设定为external。

范例:

实际操作Remix来Demo receive()的过程

设定金额数量→ Deploy合约→ calldata未带资料→ 按下交易→ 触发receive。

结语

透过实际范例,我们学习到收款的事件处理,以及不在合约内的功能处理,虽然很好的掌握了触发事件后的处理机制,但也要小心这些事后处理机制要控制运算的资源,避免燃料费的浪费。