solidity之智能拍卖案例

news2024/11/25 11:57:12

文章目录

    • 实现一个简易的拍卖
    • 状态变量定义和初始化
    • 竞拍功能
    • 结束竞拍
    • 代码

实现一个简易的拍卖

角色分析:4类角色(拍卖师actioneer,委托人seller,竞买人bidder,买受人buyer)

功能分析:拍卖的基本原则是价高者得,在设定的拍卖时限内,出价最高者最终获得拍卖得标物(提示:在数据结构上,不用太复杂的设计,只需能记录当前最高价的竞买人及其金额、拍卖结束时间即可。)

  • 竞拍功能:竞买人可以多次出价,价格必须高于当前记录的最高价,并将最高价和竞买人替换。

  • 竞拍结束:竞拍结束时,宣布胜利者。

状态变量定义和初始化

定义变量:委托人、拍卖师、买受人、竞拍结束标志、时间限制、竞拍最高金额。(提示:调用者为拍卖师,如果涉及到角色需要用address
payable,构造函数可以初始化拍卖师[即msg.sender]、拍卖时限、竞拍结束标志,竞买人在程序中选择不同account,根据account和msg.value更新买受人和最高金额)

竞拍功能

只要竞拍未结束都可以发起竞拍(提示:从调用信息窗口选择买家,输入竞拍价格,用msg.sender和msg.value获得买家和价格信息)

但需要满足以下条件:竞拍未结束;竞拍时的价格一定要比之前的价格高;竞拍在时限内;

当竞拍被允许时,需要退钱给上一个买家,并替换原有的最高价格和买受人。

结束竞拍

判断是否超过时限,并且是第一次执行本操作,确认通过后给委托人。

代码

pragma solidity ^0.8.4;
contract auction {
    uint auctionEndTime;
    address public auctioneer;
    address public buyer;
    address payable public seller;
    uint public auctionAmount;

    // Allowed withdrawals of previous bids
    mapping(address => uint) pendingReturns;

    // A sign to judge whether the auction is over
    // Set to true at the end, disallows any change.
    bool ended;

    // Events that will be emitted on changes.
    event auctionAmountIncreased(address bidder, uint amount);
    event AuctionEnded(address winner, uint amount);

    // Errors that describe failures.
    /// The auction has already ended.
    error AuctionAlreadyEnded();
    /// There is already a higher or equal bid.
    error BidNotHighEnough(uint auctionAmount);
    /// The auction has not ended yet.
    error AuctionNotYetEnded();
    /// The function auctionEnd has already been called.
    error AuctionEndAlreadyCalled();

    constructor(
        uint biddingTime,
        address payable sellerAddress
    ) {
        seller = sellerAddress;
        auctionEndTime = block.timestamp + biddingTime;
        auctioneer = msg.sender;
    }

    /// Bid function
    function bid() external payable {
        // Revert the call if the bidding period is over.
        if (block.timestamp > auctionEndTime)
            revert AuctionAlreadyEnded();

        // Return money if the bid is not high enough
        if (msg.value <= auctionAmount)
            revert BidNotHighEnough(auctionAmount);

        if (auctionAmount != 0) {
            pendingReturns[buyer] += auctionAmount;
        }
        buyer = msg.sender;
        auctionAmount = msg.value;
        emit auctionAmountIncreased(msg.sender, msg.value);
    }

    /// End the auction and send the highest bid to the seller.
    function auctionEnd() external payable {

        // Analyzing conditions
        if (block.timestamp < auctionEndTime)
            revert AuctionNotYetEnded();
        if (ended)
            revert AuctionEndAlreadyCalled();
        ended = true;
        emit AuctionEnded(buyer, auctionAmount);
        // transfer
        seller.transfer(auctionAmount);
    }
}

首先,按照要求deploy拍卖,按照要求设置相关参数,其中seller的地址是 0x78731D3Ca6b7E34aC0F824c42a7cC18A495cabaB ,竞拍的时间是 120

如下所示:

deploy.png

deploy成功之后,进行初始查询,右下可知,auctioneer即为调用者的地址,seller地址与刚刚输入的地址一致。初始buyer地址默认为0,出价也为0。

prequery.png

然后进行第一次竞拍,切换至地址结尾为 35cb2 的账户,出价为1949 ,进行竞拍:

