经典智能合约之智能拍卖

零知识证明
• 阅读 814

实现一个简易的拍卖合约

角色分析: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。

经典智能合约之智能拍卖

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

经典智能合约之智能拍卖

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

经典智能合约之智能拍卖

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

经典智能合约之智能拍卖

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

经典智能合约之智能拍卖

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

经典智能合约之智能拍卖

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

经典智能合约之智能拍卖

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

经典智能合约之智能拍卖

点赞
收藏
评论区
推荐文章
尼克 尼克
4年前
简说设计模式——观察者模式
一、什么是观察者模式  观察者一般可以看做是第三者,比如在学校上自习的时候,大家肯定都有过交头接耳、各种玩耍的经历,这时总会有一个“放风”的小伙伴,当老师即将出现时及时“通知”大家老师来了。再比如,拍卖会的时候,大家相互叫价,拍卖师会观察最高标价,然后通知给其它竞价者竞价,这就是一个观察者模式。  对于观察者模式而言,肯定有观察
可莉 可莉
3年前
10个开源的Python区块链项目
Python不是主流的区块链底层平台开发语言,但是在DApp开发、区块链仿真与数据分析、智能合约安全分析等领域,Python依然是不错的选择。本文介绍了10个最流行的Python区块链项并提供了相应的源代码下载地址。<!more区块链开发教程链接:以太坊(https://www.oschina.net/action/GoToLink
Stella981 Stella981
3年前
Fabric链码开发的8个原则
我相信智能合约(链码)是HyperledgerFabric区块链网络的核心。正确开发链码可以真正发挥一个安全区块链的优势,反之则会带来灾难性的后果。在这篇文章里我不打算探讨HyperledgerFabric链码设计的特定模式的好与坏,而是希望分享我在开发若干HyperledgerFabric概念验证应用过程中总结的一些基本准则。Hyperled
Wesley13 Wesley13
3年前
NEO从源码分析看UTXO交易
_0x00前言_社区大佬:“交易是操作区块链的唯一方式。”_0x01交易类型_在NEO中,几乎除了共识之外的所有的对区块链的操作都是一种“交易”,甚至在“交易”面前,合约都只是一个小弟。交易类型的定义在Core中的TransactionType中:源码位置:neo/Core/TransactionType
Stella981 Stella981
3年前
DEX聚合器1inch对接教程【含源码】
1inch是一个链上去中心化交易所(DEX)聚合器,它可以在单一交易内按最优策略将兑换拆分到多个DEX上执行,从而获得最佳的兑换比率。1inch智能合约已经在Gihub开源(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2F1inchexchange%2F1in
Stella981 Stella981
3年前
DeFi之后下一个浪潮将是DAO?
最近在多个社交平台看到这样一张MEME图,身处加密圈的你肯定对DeFi不陌生,图中所指比DeFi更大的DAO是什么,DeFi热度犹在,新的浪潮已在酝酿?DAO是将组织不断迭代的管理和运作规则(共识)以智能合约的形式逐步编码在区块链上,从而在没有第三方干预的情况下,通过智能化管理手段和通证经济激励,使得组织按照预先设定的规则实现自运转、自治理、自演化,进
Stella981 Stella981
3年前
Solidity内联汇编简明指南
在用Solidity开发以太坊智能合约时,使用汇编可以直接与EVM交互,降低gas开销成本,更精细的控制智能合约的行为,因此值得Solidity开发者学习并加以利用。本文是Solidity汇编开发的简明教程,旨在帮助你快速熟悉如何在Solidity智能合约代码中嵌入汇编代码。以太坊教程链接:Dapp入门(https://www.oschina.n
Stella981 Stella981
3年前
AElf区块链分红合约(Profit Contract)接口和实现思路
初衷简单说,我们需要一个智能合约来管理所有的分红项目(profititem)。分红项目是一个代币分配中心:每个分红项目的创建者(creator)可以为该分红项目注册(register)分红的接收地址(receiveraddress)或其他可以接收分红的分红项目,并为每个接收方设定权重(weight)。之后,每次分红项目的创建者释放(rele
Stella981 Stella981
3年前
Chainlink区块链Oracle网络使用指南
Chainlink是一个去中心化的预言机网络,它可以让区块链中的智能合约安全地访问外部世界的数据。在这个教程中,我们将探索chainlink预言机网络的搭建,并学习如何使用预置或自定义的适配器实现智能合约与外部世界数据的桥接。以太坊教程链接:Dapp入门(https://www.oschina.net/action/GoToLink?urlh
曼成 曼成
1年前
拍卖市场动态一手掌握:企业司法拍卖信息API的高效利用
在当今快速变化的商业环境中,企业司法拍卖信息对于投资者、债权人、法律专业人士以及市场分析师来说,都是极其宝贵的资源。随着技术的发展,企业司法拍卖信息通API的出现,为企业和个人提供了一种高效、便捷的获取拍卖信息的方式。本文将探讨如何利用这一API,确保用户能够实时掌握拍卖市场的动态,并从中发现潜在的商业机会。
零知识证明
零知识证明
Lv1
月下飞天镜,云生结海楼。
文章
3
粉丝
0
获赞
0