1. 程式人生 > >以太坊公開拍賣智慧合約案例

以太坊公開拍賣智慧合約案例

實現一個簡單的公開拍賣智慧合約,所有人都可以出價,把以太幣傳送到指定地址,出價B高於出價A時,那麼A的資金會被自動退回。拍賣結束後,商品所有者會收到最高的出價資金。

智慧合約在拍賣領域能讓過程更透明公平,最大程度的促進參與者的積極性。

contract SimpleAuction {
  // 定義引數:受益人、開始時間、拍賣持續時間
  address public beneficiary;
  uint public auctionStart;
  uint public biddingTime;

  // 最高出價者
  address public highestBidder;
  // 最高出價
  uint public highestBid;

  // 拍賣結束後,設定這個值為true,不允許被修改。
  bool ended;

  // 最高出價變動時呼叫事件
  event HighestBidIncreased(address bidder, uint amount);
  // 拍賣結束時呼叫事件
  event AuctionEnded(address winner, uint amount);

  // 建立一個拍賣物件,初始化引數值:受益人、開始時間、拍賣持續時間 
  function SimpleAuction(uint _biddingTime, address _beneficiary) {
    beneficiary = _beneficiary;
    auctionStart = now;
    biddingTime = _biddingTime;
  }

  // 出價功能:包括交易引數。
  // 當出價不是最高,資金會被自動退回。
  function bid() payable  {
    // 從交易中獲取時間,如果拍賣結束,拒絕出價
    if (now > auctionStart + biddingTime) {
      throw;
    }
    // 如果出價不是最高,資金退回
    if (msg.value <= highestBid) {
      throw;
    }

    // 如果出價最高,當前出價者作為最高出價人
    if (highestBidder != 0) {
      highestBidder.send(highestBid);
    }
    highestBidder = msg.sender;
    highestBid = msg.value;
    HighestBidIncreased(msg.sender, msg.value);
  }

  // 結束拍賣,並轉賬資金到受益人
  function auctionEnd() {
    if (now <= auctionStart + biddingTime)
      throw;
    if (ended)
      throw;
    AuctionEnded(highestBidder, highestBid);

    beneficiary.send(this.balance);
    ended = true;
  }

  // 當交易沒有資料或者資料不對時,觸發此函式,重置出價操作,確保出價者不會丟失資金
  function () {
    throw;
  }
}