实现一个买卖合约 / 学习智能合约#11

in STEEM CN/中文6 years ago

buy.jpg

用智能合约来实现买卖合约是再恰当不过了! 它是完全的去中介化的、自动执行的合约,也是在一些情景下取代支付宝等中介的好办法。

pragma solidity >=0.5.0 <0.7.0;

contract Purchase {
    uint public value;
    address payable public seller;
    address payable public buyer;

    enum State { Created, Locked, Release, Finished }
    //定义合约的状态,初始为Created
    State public state;

    modifier condition(bool _condition) {
        require(_condition);
        _;
    }

    modifier onlyBuyer() {
        require(msg.sender == buyer);
        _;
    }

    modifier onlySeller() {
        require(msg.sender == seller);
        _;
    }

    modifier inState(State _state) {
        require(state == _state );
        _;
    }

    event Aborted();
    event PurchaseConfirmed();
    event ItemReceived();
    event SellerRefunded();

    //卖家创建合约时需提交物品价格的双倍做为押金。
    constructor() public payable {
        seller = msg.sender;
        value = msg.value / 2;
        require((2 * value) == msg.value);
    }

    //卖家提前终止合约,同时取回押金。
    function abort()
        public
        onlySeller
        inState(State.Created)
    {
        emit Aborted();
        state = State.Finished;
        seller.transfer(address(this).balance);
    }

    // 买家确认购买,提交价格+押金(双倍价格)
    function confirmPurchase()
        public
        inState(State.Created)
        condition(msg.value == (2 * value))
        payable
    {
        emit PurchaseConfirmed();
        buyer = msg.sender;
        state = State.Locked;
    }

    // 买家确认收到商品,取回押金
    function confirmReceived()
        public
        onlyBuyer
        inState(State.Locked)
    {
        emit ItemReceived();
        state = State.Release;
        buyer.transfer(value);
    }

    //卖家确认交易完成,取回价格+押金(3倍价格)
    function refundSeller()
        public
        onlySeller
        inState(State.Release)
    {
        emit SellerRefunded();
        state = State.Finished;
        seller.transfer(3 * value);
    }
}

buy2.jpg

结和上图,稍捋一下逻辑:

  1. 由卖家发起合约,将2倍押金打到合约账户,表示要卖东西了。
  2. 买家表示对商品感兴趣,于是也交纳2倍的金额(物价+押金)到合约账户。
  3. 卖家将商品发送给买家。
  4. 买家收到商品后确认,押金自动返还给买家。
  5. 卖家确认交易完成终止合约,同时得到账户的余额(3A)。

同此可见,用智能合约来实现买卖是完全可以去中介化的,而且基于一种内在的动力(有押金的存在)买卖双方是会自动地去完成合约的。如果是一些数字资产,用它来交易是不是比在淘宝上更好呢?!

Coin Marketplace

STEEM 0.05
TRX 0.32
JST 0.079
BTC 66499.01
ETH 1815.08
USDT 1.00
SBD 0.42