【Solidity基礎】fallback関数について




どうも高妻です。Twitterでプログラミングのことや暗号通貨のことをつぶやいているのでよかったらフォローしてください。  

fallbackとは

fallbackとはシステム稼働中に予期せぬエラーが発生しても機能制限や応答速度を低下させてシステムの稼働を継続することを言います。要はシステムを完璧に止めてしまうより少しでも動いていた方がいいよねという考え方です。

Solidityにはこの仕組みが言語仕様として組み込まれていて、少し複雑な挙動をするので説明したいと思います。

Solidityのfallback関数

Solidityのfallback関数は下記の特徴があります。

  • 無名関数となる
  • 引数を取ることができない
  • 値を返すことができない

一番シンプルなfallback関数はこのようになります。

もし、コントラクトでEtherを受け取る処理を実装したい場合はfallback関数にpayable修飾子をつけなければいけません。

fallback関数でできないこと

fallback関数では2300 gas以上の処理ができないようになっています。下記は2300 gas以上を消費する処理なので実行することができません。

  • storageへの書き込み
  • コントラクトの作成
  • 大量のgasを消費する外部関数の呼び出し
  • Etherの送金

TheDAO事件の原因となったソースコード

これはwithdrawBalance()を何度も呼ぶことができるバグでReentrancyと呼ばれます。msg.sender.call.value(amountToWithdraw)で送金処理を行なっているのですが、msg.senderがコントラクトアドレスの場合、fallback関数を使ってもう1度withdrawBalance()を呼び出し、また送金しての繰り返しをすることができます。

このバグをつかれてThe DAOは65億円相当のトークンを引き出されてしまいました。

このバグを修正したコードが下記になります。msg.senderの残高を先に0にしてから送金処理をすることで何度も再実行されても大丈夫なようにしています。
The following two tabs change content below.

高妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 現在はTwitterなどSNSのテキスト解析を行うソーシャルメディア分析のサーバーサイドを開発中。言語はNode.js、Kotlinを使用。






コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です