汪晓明对区块链、以太坊的思考

记录创业、生活的所思所感,探讨去中心化思想,推动区块链的发展。

我推出了《VIP区块链技术开发视频》和电子书《深入浅出以太坊》

区块链技术(九):以太坊非公开拍卖智能合约案例

这是一个非公开的拍卖系统,在透明的平台运行非公开拍卖看起来是矛盾的,但是密码学可以做到这一点。

在拍卖期间,参与者把自己的出价加密发送给拍卖系统,除了自己,任何人不知道出价是多少。当拍卖结束,参与者把出价明文发给拍卖系统,系统用明文加密运算,跟之前发送的密文比对,一致的话说明出价跟之前一样,出价有效。

在传统领域,很多业务很容易产生暗箱操作,智能合约让参与者跟工作人员都无法干预系统,系统也没有人的行为,全部是自动执行的代码,使业务变得透明公平,这对产业的变革是颠覆性的。

代码如下:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
contract BlindAuction {
  // 定义一个出价对象
  struct Bid {
    bytes32 blindedBid;
    uint deposit;
  }

  // 定义状态变量:受益人、开始时间、拍卖结束时间、公示结束时间
  address public beneficiary;
  uint public auctionStart;
  uint public biddingEnd;
  uint public revealEnd;

  // 拍卖结束后,设置这个值为true,不允许被修改。
  bool public ended;

  // 存储拍卖信息的集合
  mapping(address => Bid[]) public bids;

  // 最高的出价者
  address public highestBidder;
  // 最高出价
  uint public highestBid;

  // 拍卖结束时调用事件
  event AuctionEnded(address winner, uint highestBid)

  // modifier可以方便的验证输入信息
  modifier onlyBefore(uint _time) { if (now >= _time) throw; _ }
  modifier onlyAfter(uint _time) { if (now <= _time) throw; _ }

  // 创建一个拍卖对象,初始化参数值:受益人、开始时间、
  // 拍卖持续时间、公示时间 
  function BlindAuction(
    uint _biddingTime, 
    uint _revealTime, 
    address _beneficiary
  ) {
    beneficiary = _beneficiary;
    auctionStart = now;
    biddingEnd = now + _biddingTime;
    revealEnd = biddingEnd + _revealTime;
  }

  // 把出价信息用sha3加密后发送给拍卖系统,确保原始数据不被暴露
  // 同一个地址可以多次出价
  function bid(bytes32 _blindedBid) 
    onlyBefore(biddingEnd) 
  {
    bids[msg.sender].push(Bid({
      blindedBid: _blindedBid, 
      deposit: msg.value
    }));
  }

  /// 拍卖结束后,显示所有出价信息。
  /// 除了最高价之外的所有正常出价会被退款
  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);
  }

  // 这是个内部函数,内部出价逻辑。只能被合约本身调用
  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;
  }

  // 结束拍卖,发送最高出价给商品所有者
  function auctionEnd()
    onlyAfter(revealEnd)
  {
    if (ended)
      throw;
    AuctionEnded(highestBidder, highestBid);
    beneficiary.send(this.balance);
    ended = true;
  }

  // 当交易没有数据或者数据不对时,触发此函数,
  // 重置出价操作,确保出价者不会丢失资金
  function () {
    throw;
  }
}

从这个案例可以看到,智能合约能让商业变得公平、透明、高效,最大程度的促进参与者的积极性,未来对各个产业将带来巨大的改变。