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.在函数执行之后,修改状态变量的值

ethereum(以太坊)(实例)--"安全的远程购买"的更多相关文章

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

    说真的,刚开始接触这个竞拍案例--“简单的公开竞拍”,我就抱着简单的心态去查看这个实例,但是自我感觉并不简单.应该是我实力不到家的原因吧!!!233333...不过经过大半天的努力,自己理解完之后,觉 ...

  2. ethereum(以太坊)(一)

    从这周开始,开始学习以太坊开发--solidity,开始决定往区块链方向发展,毕竟区块链技术应用广泛.一开始接触solidity开发语言不太习惯,毕竟一直在学习python语法,有很多都不能接受.有难 ...

  3. ethereum(以太坊)(十四)--Delete

    pragma solidity ^0.4.10; contract Delete{ /* delete可用于任何变量(除mapping),将其设置成默认值 bytes/string:删除所有元素,其长 ...

  4. ethereum(以太坊)(基础)--容易忽略的坑(三)

    pragma solidity ^0.4.10; contract Byte{ bytes [] public T=new bytes[](3); function setLeng(uint len) ...

  5. ethereum(以太坊)(基础)--容易忽略的坑(二)

    pragma solidity ^0.4.0; contract EMath{ string public _a="lin"; function f() public{ modif ...

  6. ethereum(以太坊)(基础)--容易忽略的坑(一)

    pragma solidity ^0.4.0; contract base{ address public _owner=msg.sender; uint _a; string internal _b ...

  7. ethereum(以太坊)(十三)--异常处理/元祖

    pragma solidity ^0.4.4; contract Students{ uint[] data= new uint[](4); address _owner = msg.sender; ...

  8. ethereum(以太坊)(十二)--应用(二)__投票(基础总和)

    编写应用合约之前,先弄清它的逻辑,有助于我们更好的部署合约 pragma solidity ^0.4.21; pragma experimental ABIEncoderV2; contract vo ...

  9. ethereum(以太坊)(十二)--应用(一)__集资(构造函数/映射)

    pragma solidity ^0.4.4; contract funder{ //0xca35b7d915458ef540ade6068dfe2f44e8fa733c //0x14723a09ac ...

随机推荐

  1. 【Python】安装配置Anaconda

    优点:解决Python 库依赖问题 清华安装镜像 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/

  2. 1 如何使用pb文件保存和恢复模型进行迁移学习(学习Tensorflow 实战google深度学习框架)

    学习过程是Tensorflow 实战google深度学习框架一书的第六章的迁移学习环节. 具体见我提出的问题:https://www.tensorflowers.cn/t/5314 参考https:/ ...

  3. 3.获取git仓库

    有两种取得 Git 项目仓库的方法. 第一种是在现有项目或目录下导入所有文件到 Git 中: 第二种是从一个服务器克隆一个现有的 Git 仓库. 在现有目录中初始化仓库 如果你打算使用 Git 来对现 ...

  4. SQL Server ->> SQL Server 2016新特性之 -- Dynamic Data Masking

    Dynamic Data Masking是为了防止敏感数据暴露给未经授权的用户,以一种最小开销和维护成本的形式.Dynamic Data Masking用于表的字段,相当于盖住字段数据的一部分.比如一 ...

  5. double转换long的疑问

    在lua(5.1.4)下面测试的时候使用0x100000000的时候出现了问题,打印结果很明显,如下所示: Lua Copyright (C) - Lua.org, PUC-Rio > prin ...

  6. HBase编程 API入门系列之put(客户端而言)(1)

    心得,写在前面的话,也许,中间会要多次执行,连接超时,多试试就好了. [hadoop@HadoopSlave1 conf]$ cat regionservers HadoopMasterHadoopS ...

  7. 第四周 day4 python学习笔记

    关于装饰器的更多信息可以参考http://egon09.blog.51cto.com/9161406/1836763 1.装饰器Decorator 装饰器:本质上是函数,(装饰其他函数),就是为其他函 ...

  8. Hibernate初探之一对多映射 及 myeclipse自动生成hibernate文件方法

    实现单向一对多: 1)在one方的实体中添加保存many方的集合 2)在one方的配置文件中添加<one-to-many>配置 实现单向多对一: 1)在many方的实体中添加one方的引用 ...

  9. Microsoft Visual C++ 2005 Redistributable 无法卸载问题解决办法

    今日遇到一个问题,Microsoft Visual C++ 2005 Redistributable 无法卸载,弹出的对话框如下所示: 试了一些网上的方法,比如下载vcredist_x86.exe,解 ...

  10. 在WAS下找不到主机名称的问题

    发生错误: 联合 ADMU0036E: Deployment Manager 不能根据名称主机 cdzfwas2 在地址 127.0.0.1 查找           期间发生错误:正在回滚到原始配置 ...