![見出し画像](https://assets.st-note.com/production/uploads/images/110734732/rectangle_large_type_2_68e3444425bae2c44f036e36a6c98100.png?width=1200)
【完全保存版】fallback関数について、しっかりと学ぼう!
こちらの記事は、solidityの公式ドキュメントをもとにしています。
テストケースなどもありますので、実際に作ってみるとイメージが湧いてくると思います。
1 fallback関数とは
あるコントラクトには、下のようにA関数とB関数という2つだけの関数が存在してるとします。(fallback関数でもreceive関数でもない関数)
![](https://assets.st-note.com/img/1689288976028-F6F8NkGIip.png?width=1200)
このコントラクトに向けて、「X関数」という存在しない関数を実行しようとします。
これはどうなるでしょうか?
![](https://assets.st-note.com/img/1689289066100-CNQpy0UxFT.png?width=1200)
また、Etherをただ送ろうとするとどうなるでしょう?
![](https://assets.st-note.com/img/1689289165328-ixKEORLq3G.png?width=1200)
結論としては、コントラクトに「fallback」関数がないと、エラーになります。(receive関数、payableについては、一旦無視します。)
逆に言うと、「fallback」関数があれば、これらの処理は可能になります。
![](https://assets.st-note.com/img/1689289383907-2shOO9YoD0.png?width=1200)
このように、コントラクト内にない関数を実行された時などに呼ばれる関数が「fallback」関数です。
2 payable修飾子について
次に、「payable」という修飾子について考えます。
こちらはEtherを受け取るために必要なキーワードのようなものです。
つまり、下のように「fallback」関数に「payable」がついていなければ、Etherを受け取ることができません。
![](https://assets.st-note.com/img/1689289894570-9tKLtYBLw3.png?width=1200)
つまり、下のように、「fallback」関数に「payable」がついていれば、Etherを受け取ることができます。
![](https://assets.st-note.com/img/1689289975879-R769rlLXbw.png?width=1200)
3 receive関数について
ただ、Etherを受けるだけの関数として、「receive」関数があります。
Etherを受け取るので「payable」が必要です。
「payable」の「fallback」関数があるときは、こちらのreceive関数を入れることが推奨されています。
![](https://assets.st-note.com/img/1689290256681-QrIzzG9F48.png?width=1200)
これがあることによって、下のように、役割が明確になります。
となると、Etherを受け取る処理は「receive」関数に任せて、「fallback」関数は「payable」を外せば良いのではと思うかもしれません。
しかし、そうとも限りません。
![](https://assets.st-note.com/img/1689290519981-FIh9pvYjjB.png?width=1200)
このように、「Etherを送るだけ」ではなく、処理も行いたい場合は、①に該当します。
そのため、そのようなケースも想定する場合は、「payable」ありの「fallback」関数が必要です。
![](https://assets.st-note.com/img/1689290797904-nFTEvhA2aS.png?width=1200)
4 ガス制限について
receive関数には「Etherを受け取るだけ」ですので、多くのガスは必要ありません。
他の処理が行われてしまわないよう、2,300ガスまでしか使えないように、制限されています。
![](https://assets.st-note.com/img/1689290998841-xOH8PQGO0q.png?width=1200)
では、fallback関数についても考えてみましょう。
receive関数がなければ、下のように、「Etherを受け取るだけの処理」はfallback関数が行います。
(ただし、「payable」ありのfallback関数があるときはreceive関数をつけることが推奨されているので、これは非推奨の話です。)
![](https://assets.st-note.com/img/1689291601965-UJRb7Nb2fe.png?width=1200)
この場合は、やっていることは「receive」関数と同じですので、2,300ガスに制限されます。
![](https://assets.st-note.com/img/1689291822070-ElaxeizLdV.png?width=1200)
注
こちらのfallback関数のガス制限について、他の多くの日本語の記事と異なる内容になっていると思います。
公式を読み解いた結果、上の帰結になると考えていますが、もし理解が誤っていた場合は修正いたします。
今回は以上です。
いいなと思ったら応援しよう!
![ユウキ](https://assets.st-note.com/production/uploads/images/52347520/profile_e7d36b385c74618d7fec56da47f68a35.jpeg?width=600&crop=1:1,smart)