该示例中买家支付并确认交易后,交易进入锁定状态,待买家确认收货后,交易完成,合约将退回押金给买家和转账交易金额给卖家。其中在不同的交易环节过程中会触发不同的事件发生。

与中心化交易相比,由于失去了类似某宝的中间人角色,需要在交易中添加对买卖双方的保障:

  • 对于买方而已,在支付交易金额后,交易会进入锁定状态,交易金额会被冻结,只有在买家确认满意收货后,卖方才会收到货款;
  • 对于卖方而已,买方需要在支付交易金额的同时多支付一倍的押金,俗称“买一押一”,同时卖方可以根据情况在交易锁定前提出取消交易。


pragma solidity ^0.4.21;//定义变量:押金、卖家、买家、交易状态
contract Purchase {uint public value;address public seller;address public buyer;enum State { Created, Locked, Inactive }State public state;//押金方式设置为"押一付一",即对应value = msg.value / 2//确保 `msg.value` 是一个偶数。如果它是一个奇数,则它将被截断function Purchase() public payable {seller = msg.sender;value = msg.value / 2;require((2 * value) == msg.value);}//定义函数修饰符//条件状态、购买者确认、售卖者确认、交易状态确认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();///取消交易并回收以太币///只能在合约被锁定之前由卖家调用function abort()publiconlySellerinState(State.Created){emit Aborted();state = State.Inactive;seller.transfer(this.balance);}/// 买家确认购买/// 交易必须包含 `2 * value` 个以太币(押一付一)/// 以太币会被锁定,直到 confirmReceived 被调用function confirmPurchase()publicinState(State.Created)condition(msg.value == (2 * value))payable{emit PurchaseConfirmed();buyer = msg.sender;state = State.Locked;}/// 买家确认已经收到商品/// 退回买家押金/// 发送货款给卖家function confirmReceived()publiconlyBuyerinState(State.Locked){emit ItemReceived();// 首先修改状态很重要,否则的话,由 `transfer` 所调用的合约可以回调进这里(再次接收以太币)。state = State.Inactive;// 注意: 这实际上允许买方和卖方阻止退款 - 应该使用取回模式。buyer.transfer(value);seller.transfer(this.balance);}
}

文章参考
https://blog.csdn.net/qq_33829547/article/details/80377386

Solidity远程购买示例学习笔记相关推荐

  1. android studio 远程调试,Unity3D学习笔记——Android远程真机调试(Unity Remote)

    前言:当使用Unity开发移动端的游戏,特别是使用到手机的传感器,如重力感应等,调试的时候,很麻烦, 因为每次都需要编译成APK后安装到手机中测试,而Unity Remote便能很好的解决这个问题,U ...

  2. zkcli远程连接_ZooKeeper 学习笔记(二)-API 操作和应用

    客户端 znode 可能含有数据,也可能没有.如果 znode 包含数据,那么数据存储为字节数组(byte array).字节数组的具体格式特定于每个应用的实现,ZooKeeper 不直接 提供解析支 ...

  3. 《利用python进行数据分析》第二版 第14章-数据分析示例 学习笔记1

    文章目录 一.从Bitly获取1.USA.gov数据 纯python下对时区进行计数 利用pandas对时区进行计数 二.MovieLens 1M数据集 测量评分分歧 三.美国1880~2010年的婴 ...

  4. 高德地图 Web JS API示例学习笔记(11)——覆盖物(矢量图形)

    文章目录 矢量图形 折线的绘制和编辑 多边形的绘制和编辑 矩形的绘制和编辑 圆的绘制和编辑 绘制矢量图形(重点) 带洞多边形 遮罩 GeoJSON(重点) 自定义折线方向箭头 矢量图形 折线的绘制和编 ...

  5. 高德地图 Web JS API示例学习笔记(3)——地图(三维地图)

    文章目录 三维地图 3D地图 区域掩膜 三维地图 3D地图 map = new AMap.Map('container', {resizeEnable: true,rotateEnable: true ...

  6. 高德地图 Web JS API示例学习笔记(1)——地图(生命周期、地图属性)

    文章目录 生命周期 地图的创建 异步加载地图 地图属性 获取地图中心点/级别 设置地图中心点/级别 获取地图当前行政区属性信息 设置地图当前行政区 设置/获取地图显示范围 限制地图显示范围 地图的平移 ...

  7. Git 学习笔记:自定义Git(完)

    前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...

  8. Git学习笔记:标签管理以及GItHub

    前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...

  9. Git学习笔记:分支管理3

    前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...

最新文章

  1. 比AlphaGo Zero更强的AlphaZero来了!8小时解决一切棋类! PENG Bo
  2. 今天有了自己得博客,心情不错。
  3. 未来网络发展的趋势——IPv6详细讲解与基本配置
  4. 如何关闭SAP Fiori的病毒扫描设置
  5. pandas string funcs
  6. JAVA 反射 动态获取类,并调用方法
  7. Flink CDC 系列 - 构建 MySQL 和 Postgres 上的 Streaming ETL
  8. Oracle在线撤销表空间,Oracle创建、管理撤销表空间
  9. 网络安全与管理精讲视频笔记4-数字信封、数字签名、完整性验证、数据加解密及身份认证流程...
  10. finclip小程序运行机制与微信小程序运行机制
  11. Adobe ——pdf文档加密且不可编辑
  12. 手把手教你如何做自媒体赚钱,揭开自媒体赚钱真相!记得收藏
  13. Ubuntu 16.04系统安装VS Code流程详解
  14. 【UE4】蓝图结构体入门及案例
  15. NPL系列之分词常用原则以及算法(三)
  16. 说一说我的java学习路途(记一个前端学习java日常)
  17. 俄罗斯方块、坦克大决战、雷电、魔法门、冒险岛——别告诉我你懂数组(0)...
  18. 解决前置音频接口无声音问题
  19. android c++ 线程,Android多线程分析之二:Thread的实现
  20. delmia机器人模型调入

热门文章

  1. Arrays.asList缺陷
  2. 架构初探-谁动了我的蛋糕
  3. Linux下端口被占用解决
  4. java matcher函数_在Java正则表达式中使用Matcher.end()方法
  5. caffeine与guava cache
  6. 最长上升子序列(acwing 895 acwing 896 acwing1017)
  7. JavaScript 高性能数组去重
  8. 如何取得SQL中自增伴位的下一个值
  9. ng2 angular2 使用bootstrap框架
  10. manjaro增加虚拟内存(linux通用)