ethereum(以太坊)(实例)--"安全的远程购买"

pragma solidity ^0.4.10;

contract Safebuy{

    uint public price;
    address public seller;
    address public buyer;

    constructor() public payable{
        seller = msg.sender;
        //uint value = msg.value / 2 ;
        //require(value *2 ==msg.value);
        price = msg.value;
    }

    enum State{Create,Block,Release}
    State public state;
    //根据函数的执行,更改条件状态--对函数方法的执行规定一定的顺序
    modifier StateStatus(State _state){
        require(state == _state);
        _;
    }

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

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

    event Abort();
    event Deal();
    event EndDeal();

    function getBalance() view public  returns(uint){
        return address(this).balance;
        //向该合约内共放入的以太币
        //刚部署合约时:address(this).balance = msg.value
        //买家交易达成时:address(this).balance = msg.value *2
    }

    //state = State.Release 其他函数都无法执行,该合约被终止
    //abort()在其他2个函数执行之前才能调用
    function abort() OnlySeller StateStatus(State.Create) public{
        emit Abort();
        state = State.Release;
        seller.transfer(address(this).balance);
    }
    //deal() 确定购买:在其他2个函数执行之前才能调用,先到先得,只执行一次
    function deal()  StateStatus(State.Create) payable public{
        emit Deal();
        buyer = msg.sender;
        require(msg.value == price);
        state = State.Block;
    }

    //endDeal 确认付款:在deal()执行之后,才能够执行该函数
    function endDeal() OnlyBuyer StateStatus(State.Block)payable public{
        emit EndDeal();
        state = State.Release;

        // 注意: 这实际上允许买方和卖方阻止退款 - 应该使用取回模式
        //buyer.transfer(msg.value);在执行deal函数时,已经扣掉了ether
        seller.transfer(address(this).balance);
    }
}
学到的知识点:
    1.enum:枚举根据改变枚举的状态,能够确定函数的执行顺序
    2.address(this).balance:往该合约内注入的以太币
    3.在函数执行之后,修改状态变量的值

 

转载于:https://www.cnblogs.com/eilinge/p/10108936.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值