1. pragma solidity ^0.4.10;
  2.  
  3. contract Safebuy{
  4.  
  5. uint public price;
  6. address public seller;
  7. address public buyer;
  8.  
  9. constructor() public payable{
  10. seller = msg.sender;
  11. //uint value = msg.value / 2 ;
  12. //require(value *2 ==msg.value);
  13. price = msg.value;
  14. }
  15.  
  16. enum State{Create,Block,Release}
  17. State public state;
  18. //根据函数的执行,更改条件状态--对函数方法的执行规定一定的顺序
  19. modifier StateStatus(State _state){
  20. require(state == _state);
  21. _;
  22. }
  23.  
  24. modifier OnlyBuyer(){
  25. require(buyer == msg.sender);
  26. _;
  27. }
  28.  
  29. modifier OnlySeller(){
  30. require(seller == msg.sender);
  31. _;
  32. }
  33.  
  34. event Abort();
  35. event Deal();
  36. event EndDeal();
  37.  
  38. function getBalance() view public returns(uint){
  39. return address(this).balance;
  40. //向该合约内共放入的以太币
  41. //刚部署合约时:address(this).balance = msg.value
  42. //买家交易达成时:address(this).balance = msg.value *2
  43. }
  44.  
  45. //state = State.Release 其他函数都无法执行,该合约被终止
  46. //abort()在其他2个函数执行之前才能调用
  47. function abort() OnlySeller StateStatus(State.Create) public{
  48. emit Abort();
  49. state = State.Release;
  50. seller.transfer(address(this).balance);
  51. }
  52. //deal() 确定购买:在其他2个函数执行之前才能调用,先到先得,只执行一次
  53. function deal() StateStatus(State.Create) payable public{
  54. emit Deal();
  55. buyer = msg.sender;
  56. require(msg.value == price);
  57. state = State.Block;
  58. }
  59.  
  60. //endDeal 确认付款:在deal()执行之后,才能够执行该函数
  61. function endDeal() OnlyBuyer StateStatus(State.Block)payable public{
  62. emit EndDeal();
  63. state = State.Release;
  64.  
  65. // 注意: 这实际上允许买方和卖方阻止退款 - 应该使用取回模式
  66. //buyer.transfer(msg.value);在执行deal函数时,已经扣掉了ether
  67. seller.transfer(address(this).balance);
  68. }
  69. }
  1. 学到的知识点:
  2. 1.enum:枚举根据改变枚举的状态,能够确定函数的执行顺序
  3. 2.address(this).balance:往该合约内注入的以太币
  4. 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. 微信小程序开发2-第一个小程序开发准备

    1.首先在官网上注册一个账号( https://mp.weixin.qq.com/ )申请一个AppID(类似于人的身份证,小程序也需要身份证) 注册过程不多说 2.安装开发工具( https://m ...

  2. Element和vue框架报错提示

    上面报错提示Error in render function: "TypeError:Cannot read property '$options' of undefined" 就 ...

  3. C# 导出excel文件处理科学计数法办法

    在邦定gridview控件时在rowdatabound事件中队数据格式化 protected void DataGridView1_RowDataBound(object sender, GridVi ...

  4. git rebase vs git merge详解

    https://medium.com/@porteneuve/getting-solid-at-git-rebase-vs-merge-4fa1a48c53aa#.std3ddz0g 请参考另外一篇文 ...

  5. SSIS ->> Environment Variables

    SQL Server Integration Services(SSIS) 在2012版本引入了Environment Variables这个新特性.它允许我们为一个环境创建出一套变量用于为项目内的包 ...

  6. Controller与View数据传递 多Model传递

    1)ViewBag变量方式 使用4个ViewBag变量进行数据传递,Data1.Data2.Data3.Data4的数据直接从数据库里调. Control中伪代码如下所示: 1 public Acti ...

  7. linux和aix内核参数检查

    安装oracle软件时需要设置操作系统级别的用户限制,后期检查可以使用如下命令,方便问题的排查工作 linux: tail -15 /etc/security/limits.conf tail -30 ...

  8. redis在windows平台安装和启动

    官网: https://redis.io/ 中文网站:http://www.redis.net.cn/ 一.下载windows版本的redis 官网没有提供windows版本的下载,只有linux版本 ...

  9. spring集成ehcache本地缓存

    1.maven依赖 <!-- ehcache 相关依赖 --> <dependency> <groupId>net.sf.ehcache</groupId&g ...

  10. BZOJ3999:[TJOI2015]旅游(树链剖分)

    Description 为了提高智商,ZJY准备去往一个新世界去旅游.这个世界的城市布局像一棵树.每两座城市之间只有一条路径可 以互达.每座城市都有一种宝石,有一定的价格.ZJY为了赚取最高利益,她会 ...