zoukankan      html  css  js  c++  java
  • 以太坊非公开拍卖智能合约案例

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

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

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

    代码如下:

    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;
      }
    }

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

  • 相关阅读:
    山东财经大学新生赛暨天梯赛选拔赛 A 骆驼拼写法
    Code 墓地 问题 A: 看电视(区间贪心)
    第九届蓝桥杯 乘积尾零(Java大数)
    《真正的力量来自内心深处》
    蓝桥杯训练 历届试题 买不到的数目 (猜公式)
    前缀和与差分 算法详解
    蓝桥杯训练 历届试题 回文数字 (暴力求解,毫无任何技术含量)
    蓝桥杯训练 历届试题 最大子阵 (只用了前缀和,没用dp写)
    实习开始
    MVC缺点总结
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13313437.html
Copyright © 2011-2022 走看看