接下来扩展前面的公开拍卖成为一个盲拍。盲拍的特点是拍卖结束以前没有时间压力。在一个透明的计算平台上创建盲拍系统听起来可能有些矛盾,但是加密算法能让你脱离困境。 During the bidding period, a bidder does not actually send her bid, but only a hashed version of it. Since it is currently considered practically impossible to find two (sufficiently long) values whose hash values are equal, the bidder commits to the bid by that. After the end of the bidding period, the bidders have to reveal their bids: They send their values unencrypted and the contract checks that the hash value is the same as the one provided during the bidding period. 在拍卖阶段, 竞拍人不需要发送实际的出价,仅仅只需要发送一个它的散列值。因为目前几乎不可能找到两个值(足够长)的散列值相等,竞拍者提交他们的出价散列值。在拍卖结束后,竞拍人重新发送未加密的竞拍出价,合约将检查其散列值是否和拍卖阶段发送的一样。 另一个挑战是如何让拍卖同时实现绑定和致盲 :防止竞拍人竞拍成功后不付钱的唯一的办法是,在竞拍出价的同时发送保证金。但是在Ethereum上发送保证金是无法致盲,所有人都能看到保证金。下面的合约通过接受任何尽量大的出价来解决这个问题。当然这可以在最后的揭拍阶段进行复核,一些竞拍出价可能是无效的,这样做的目的是(它提供一个显式的标志指出是无效的竞拍,同时包含高额保证金):竞拍人可以通过放置几个无效的高价和低价竞拍来混淆竞争对手。

  1. contract BlindAuction
  2. {
  3. struct Bid
  4. {
  5. bytes32 blindedBid;
  6. uint deposit;
  7. }
  8. address public beneficiary;
  9. uint public auctionStart;
  10. uint public biddingEnd;
  11. uint public revealEnd;
  12. bool public ended;
  13.  
  14. mapping(address => Bid[]) public bids;
  15.  
  16. address public highestBidder;
  17. uint public highestBid;
  18.  
  19. event AuctionEnded(address winner, uint highestBid);
  20.  
  21. ///修饰器(Modifier)是一个简便的途径用来验证函数输入的有效性。
  22. ///`onlyBefore` 应用于下面的 `bid`函数,其旧的函数体替换修饰器主体中 `_`后就是其新的函数体
  23. modifier onlyBefore(uint _time) { if (now >= _time) throw; _ }
  24. modifier onlyAfter(uint _time) { if (now <= _time) throw; _ }
  25.  
  26. function BlindAuction(uint _biddingTime,
  27. uint _revealTime,
  28. address _beneficiary)
  29. {
  30. beneficiary = _beneficiary;
  31. auctionStart = now;
  32. biddingEnd = now + _biddingTime;
  33. revealEnd = biddingEnd + _revealTime;
  34. }
  35.  
  36. ///放置一个盲拍出价使用`_blindedBid`=sha3(value,fake,secret).
  37. ///仅仅在竞拍结束正常揭拍后退还发送的以太。当随同发送的以太至少
  38. ///等于 "value"指定的保证金并且 "fake"不为true的时候才是有效的竞拍
  39. ///出价。设置 "fake"为true或发送不合适的金额将会掩没真正的竞拍出
  40. ///价,但是仍然需要抵押保证金。同一个地址可以放置多个竞拍。
  41. function bid(bytes32 _blindedBid)
  42. onlyBefore(biddingEnd)
  43. {
  44. bids[msg.sender].push(Bid({
  45. blindedBid: _blindedBid,
  46. deposit: msg.value
  47. }));
  48. }
  49.  
  50. ///揭开你的盲拍竞价。你将会拿回除了最高出价外的所有竞拍保证金
  51. ///以及正常的无效盲拍保证金。
  52. function reveal(uint[] _values, bool[] _fake,
  53. bytes32[] _secret)
  54. onlyAfter(biddingEnd)
  55. onlyBefore(revealEnd)
  56. {
  57. uint length = bids[msg.sender].length;
  58. if (_values.length != length || _fake.length != length ||
  59. _secret.length != length)
  60. throw;
  61. uint refund;
  62. for (uint i = 0; i < length; i++)
  63. {
  64. var bid = bids[msg.sender][i];
  65. var (value, fake, secret) =
  66. (_values[i], _fake[i], _secret[i]);
  67. if (bid.blindedBid != sha3(value, fake, secret))
  68. //出价未被正常揭拍,不能取回保证金。
  69. continue;
  70. refund += bid.deposit;
  71. if (!fake && bid.deposit >= value)
  72. if (placeBid(msg.sender, value))
  73. refund -= value;
  74. //保证发送者绝不可能重复取回保证金
  75. bid.blindedBid = 0;
  76. }
  77. msg.sender.send(refund);
  78. }
  79.  
  80. //这是一个内部 (internal)函数,
  81. //意味着仅仅只有合约(或者从其继承的合约)可以调用
  82. function placeBid(address bidder, uint value) internal
  83. returns (bool success)
  84. {
  85. if (value <= highestBid)
  86. return false;
  87. if (highestBidder != 0)
  88. //退还前一个最高竞拍出价
  89. highestBidder.send(highestBid);
  90. highestBid = value;
  91. highestBidder = bidder;
  92. return true;
  93. }
  94.  
  95. ///竞拍结束后发送最高出价到竞拍人
  96. function auctionEnd()
  97. onlyAfter(revealEnd)
  98. {
  99. if (ended) throw;
  100. AuctionEnded(highestBidder, highestBid);
  101. //发送合约拥有所有的钱,因为有一些保证金退回可能失败了。
  102. beneficiary.send(this.balance);
  103. ended = true;
  104. }
  105.  
  106. function () { throw; }
  107. }

  

