這是一個非公開的拍賣系統(tǒng),在透明的平臺運行非公開拍賣看起來是矛盾的,但是密碼學可以做到這一點。
在拍賣期間,參與者把自己的出價加密發(fā)送給拍賣系統(tǒng),除了自己,任何人不知道出價是多少。當拍賣結(jié)束,參與者把出價明文發(fā)給拍賣系統(tǒng),系統(tǒng)用明文加密運算,跟之前發(fā)送的密文比對,一致的話說明出價跟之前一樣,出價有效。
在傳統(tǒng)領(lǐng)域,很多業(yè)務(wù)很容易產(chǎn)生暗箱操作,智能合約讓參與者跟工作人員都無法干預系統(tǒng),系統(tǒng)也沒有人的行為,全部是自動執(zhí)行的代碼,使業(yè)務(wù)變得透明公平,這對產(chǎn)業(yè)的變革是顛覆性的。
contract BlindAuction {
// 定義一個出價對象
struct Bid {
bytes32 blindedBid;
uint deposit;
}
// 定義狀態(tài)變量:受益人、開始時間、拍賣結(jié)束時間、公示結(jié)束時間
address public beneficiary;
uint public auctionStart;
uint public biddingEnd;
uint public revealEnd;
// 拍賣結(jié)束后,設(shè)置這個值為true,不允許被修改。
bool public ended;
// 存儲拍賣信息的集合
mapping(address => Bid[]) public bids;
// 最高的出價者
address public highestBidder;
// 最高出價
uint public highestBid;
// 拍賣結(jié)束時調(diào)用事件
event AuctionEnded(address winner, uint highestBid)
// modifier可以方便的驗證輸入信息
modifier onlyBefore(uint _time) { if (now >= _time) throw; _ }
modifier onlyAfter(uint _time) { if (now <= _time) throw; _ }
// 創(chuàng)建一個拍賣對象,初始化參數(shù)值:受益人、開始時間、
// 拍賣持續(xù)時間、公示時間
function BlindAuction(
uint _biddingTime,
uint _revealTime,
address _beneficiary
) {
beneficiary = _beneficiary;
auctionStart = now;
biddingEnd = now + _biddingTime;
revealEnd = biddingEnd + _revealTime;
}
// 把出價信息用sha3加密后發(fā)送給拍賣系統(tǒng),確保原始數(shù)據(jù)不被暴露
// 同一個地址可以多次出價
function bid(bytes32 _blindedBid)
onlyBefore(biddingEnd)
{
bids[msg.sender].push(Bid({
blindedBid: _blindedBid,
deposit: msg.value
}));
}
/// 拍賣結(jié)束后,顯示所有出價信息。
/// 除了最高價之外的所有正常出價會被退款
function reveal(
uint[] _values,
bool[] _fake,
bytes32[] _secret
)
onlyAfter(biddingEnd)
onlyBefore(revealEnd)
{
uint length = bids[msg.sender].length;
if (
_values.length != length ||
_fake.length != length ||
_secret.length != length
) {
throw;
}
uint refund;
for (uint i = 0; i < length; i++) {
var bid = bids[msg.sender][i];
var (value, fake, secret) = (_values[i], _fake[i], _secret[i]);
if (bid.blindedBid != sha3(value, fake, secret)) {
continue;
}
refund += bid.deposit;
if (!fake && bid.deposit >= value) {
if (placeBid(msg.sender, value))
refund -= value;
}
bid.blindedBid = 0;
}
msg.sender.sent(refund);
}
// 這是個內(nèi)部函數(shù),內(nèi)部出價邏輯。只能被合約本身調(diào)用
function placeBid(address bidder, uint value) internal
returns (bool success)
{
if (value <= highestBid) {
return false;
}
if (highestBidder != 0) {
highestBidder.sender(highestBid);
}
highestBid = value;
highestBidder = bidder;
return true;
}
// 結(jié)束拍賣,發(fā)送最高出價給商品所有者
function auctionEnd()
onlyAfter(revealEnd)
{
if (ended)
throw;
AuctionEnded(highestBidder, highestBid);
beneficiary.send(this.balance);
ended = true;
}
// 當交易沒有數(shù)據(jù)或者數(shù)據(jù)不對時,觸發(fā)此函數(shù),
// 重置出價操作,確保出價者不會丟失資金
function () {
throw;
}
}
從這個案例可以看到,智能合約能讓商業(yè)變得公平、透明、高效,最大程度的促進參與者的積極性,未來對各個產(chǎn)業(yè)將帶來巨大的改變。
原文:http://wangxiaoming.com/blog/2016/05/18/blockchain-tech-blind-auction/