以太坊合约分析之拍卖算法

拍卖的基本流程很简单,一般就是拍卖人亮出一件商品,拼命的宣传吹嘘商品的价值,然后进入一轮又一轮的竞价过程,待拍卖时间结束,价高者和拍卖人一手交货一手交钱。

现场拍卖和数字拍卖略微不同,现场拍卖等待的时间不能太长,不能冷场,拍卖参与的人数也很有限,拍卖程序进行的很快,连喊几声无人加价就结束了。

数字拍卖一般是限定时间段,活动时间到了拍卖才算结束,或者拍卖人觉得拍卖的价钱已经很不错了就提前结束。

下面我们分析一个简单的拍卖合约代码

  1. 拍卖人通过构造器SimpleAuction()发起拍卖,提供拍卖持续时间和受益人账户地址参数,拍卖人可以是商品主人也可以是代理人。

  2. 参与人通过调用bid()方法进行举牌。举牌是一个需要耗币的过程,并且每次举牌的金额必须高于当前举牌的最大金额。该方法会记录当前的举牌人账户地址和金额。

    如果参与人的举牌金额在下一轮被超越了,就会将上一轮的举牌人和举牌金额记录在pendingReturns字典中以便在拍卖结束返还给参与人。

  3. 任意用户调用auctionEnd()触发交易结束。也许你会问如果是任意用户可以结束交易,那交易不就可以提前结束了么?该方法的代码已经做了时间判断,只有等到拍卖的时间结束调用此方法才能成功,并且通过设置ended变量来控制只能结束一次。

    拍卖一结束,合约就会调用beneficiary.transfer(highestBid)将当前举牌的最大金额转入受益人账户。

  4. 其它未中标的参与人可以调用withdraw()方法从合约账户中取回自己的竞拍金额。

上面这个简单的合约有一个不足,参与人如果向加价竞拍的话,需要重复支付全量金额,如果重复加价N次,需要付出N倍的金额。

还有就是没有限定加价最低间隔,会导致后面的参与人使用微弱的价格增量就可以抢夺商品的购买权,因为合约的执行确认需要一定时间,在活动临近结束时,当前最高竞价者持有的商品购买权很容易被抢占。

阅读相关文章,关注头条号【码洞】

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

微信号已复制,请打开微信添加咨询详情!
-->