firstbid.png

查询后可知,竞拍成功,并且出现在当前buyer位置:

firstquery.png

然后进行第二次竞拍,切换至地址结尾为 C02db 的账户,出价为6666,进行竞拍:

secondbid.png

查询后可知,竞拍成功,并且出现在当前buyer位置:

secondquery.png

然后进行第三次竞拍,切换至地址结尾为 5E7f2 的账户,出价为9999,进行竞拍:

thirdbid.png

查询后可知,竞拍成功,并且出现在当前buyer位置:

thirdquery.png

最后,待拍卖时间结束后进行auctionEnd,根据定义,价高者得,因此winner是出价9999 的账户,结果如下:

auctionEnd.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/630196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Shell脚本攻略:Linux防火墙(一)

目录 一、理论 1.安全技术 2.防火墙 3.通信五元素和四元素 4.总结 二、实验 1.iptables基本操作 2.扩展匹配 3. 自定义链接 一、理论 1.安全技术 &#xff08;1&#xff09;安全技术 ①入侵检测系统&#xff08;Intrusion Detection Systems&#xff09;&#xff1…

汽车电子AUTOSAR之BswM模块

目录 前言 正文 总体设计框架 模式仲裁过程 模式控制过程 模式仲裁 模式请求来源(ModeRequestPorts) 模式条件(ModeCondition) 逻辑表达式(LogicExpressions) 模式规则(ModeRules) 模式规则的初始化 模式控制 模式控制基本流程 模式行为 常用函数接口 前言 首先&…

Dependency not found解决方案(Springboot,绝对有效)

目录 问题描述解决方案systemPathmvn install 问题描述 今天在弄一个项目的依赖的时候&#xff0c;easyexcel 的依赖就是下载不了&#xff0c;虽然我的 Maven 配置没问题。 依赖&#xff1a;    Maven 配置&#xff1a;    我切换了几个版本&#xff0c;也无法从镜像下…

git diff去除^M的方法

一&#xff0c;简介 本文主要介绍在git修改的时候&#xff0c;修改文件后&#xff0c;git diff查看修改内容时&#xff0c;发现修改的地方每行结束的地方都会有“^M”&#xff0c;很影响查看。故今天分享一种去除“ ^M”显示的方法&#xff0c;供参考。 二&#xff0c;问题原…

案例29:基于Springboot医疗挂号系统开题报告设计

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

最新版本Portraiture4.1中文版ps磨皮滤镜插件安装包

在Portraiture有非常强大的手动功能&#xff0c;可以为用户进行手动调整照片中的皮肤区域以达到更加完美的效果&#xff0c;软件还支持同时导入上千张照片&#xff0c;用户可以通过自动识别照片中的人脸从而依照自己的风格进行批量处理十分的方便快捷。 最新版本Portraiture 4…

空气污染气象学期末复习笔记

空气污染气象学 &#xff08;一&#xff09;研究什么 运用气象学方法研究空气污染物自排放源进入大气层后的散布规律&#xff0c;核心是研究大气输送和扩散 &#xff08;二&#xff09;大气污染 大气污染是指由于人类活动或自然过程引起某种物质进入大气中&#xff0c;呈现出足…

Mysql数据库入门基础篇--mysql 多表查询

【Mysql数据库入门基础篇--mysql 多表查询 &#x1f53b;一、mysql 多表查询1.1 &#x1f343; 7种sql joins 的实现1.2 &#x1f343; 错误写法---笛卡尔积错误1.3 &#x1f343; 正确的多表select写法 &#x1f53b;二、内连接( inner) join&#x1f53b;三、 外连接&#xf…

【LeetCode】23. 合并 K 个升序链表

23. 合并 K 个升序链表&#xff08;困难&#xff09; 方法一&#xff1a;顺序合并 思路 ListNode* mergeTwoLists(ListNode *a, ListNode *b) {if ((!a) || (!b)) return a ? a : b;ListNode head, *tail &head, *aPtr a, *bPtr b;while (aPtr && bPtr) {if (…

【第十期】Apache DolphinScheduler 每周 FAQ 集锦

