实现一个买卖合约 / 学习智能合约#11
用智能合约来实现买卖合约是再恰当不过了! 它是完全的去中介化的、自动执行的合约,也是在一些情景下取代支付宝等中介的好办法。
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);
}
}
结和上图,稍捋一下逻辑:
- 由卖家发起合约,将2倍押金打到合约账户,表示要卖东西了。
- 买家表示对商品感兴趣,于是也交纳2倍的金额(物价+押金)到合约账户。
- 卖家将商品发送给买家。
- 买家收到商品后确认,押金自动返还给买家。
- 卖家确认交易完成终止合约,同时得到账户的余额(3A)。
同此可见,用智能合约来实现买卖是完全可以去中介化的,而且基于一种内在的动力(有押金的存在)买卖双方是会自动地去完成合约的。如果是一些数字资产,用它来交易是不是比在淘宝上更好呢?!