SolidityのFallback関数

SolidityのFallback関数はスマート・コントラクトがファンドを受け取るために使用される関数です。スマート・コントラクトは資金を受け取ることができますが、Externally Owned Accountではないため、コードで実装しない限り送金はできません。つまりちゃんと実装しないとコントラクト内で留保されているような形となってしまいます。受け取った資金を適切なExternally Owned Accountまで送金できるようにする仕組みが必要です。

また、イーサリアム仮想マシンは、同時実行を許可していません。 外部アドレスを呼び出すとき、Etherを別のアカウントに転送するとき、呼び出しコントラクトは制御フローも外部エンティティに転送します。このとき悪意をもって作成されたコントラクトのFallback関数が呼び出された場合、制御フローを変更し、予期しない状態で初期コントラクトに戻すことができます。 この脆弱性をついた攻撃により、一度だけ実行されるべき機能を繰り返し呼び出すために使用され、送金可能な全額を盗まれるといったことがあり得ます。

こうしたことから、Fallback関数の振る舞いへの理解は、避けては通れないものと考えられます。

Fallback関数は、呼び出した関数が利用可能で無い場合にも呼び出されます。Etherを受け取るだけのためにFallback関数を実装する場合、require(msg.data.length == 0)などの処理を加えて、呼び出された状況を確認する処理を加えたほうがよいです。
SendやTransferにより、Etherを直接受け取るようなContractを実装して、そのFallback関数が例外を投げないような場合にはEtherを返金することになります。この点はSolitity v0.4.0からの変更点となります。例外を投げない実装とする場合、Fallback関数はpayableな関数にする必要があります。 payableなFallback関数を持たないコントラクトは、コインベーストランザクション(マイナーブロック報酬)の受信者、またはselfdestructの宛先としてEtherを受け取れます。

コメント

タイトルとURLをコピーしました