首页 > 其他分享 >经典智能合约之智能拍卖

经典智能合约之智能拍卖

时间:2023-05-28 21:31:48浏览次数:33  
标签:经典 智能 拍卖 uint 竞拍 address buyer 出价 msg


角色分析: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成功之后,进行初始查询,右下可知,auctioneer即为合约调用者的地址,seller地址与刚刚输入的地址一致。初始buyer地址默认为0,出价金额也为0。

经典智能合约之智能拍卖_sed_02

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

经典智能合约之智能拍卖_初始化_03

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

经典智能合约之智能拍卖_构造函数_04

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

经典智能合约之智能拍卖_sed_05

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

经典智能合约之智能拍卖_sed_06

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

经典智能合约之智能拍卖_sed_07

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

经典智能合约之智能拍卖_构造函数_08

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

经典智能合约之智能拍卖_构造函数_09

标签:经典,智能,拍卖,uint,竞拍,address,buyer,出价,msg
From: https://blog.51cto.com/u_15736437/6366489

相关文章

  • 经典智能合约案例之发红包
    角色分析:发红包的人和抢红包的人功能分析:发红包:发红包的功能,可以借助构造函数实现,核心是将ether打入合约;抢红包:抢红包的功能,抢成功需要一些断言判断,核心操作是合约转账给抢红包的人;退还:当红包有剩余的时候,允许发红包的人收回余额,可以用合约销毁来实现;实现发红包功能需要一个有支付......
  • 经典函数指针应用 函数指针回调
    voidManu(){ printf("**************************************\n"); printf("*********1.Add2.Sub******\n"); printf("*********3.Nul4.Div******\n"); printf("*********0.exit******\......
  • 马斯克要用人工智能对抗人工智能
    ​      导读:马斯克对人工智能可能变得失控并“摧毁人类”的担忧促使他采取行动,发起了一个名为“TruthGPT”的项目。 本文字数:1400,阅读时长大约:9分钟 亿万富翁埃隆·马斯克在谈到人工智能(AI)的危险时,从他的虚构角色托尼·斯塔克那里得到了启示。 在漫威电影宇宙......
  • Voyager:AI智能体自主写代码独霸我的世界,完胜AutoGPT
    继斯坦福的25人小镇后,AI智能体又出爆款新作了。最近,英伟达首席科学家JimFan等人把GPT-4整进了「我的世界」(Minecraft)——提出了一个全新的AI智能体Voyager。Voyager的厉害之处在于,它不仅性能完胜AutoGPT,而且还可以在游戏中进行全场景的终身学习!比起之前的SOTA,Voyager获得的物......
  • 人工智能导论——机器人自动走迷宫&强化学习
    一、问题重述强化学习是机器学习中重要的学习方法之一,与监督学习和非监督学习不同,强化学习并不依赖于数据,并不是数据驱动的学习方法,其旨在与发挥智能体(Agent)的主观能动性,在当前的状态(state)下,通过与环境的交互,通过对应的策略,采用对应的行动(action),获得一定的奖赏(reward)......
  • MT8192,MT8195 全网通安卓核心板智能模块
    MT8192和MT8195核心板是功能强大的芯片,非常适合生产力、视频会议、远程教育、游戏或娱乐流媒体等领域。这两款芯片采用了八核CPU设计,因此性能有望显着提升:MT8192选择高性能ArmCortex-A76CPU,而MT8195使用最新的ArmCortex-A78CPU。这些技术让MT8192和MT8195成为了具有强大......
  • 行业报告 | AIGC应用与实践展望报告:人工智能重塑内容产业的作业模式
    原创|BFT机器人前言Introduction不可否认AIGC的出现似乎已经让大家预见了Al应用的拐点,其创造性与智能性一夜之间刷新了大众认知。但去伪存真,在市场火爆的背后其真正的应用及商业价值几何,更待我们冷静地剖析。01概念重生:AIGC是内容生成方式一次进化缘起于GC,而归于AI,AIGC的关键是A......
  • 【触想智能】工业安卓一体机的基本组成结构你了解吗?
    工业安卓一体机是指采用ARM架构的工业一体机,也被称为安卓工控一体机。工业安卓一体机的主要作用是采集各渠道信息,并给出精确计算,同时发出正确的操作指令让外设完成设计的相应工作任务。目前工业安卓一体机已经在社会各行各业得到广泛应用,比如在工厂生产车间、智慧小区、......
  • 2802ICT Intelligent System 智能系统
    Assignment22802ICTIntelligentSystemSchoolofICT,GriffithUniversityTrimester1,2023Instructions:•Due:Monday29thMay2023,11:59PMwithdemonstrationstobeheldonWeek12.•Marks:50%ofyouroverallgrade•Latesubmission:Latesubmissionis......
  • 改变开发的未来 | 探索无服务器与人工智能的协同效应
    近年来,无服务器计算和人工智能深刻改变着应用程序的开发方式。无服务器计算实现无需管理底层基础架构就能构建和运行应用程序,而人工智能则让应用程序依据数据和算例做出智能决策。借助云计算,开发者打开了一个应用程序开发、构建的全新世界的大门,开发人员可以比以往任何时候都更快......