這篇文章實(shí)現(xiàn)一個(gè)簡單的公開拍賣智能合約,所有人都可以出價(jià),把以太幣發(fā)送到指定地址,出價(jià)B高于出價(jià)A時(shí),那么A的資金會(huì)被自動(dòng)退回。拍賣結(jié)束后,商品所有者會(huì)收到最高的出價(jià)資金。
contract SimpleAuction {
// 定義參數(shù):受益人、開始時(shí)間、拍賣持續(xù)時(shí)間
address public beneficiary;
uint public auctionStart;
uint public biddingTime;
// 最高出價(jià)者
address public highestBidder;
// 最高出價(jià)
uint public highestBid;
// 拍賣結(jié)束后,設(shè)置這個(gè)值為true,不允許被修改。
bool ended;
// 最高出價(jià)變動(dòng)時(shí)調(diào)用事件
event HighestBidIncreased(address bidder, uint amount);
// 拍賣結(jié)束時(shí)調(diào)用事件
event AuctionEnded(address winner, uint amount);
// 創(chuàng)建一個(gè)拍賣對象,初始化參數(shù)值:受益人、開始時(shí)間、拍賣持續(xù)時(shí)間
function SimpleAuction(uint _biddingTime, address _beneficiary) {
beneficiary = _beneficiary;
auctionStart = now;
biddingTime = _biddingTime;
}
// 出價(jià)功能:包括交易參數(shù)。
// 當(dāng)出價(jià)不是最高,資金會(huì)被自動(dòng)退回。
function bid() {
// 從交易中獲取時(shí)間,如果拍賣結(jié)束,拒絕出價(jià)
if (now > auctionStart + biddingTime) {
throw;
}
// 如果出價(jià)不是最高,資金退回
if (msg.value <= highestBid) {
throw;
}
// 如果出價(jià)最高,當(dāng)前出價(jià)者作為最高出價(jià)人
if (highestBidder != 0) {
highestBidder.send((highestBid);
}
highestBidder = msg.sender;
highestBid = msg.value;
HighestBidIncreased(msg.sender, msg.value);
}
// 結(jié)束拍賣,并轉(zhuǎn)賬資金到受益人
function auctionEnd() {
if (now <= auctionStart + biddingTime)
throw;
if (ended)
throw;
AuctionEnded(highestBidder, highestBid);
beneficiary.send(this.balance);
ended = true;
}
// 當(dāng)交易沒有數(shù)據(jù)或者數(shù)據(jù)不對時(shí),觸發(fā)此函數(shù),重置出價(jià)操作,確保出價(jià)者不會(huì)丟失資金
function () {
throw;
}
}
從這個(gè)案例可以看到,智能合約在拍賣領(lǐng)域能讓過程更透明公平,最大程度的促進(jìn)參與者的積極性。下一篇文章我們會(huì)介紹一個(gè)復(fù)雜一點(diǎn)的拍賣智能合約。
原文:http://wangxiaoming.com/blog/2016/05/15/blockchain-tech-open-auction/