Ethereum(21) - オークションのスマートコントラクト①(実装編)

今回はオークションの機能をスマートコントラクトで実装していきます。

実装

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

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
pragma solidity ^0.4.11;
contract Auction {
address public highestBidder; // 最高額提示アドレス
uint public highestBid; // 最高提示額

/// コンストラクタ
function Auction() payable {
highestBidder = msg.sender;
highestBid = 0;
}

/// Bid用の関数
function bid() public payable {
// bidが現在の最高額よりも大きいことを確認
require(msg.value > highestBid);

// 返金額退避
uint refundAmount = highestBid;
// これまで最高額を提示していたアドレス退避
address currentHighestBidder = highestBidder;

// ステート更新(新しい落札者を表す)
highestBid = msg.value;
highestBidder = msg.sender;

// これまで最高額を提示していたbidderに返金
if(!currentHighestBidder.send(refundAmount)) {
throw;
}
}
}

このコンストラクトの仕様は次の通りです。

  • 入札(bid)したいユーザは、現在の最高提示額を超えるetherの送金を伴う形でbid関数を呼び出す。
  • bid関数が呼ばれると、それまで最高額を提示していたアカウントにbidしていた金額を返金する。
  • 返金をするためにsend関数を使う。
    send関数は、送金対象のアドレス.send(送金額)という形式で実行する。
    送金単位はweiとなる。
  • オークションとはいっても、最高額を提示している金額とアドレスを管理するだけで、締め切り期限になったら何か権利が得られる・・・といったことはやっていません🙇‍♀️

次回は、このスマートコントラクトの動作を確認していきます。