基于以太坊的次高价盲拍solidity智能合约(二)

  • 4.揭标
  • 5.第三方仲裁人终结拍卖

4.揭标

揭标的过程应该是本智能合约中最复杂且具有灵魂的关键步骤。
当每个发起过竞标的用户,利用该标的隐式价格和密码进行揭标时。合约会对每一个标的信息(显式价格、隐式价格)同该商品实例中的最高竞价和次高竞价进行比较,以此来更新商品中的最高价、次高价以及最高价标的发起者。同时进行相关的返款操作。伪代码如下:

if(标内的显式价格>标内的隐式价格){//退款
}else{if(标内的隐式价格>商品实例中的最高出价){     if(商品实例中没有更新过投标数据){//更新商品内最高价、次高价和最高价出价人//退差价}else{//向之前的最高出价标主退款//更新商品内最高价、次高价和出价人//向自己退差价}}else{if(标内的隐式价格>商品实例中的次高价){//更新次高价//退款}//退款}
}

逻辑比较复杂,假设几个不一样数据的标走一下,转过弯就可以理解了。

揭标函数

     //写个事务,用来实时返回商品实例的最高价、次高价和最高价出价人。用于调试,正式合约中可以注释掉event revealEvent(uint _productIndex,bytes32 bidBytes,uint highestBid,uint sencondHighestBid,uint refund);function revealBid(uint _productIndex,uint _idealPrice,string memory password)public {//根据商品编号找到商品实例address seller = productIdToOwmer[_productIndex];Product storage pro = stores[seller][_productIndex];//时间限制,只有在竞标结束和仲裁开始之间才可以做揭标操作require(now>=pro.revealStartTime && now<pro.arbitrateStartTime);//根据标主提供的隐式价格和密码来找到标实例bytes memory bidInfo = abi.encodePacked(_idealPrice,password);bytes32 bidBytes = keccak256(bidInfo);Bid storage curBid =pro.bids[msg.sender][bidBytes];//确保这个标没有被揭过。因为每揭一次标就会涉及到从合约向用户发送以太坊require(!curBid.isRevealed);//确保这个标被找到了,即保证标主输入的隐式价格和密码是正确的。如果不正确,是无法找到对应标实例的require(curBid.bidder!=address(0));curBid.isRevealed=true;//标内的显式价格uint confusedPrice = curBid.price2Show;//标内的隐式价格uint idealPrice = _idealPrice;//退款金额uint refund = 0;//揭标算法if(confusedPrice<idealPrice){//相当于无效标refund = confusedPrice;}else{if(idealPrice>pro.highestBid){//如果是第一个揭标的人if(pro.highestBidder==address(0)){//更新商品内数据pro.highestBid=idealPrice;pro.secondHighestBid=pro.startPrice;pro.highestBidder=msg.sender;refund = confusedPrice - idealPrice;}else{//如果不是第一个揭标的人pro.highestBidder.transfer(pro.highestBid);pro.secondHighestBid = pro.highestBid;pro.highestBid = idealPrice;pro.highestBidder=msg.sender;refund = confusedPrice-idealPrice;}}else{//如果隐式价格大于商品内次高价格if(idealPrice>pro.secondHighestBid){pro.secondHighestBid = idealPrice;}//退款refund = confusedPrice;}}if(refund>0){//向标主返回该返回的以太坊msg.sender.transfer(refund);}//事务验证emit revealEvent(_productIndex,bidBytes,pro.highestBid,pro.secondHighestBid,refund);}

可添加一些辅助函数来帮助测试(如果不愿意用事务点来点去查看信息的话)

  function getInfoBack(uint _productIndex) public view returns(address,uint,uint,uint){//根据商品编号找到商品实例Product storage pro = stores[productIdToOwmer[_productIndex]][_productIndex];//返回所有你想要看的数据return (pro.highestBidder,pro.highestBid,pro.secondHighestBid,pro.totalBids);}

5.第三方仲裁人终结拍卖

揭标过后,其实最终的拍卖结果已经产生。将相关信息写入另一个合约中,进而进行卖家、买家和仲裁人的投标操作(类似淘宝中的确认收货的过程)

每一个产品都会生成一个对应的仲裁实例,结构如下:

contract Arbitration{//仲裁人地址address payable arbitrator;//卖家地址address payable seller;//买家地址address payable buyer;//买家获得票数uint totalVotes2Seller;//卖家获得票数uint totalVotes2Buyer;constructor(address payable _arbitrator,address payable _seller,address payable _buyer) payable public {arbitrator=_arbitrator;seller=_seller;buyer=_buyer;}

同时可以编写一些辅助函数来进行代码的阶段测试:

 function getBalance()public view returns(uint){return address(this).balance;}function getAritrationInfo()public view returns(address,address,address,uint,uint){return (arbitrator,seller,buyer,totalVotes2Seller,totalVotes2Buyer);}

终结竞拍函数
只能由非卖家和买家的用户发起,处于公平的考虑。
需要在主合约(Auction)里面添加一个数据结构,用来用商品编号来找到对应商品的仲裁合约:

contract Auction{...mapping(uint=>Arbitration) public proIndex2Arbitration;...
}

注:因为只有合约Auction对所有用户可见,所以要在Auction中调用对应的Arbitration实例。

终结竞拍函数(在主合约Auction中)

 function finalizeAuction(uint _productIndex)public payable{//根据商品编号获取对应商品实例address payable seller = productIdToOwmer[_productIndex];Product storage pro = stores[seller][_productIndex];//时间限制:必须在设定的揭标时间之后才可以终结竞拍require(now>=pro.arbitrateStartTime);address payable buyer = pro.highestBidder;address payable arbitrator = msg.sender;//仲裁人限制:不能是卖家和买家        require(arbitrator!=seller && arbitrator!=buyer);//商品状态限制:保证该商品是第一次被终结拍卖require(pro.status==ProductStatus.OPEN);if(pro.totalBids==0){pro.status=ProductStatus.UNSOLD;}else{pro.status=ProductStatus.SOLD;}//将最后的竞拍信息和Auction中余留的以太坊全部转入仲裁合约实例中Arbitration arb = (new Arbitration).value(pro.secondHighestBid)(arbitrator,seller,buyer);//将这个新生成的仲裁实例写入数据结构proIndex2Arbitration[_productIndex]=arb;//这时向竞标获胜者退还他的隐式价格和商品次高价之间的差价buyer.transfer(pro.highestBid-pro.secondHighestBid);}

solidity的0.5.0版本语法改动查阅地址:
solidity的0.5.0版本语法改动查阅地址

ps:
本人热爱图灵,热爱中本聪,热爱V神,热爱一切被梨花照过的姑娘。
以下是我个人的公众号,如果有技术问题可以关注我的公众号来跟我交流。
同时我也会在这个公众号上每周更新我的原创文章,喜欢的小伙伴或者老伙计可以支持一下!


公众号名称:后现代泼痞浪漫主义奠基人

基于以太坊的次高价盲拍solidity智能合约(二)相关推荐

  1. 基于以太坊的测试链发布一个智能合约

    1,创建账户 使用METAMASK钱包来进行操作,具体的创建过程请自行查阅.创建好的账户如下图所示,账户余额显示为0 详情下面显示对应账户的地址,这个是最关键的信息 首先选择左上角头像旁边的按键,切换 ...

  2. 尚硅谷以太坊区块链学习之NFT智能合约(6)

    尚硅谷以太坊区块链学习之NFT智能合约(6) 前言 一.NFT智能合约 1.智能合约代码 2.智能合约推送 3.具体调用 二.具体使用 三.NFT商家智能合约 前言 提示:服务外包区块链学习 5被ba ...

  3. 八、 以太坊的杰出之作:智能合约

    智能合约主要有两大方面的作用,一个是用于更便捷地处理交易,一个适用于更灵活的开发的APP,也就是区块链应用. 以太坊虚拟机:虚拟机是计算机领域里面的一个术语,可以理解为一个虚拟环境,在这个虚拟环境中可 ...

  4. 学习以太坊:瑞波也要智能合约

    瑞波自2013年诞生以来,虽以强大的性能著称,但一直不支持智能合约.以太坊凭着智能合约,却一路高歌猛进.现在,这一情况将得到改变.瑞波支持的研发团队XRPL Labs在准备推出方案"Hook ...

  5. 区块链学习(3) 以太坊测试环境编译并部署智能合约(mac版)

    选择编写智能合约的语言 Ethereum上的智能合约需要使用solidity语言来撰写.虽然还有其他能用来撰写智能合约的语言如Serpent(类Python).lll(类Fortran),但目前看到所 ...

  6. MIMIC 以太坊医疗项目开发(6)Web3智能合约API

    web3.js是一个库集合,你可以使用HTTP或IPC连接本地或远程以太它节点进行交互. 它具备如下性质: •通过JSON-RPC与Ethereum客户端进行交互 •支持所有的JSON-RPC方法类型 ...

  7. 以太坊去中心化淘宝智能合约案例

    这篇文章我们来介绍一个简易的区块链电商系统的核心功能,10多年来,我们习惯了淘宝的电商模式,淘宝为电商在中国普及做出了突出贡献,值得肯定,也完成了历史使命. 淘宝模式的核心是什么? 免费是一方面,我认 ...

  8. MIMIC 以太坊医疗项目开发(7) 医疗智能合约 sample

    本文引自<基于区块链的医疗信息系统及智能合约设计>辽宁科技大学学报 第43卷 第2期 2020年4月 Journal of University of Science and Techno ...

  9. 以太坊智能合约Java_以太坊:调用已部署的智能合约

    目录 1. 调用已部署的智能合约 相关截图来自: 1.1. ABI是payload编码的依据 ABI,应用二进制接口(Application Binary Interface).它是从区块链外部与合约 ...

最新文章

  1. django 中文乱码或不识别
  2. LINUX ORACLE 启动与关闭
  3. 【经验分享】非科班出身怎么转行计算机?
  4. 我的世界进服务器显示C1.8-1.11,【插件】 LibsDisguises —— 让你的玩家变成生物或者其他 [1.8-1.11]...
  5. [原创软件]体验组批量加分工具
  6. 查看商品图片,鼠标悬浮图片放大js实现
  7. cookie和session、web服务工作原理、Apache配置php扩展、php简介
  8. Java集合源码学习(4)HashSet
  9. 【Oracle】数据迁移工具(2):Data Dump
  10. Git(4)-- 如何退出 git log 和 git commit 状态
  11. 2021-08-08 事务的提交,回滚
  12. default value mysql_Mysql Field * doesn't have a default value解决方法
  13. matlab frontier,使用Matlab计算Efficient frontier
  14. 主力吸筹猛攻指标源码_成功率90%以上【主力吸筹+买点提示+使用方法】通达信指标公式源码...
  15. CC2430基础——外部中断分析
  16. 华为的人力资源管理揭秘
  17. 高强度间歇训练(HIIT)
  18. python输入百分制成绩s、按五级分制输出_输入一个百分制成绩,利用switch语句编写程序,要求输出成绩等级A B C D,E。90以上为A...
  19. 写给 Linux 初学者的一封信
  20. cdn刷新api_缓存刷新与查询

热门文章

  1. 小区宽带需求分析及解决方案(单项目)
  2. NLP模型卡-Transformer-XL
  3. 白话Java基础—内存模型是怎么解决缓存一致性问题的?
  4. shell脚本截取两个关键字之间的字符
  5. 口腔诊所装修也是有忌讳的
  6. 【推薦】帮你炼成软件架构师的97件事
  7. excel粘贴时出现故障_在高速公路驾车时出现故障如何自救,严重故障如何处理-看这里...
  8. 标志寄存器CF,OF,SF,ZF,PF以及相关练习
  9. 【搜索进阶】HDU 1667 The Rotation Game
  10. 移动端html如何加载优酷视频,网站怎么引用优酷腾讯视频并支持手机播放