zoukankan      html  css  js  c++  java
  • 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.在函数执行之后,修改状态变量的值
  • 相关阅读:
    【矩阵乘法优化dp】[Codeforces 621E] Wet Shark and Blocks
    【2016常州一中夏令营Day7】
    【2016常州一中夏令营Day6】
    【2016常州一中夏令营Day5】
    【2016常州一中夏令营Day4】
    【2016常州一中夏令营Day3】
    【2016常州一中夏令营Day2】
    Aiopr的中文意思
    Bloom filter
    redis4.0.2集群搭建
  • 原文地址:https://www.cnblogs.com/eilinge/p/10108936.html
Copyright © 2011-2022 走看看