点击蓝字 关注我们 摘要 为了让 Apache DolphinScheduler 的广大用户和爱好者对于此项目的疑问得到及时快速的解答&#xff0c;社区特发起此次【每周 FAQ】栏目&#xff0c;希望可以解决大家的实际问题。 关于本栏目的要点&#xff1a; 本栏目每周将通过腾讯文档&#xff08;每…

卡尔曼滤波与组合导航原理(十二)扩展卡尔曼滤波:EKF、二阶EKF、迭代EKF

文章目录 一、多元向量的泰勒级数展开二、扩展Kalman滤波三、二阶滤波四、迭代EKF滤波 一、多元向量的泰勒级数展开 { y 1 f 1 ( X ) f 1 ( x 1 , x 2 , ⋯ x n ) y 2 f 2 ( X ) f 2 ( x 1 , x 2 , ⋯ x n ) ⋮ y m f m ( X ) f m ( x 1 , x 2 , ⋯ x n ) \left\{\begin{…

大家都说Java有三种创建线程的方式,并发编程中的惊天骗局

在Java中&#xff0c;创建线程是一项非常重要的任务。线程是一种轻量级的子进程&#xff0c;可以并行执行&#xff0c;使得程序的执行效率得到提高。Java提供了多种方式来创建线程&#xff0c;但许多人都认为Java有三种创建线程的方式&#xff0c;它们分别是继承Thread类、实现…

论文浅尝 | Dually Distilling KGE for Faster and Cheaper Reasoning

笔记整理&#xff1a;张津瑞&#xff0c;天津大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://dl.acm.org/doi/10.1145/3488560.3498437 动机 知识图谱已被证明可用于各种 AI 任务&#xff0c;如语义搜索&#xff0c;信息提取和问答等。然而众所周知&#xff…

【C++】C++11常用新特性

✍作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;C 目录 一、统一的列表初始化二、 简化声明2.1 auto2.2 decltype2.3 nullptr 三、右值引用和移动语义 -- 重要3.1 区分左值引用和右值引用3.2 对比左值引用看看右值引用使用价值3.3 万能引用和完美转发&#xff08;st…

基于word文档,使用Python输出关键词和词频,并将关键词的词性也标注出来

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 移船相近邀相见&#xff0c;添酒回灯重开宴。 大家好&#xff0c;我是Python进阶者。 一、前言 前几天在有个粉丝问了个问题&#xff0c;大概意思是这样…

一道北大强基题背后的故事(三)——什么样的题是好题?

早点关注我&#xff0c;精彩不错过&#xff01; 上回我们针对这道北大强基题[((1 sqrt(5)) / 2) ^ 12]在答案的基础上给出了出题的可能思路&#xff0c;想一探究竟&#xff0c;相关内容请戳&#xff1a; 一道北大强基题背后的故事&#xff08;二&#xff09;——出题者怎么想的…

【Kubernetes入门】Service四层代理入门实战详解

文章目录 一、Service四层代理概念、原理1、Service四层代理概念2、Service工作原理3、Service原理解读4、Service四种类型 二、Service四层代理三种类型案例1、创建ClusterIP类型Service2、创建NodePort类型Service3、创建ExternalName类型Service 三、拓展1、Service域名解析…

Latex中图片排版(多个子图、横排、竖排、添加小标题)

1、两个子图横排 \begin{figure}[!t] \centering %\includegraphics[width3in]{fig5} \subfloat[subfig figure title]{\includegraphics[scale0.5]{superd2}} \subfloat[subfig figure title]{\includegraphics[scale0.5]{superd2}} \caption{title} \label{fig_6} \end{figu…

阿里发布的百亿级高并发系统(全彩版小册),涵盖了所有的高并发操作

高并发 提到“高并发”相信你们应该都不会感到陌生&#xff01;此时你脑中应该会浮现好多有关高并发的&#xff1a;业务急剧增长、电商购物、电商秒杀、12306抢票、淘宝天猫各种活动等&#xff1b;都是需要用到高并发的&#xff0c;那么如何去设计一个高并发系统抵挡这些冲击呢…

Django的app里面的视图函数

我之前说过需要重点去了解view和model&#xff0c;下面是我的总结。 视图函数是存在view.py里面的&#xff0c;视图函数的主要功能是接收请求、返回响应。在建立应用程序后&#xff0c;先在URL配置文件中加一条配置项指明URL与视图函数的对应关系。然后按照实际需求在视图函数…