ethereum(以太坊)(实例)--"简单的公开竞拍"

Posted on 2018-12-12 09:39  eilinge  阅读(574)  评论(0编辑  收藏  举报
说真的,刚开始接触这个竞拍案例--“简单的公开竞拍”,我就抱着简单的心态去查看这个实例,但是自我感觉并不简单.应该是我实力不到家的原因吧!!!233333。。。
不过经过大半天的努力,自己理解完之后,觉得是有那么点简单.(代码是官网上的,不过解释不太清楚.我加了自己的实践和理解,希望能帮助到大家)
pragma solidity ^0.4.10;

contract Bid{

    //0x14723a09acff6d2a60dcdf7aa4aff308fddc160c,100

    //0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db,200
    //0x583031d1113ad414f02576bd6afabfb302140225,150

    //商品拥有者地址
    address public benefiy;
    //拍卖时间
    uint bidEndtime;

    //记录未成功竞拍到的人,可以取回之前的出价
    mapping(address => uint) public RetrunMemony;
    //最高价地址
    address public HighestBidAddr;
    //最高价
    uint public HighestBidMomery;
    //是否结束
    bool isEnd;

    event HighestBidIncrase(address bider,uint _memony);
    event EndBidIncrase(address _bider,uint _memony);

    constructor(address  _benefiy,uint _EndTime) public{
        benefiy = _benefiy;
        bidEndtime = now + _EndTime;
    }
    //开始竞拍
    function bid() public payable{
        require(now < bidEndtime);//require(msg.sender.balance > msg.value);
        require(msg.value>HighestBidMomery);

        if(HighestBidMomery !=0){ //储存成功参与竞拍但不是最高价的地址和出价
            RetrunMemony[HighestBidAddr] += HighestBidMomery;//同一参与竞拍者多次出价
        }

        HighestBidMomery = msg.value;
        HighestBidAddr = msg.sender;
        emit HighestBidIncrase(msg.sender,msg.value);
    }
    //结束竞拍
    function endBid() public payable{
        require(now >= bidEndtime);
        require(!isEnd);

        isEnd = true;

        benefiy.transfer(HighestBidMomery);
        emit EndBidIncrase(HighestBidAddr,HighestBidMomery);
    }
    //未竞拍成功的人取回交易
    function getBack() payable public returns(bool){
        uint mount = RetrunMemony[msg.sender];
        if(mount >0){//执行一次后,就无法再执行此返还函数
            RetrunMemony[msg.sender] = 0;//取回后,价格清0,不允许再次执行
            //send:success->true,failed->false
            //msg.sender.send(mount) 执行成功则不执行以下函数
            if(!msg.sender.send(mount)){// 未返还竞拍价格
                RetrunMemony[msg.sender] = mount;
                return false;//未返还竞拍价格
            }
        }
        return true;//if(mount <=0) 已经成功取回竞拍价
    }

}