Solidity远程购买示例学习笔记
该示例中买家支付并确认交易后,交易进入锁定状态,待买家确认收货后,交易完成,合约将退回押金给买家和转账交易金额给卖家。其中在不同的交易环节过程中会触发不同的事件发生。
与中心化交易相比,由于失去了类似某宝的中间人角色,需要在交易中添加对买卖双方的保障:
- 对于买方而已,在支付交易金额后,交易会进入锁定状态,交易金额会被冻结,只有在买家确认满意收货后,卖方才会收到货款;
- 对于卖方而已,买方需要在支付交易金额的同时多支付一倍的押金,俗称“买一押一”,同时卖方可以根据情况在交易锁定前提出取消交易。
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远程购买示例学习笔记相关推荐
- android studio 远程调试,Unity3D学习笔记——Android远程真机调试(Unity Remote)
前言:当使用Unity开发移动端的游戏,特别是使用到手机的传感器,如重力感应等,调试的时候,很麻烦, 因为每次都需要编译成APK后安装到手机中测试,而Unity Remote便能很好的解决这个问题,U ...
- zkcli远程连接_ZooKeeper 学习笔记(二)-API 操作和应用
客户端 znode 可能含有数据,也可能没有.如果 znode 包含数据,那么数据存储为字节数组(byte array).字节数组的具体格式特定于每个应用的实现,ZooKeeper 不直接 提供解析支 ...
- 《利用python进行数据分析》第二版 第14章-数据分析示例 学习笔记1
文章目录 一.从Bitly获取1.USA.gov数据 纯python下对时区进行计数 利用pandas对时区进行计数 二.MovieLens 1M数据集 测量评分分歧 三.美国1880~2010年的婴 ...
- 高德地图 Web JS API示例学习笔记(11)——覆盖物(矢量图形)
文章目录 矢量图形 折线的绘制和编辑 多边形的绘制和编辑 矩形的绘制和编辑 圆的绘制和编辑 绘制矢量图形(重点) 带洞多边形 遮罩 GeoJSON(重点) 自定义折线方向箭头 矢量图形 折线的绘制和编 ...
- 高德地图 Web JS API示例学习笔记(3)——地图(三维地图)
文章目录 三维地图 3D地图 区域掩膜 三维地图 3D地图 map = new AMap.Map('container', {resizeEnable: true,rotateEnable: true ...
- 高德地图 Web JS API示例学习笔记(1)——地图(生命周期、地图属性)
文章目录 生命周期 地图的创建 异步加载地图 地图属性 获取地图中心点/级别 设置地图中心点/级别 获取地图当前行政区属性信息 设置地图当前行政区 设置/获取地图显示范围 限制地图显示范围 地图的平移 ...
- Git 学习笔记:自定义Git(完)
前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...
- Git学习笔记:标签管理以及GItHub
前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...
- Git学习笔记:分支管理3
前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...
最新文章
- 比AlphaGo Zero更强的AlphaZero来了!8小时解决一切棋类! PENG Bo
- 今天有了自己得博客,心情不错。
- 未来网络发展的趋势——IPv6详细讲解与基本配置
- 如何关闭SAP Fiori的病毒扫描设置
- pandas string funcs
- JAVA 反射 动态获取类,并调用方法
- Flink CDC 系列 - 构建 MySQL 和 Postgres 上的 Streaming ETL
- Oracle在线撤销表空间,Oracle创建、管理撤销表空间
- 网络安全与管理精讲视频笔记4-数字信封、数字签名、完整性验证、数据加解密及身份认证流程...
- finclip小程序运行机制与微信小程序运行机制
- Adobe ——pdf文档加密且不可编辑
- 手把手教你如何做自媒体赚钱,揭开自媒体赚钱真相!记得收藏
- Ubuntu 16.04系统安装VS Code流程详解
- 【UE4】蓝图结构体入门及案例
- NPL系列之分词常用原则以及算法(三)
- 说一说我的java学习路途(记一个前端学习java日常)
- 俄罗斯方块、坦克大决战、雷电、魔法门、冒险岛——别告诉我你懂数组(0)...
- 解决前置音频接口无声音问题
- android c++ 线程,Android多线程分析之二:Thread的实现
- delmia机器人模型调入