Solidity 编程实例--Blind Auction 盲拍的更多相关文章

  1. Solidity 文档--第三章:Solidity 编程实例

    Solidity 编程实例 Voting 投票 接下来的合约非常复杂,但展示了很多Solidity的特性.它实现了一个投票合约.当然,电子选举的主要问题是如何赋予投票权给准确的人,并防止操纵.我们不能 ...

  2. Solidity 编程实例--简单的公开拍卖

    通常简单的公开拍卖合约,是每个人可以在拍卖期间发送他们的竞拍出价.为了实现绑定竞拍人的到他们的拍卖,竞拍包括发送金额/ether.如果产生了新的最高竞拍价,前一个最高价竞拍人将会拿回他的钱.在竞拍阶段 ...

  3. Solidity 编程实例--投票

    Voting 投票 思路是为每张选票创建一个合约,每个投票选项提供一个短名称.合约创建者作为会长将会给每个投票参与人各自的地址投票权. 地址后面的人们可以选择自己投票或者委托信任的代表人替他们投票.在 ...

  4. Solidity 官方文档中文版 4_Solidity 编程实例

    Voting 投票 接下来的合约非常复杂,但展示了很多Solidity的特性.它实现了一个投票合约.当然,电子选举的主要问题是如何赋予投票权给准确的人,并防止操纵.我们不能解决所有的问题,但至少我们会 ...

  5. PHP多进程编程实例

    这篇文章主要介绍了PHP多进程编程实例,本文讲解的是在Linux下实现PHP多进程编程,需要的朋友可以参考下 羡慕火影忍者里鸣人的影分身么?没错,PHP程序是可以开动影分身的!想完成任务,又觉得一个进 ...

  6. c#摄像头编程实例 (转)

    c#摄像头编程实例 摄像头编程 安装摄像头后,一般可以找到一个avicap32.dll文件 这是一个关于设想头的类 using  system;using  System.Runtime.Intero ...

  7. JAX-RS 2.0 REST客户端编程实例

    JAX-RS 2.0 REST客户端编程实例 2014/01/28 | 分类: 基础技术, 教程 | 0 条评论 | 标签: JAX-RS, RESTFUL 分享到:3 本文由 ImportNew - ...

  8. Android studio 下JNI编程实例并生成so库

    Android studio 下JNI编程实例并生成so库 因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小 ...

  9. hadoop2.2编程:使用MapReduce编程实例(转)

    原文链接:http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html 从网上搜到的一篇hadoop的编程实例,对于初学者真是帮助太大 ...

随机推荐

  1. 天梯杯 L2-005. 集合相似度

    L2-005. 集合相似度 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定两个整数集合,它们的相似度定义为:Nc/Nt*1 ...

  2. 移动端rem距离单位的使用

    在做移动端开发的时候大家肯定会遇到适配问题,手机的屏幕大小有非常多的类别,使用传统的px距离单位已经无法满足我们的需要,于是rem便横空出世,他与百分比定位是比较像的,但是也是有一定的区别,在这里就跟 ...

  3. 【Offer】[50-1] 【第一个只出现一次的字符】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 在字符串中找出第一个只出现一次的字符.如输入"abaccdeff",则输出'b'. 牛客网刷题地址 思路分析 可以遍 ...

  4. Vue组件间通信方式

    一.Props传递数据 在父组件中使用子组件,本质通过v-bind绑定属性传入子组件,子组件通过props接收父组件传入的属性 <template> <div> 父组件:{{m ...

  5. 为什么说 Java 程序员必须掌握 Spring Boot ?(转)

    Spring Boot 2.0 的推出又激起了一阵学习 Spring Boot 热,那么, Spring Boot 诞生的背景是什么?Spring 企业又是基于什么样的考虑创建 Spring Boot ...

  6. 使用Idea第一次创建一个Mavne工程时没有src目录

    在使用idea创建一个maven工程时没有src目录,可能出现的问题很多,我先把我自己的问题分享上来 因为没有src,可能是因为maven插件还没下载到本地仓库.maven插件的版本和jdk版本冲突或 ...

  7. Python网络爬虫实战(二)数据解析

    上一篇说完了如何爬取一个网页,以及爬取中可能遇到的几个问题.那么接下来我们就需要对已经爬取下来的网页进行解析,从中提取出我们想要的数据. 根据爬取下来的数据,我们需要写不同的解析方式,最常见的一般都是 ...

  8. Winform中使用FastReport实现简单的自定义PDF导出

    场景 FastReport安装包下载.安装.去除使用限制以及工具箱中添加控件: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...

  9. Hive中的数据库(Database)和表(Table)

    在前面的文章中,介绍了可以把Hive当成一个"数据库",它也具备传统数据库的数据单元,数据库(Database/Schema)和表(Table). 本文介绍一下Hive中的数据库( ...

  10. java必学技能

    一:系统架构师是一个最终确认和评估系统需求,给出开发规范,搭建系统实现的核心构架,并澄清技术细节.扫清主要难点的技术人员.主要着眼于系统的“技术实现”.因此他/她应该是特定的开发平台.语言.工具的大师 ...