区块链实现简单的电商交易(以太坊)

一、流程如下:
1、买家下单
2、卖家接单
3、买家付押金
4、卖家付押金
5、卖家发出货物
6、运输方甲收到货物
7、运输方甲送到货物
8、运输方乙收到货物
9、运输方乙送到货物
10、买家收到货物

二、将以上规则写入编译合约sol文件

/*
This is a simple showcase smart contract example for trade finance / supply chain interactions.
It could be improved in several ways:
- add timeouts for state reversal (e.g. object is released by one party but not accepted by next)
= add escrow payments also for carriers, otherwise they can block forever
- add delivery dates for carriers, if not met their escrow balance will be punished
- add insurance interface for, e.g. transport delay or damage insurance
*/

contract TradeHandler {
    address public seller;
    address public carrier1;
    address public carrier2;
    address public buyer;
    uint public purchasePrice;
    uint public carrier1Fee;
    uint public carrier2Fee;

    enum WaitingFor {
        BuyerEscrowPayment,
        SellerEscrowPayment,
        SellerRelease,
        Carrier1Accept,
        Carrier1Release,
        Carrier2Accept,
        Carrier2Release,
        BuyerAccept,
        Completed
    }

    WaitingFor state;

    // constructor sets all actors and fees
    function TradeHandler(
        address _seller,
        address _carrier1,
        address _carrier2,
        uint _carrier1Fee,
        uint _carrier2Fee,
        uint _purchasePrice)
    {
        buyer = msg.sender;
        seller = _seller;
        carrier1 = _carrier1;
        carrier2 = _carrier2;
        carrier1Fee = _carrier1Fee;
        carrier2Fee = _carrier2Fee;
        purchasePrice = _purchasePrice;
    }

    function reset(
        address _seller,
        address _carrier1,
        address _carrier2,
        uint _carrier1Fee,
        uint _carrier2Fee,
        uint _purchasePrice)
    {
        // only allow recylcing of contract if previous trade is completed
        if (state != WaitingFor.Completed)
            throw;
        buyer = msg.sender;
        seller = _seller;
        carrier1 = _carrier1;
        carrier2 = _carrier2;
        carrier1Fee = _carrier1Fee;
        carrier2Fee = _carrier2Fee;
        purchasePrice = _purchasePrice;
    }

    function () payable {

        // todo: one could check for timeouts and revert transitions if required

        // once trade is completed, do not allow further interaction
        if (state == WaitingFor.Completed)
            throw;

        // each actor is only responsible for their respective state transfer, reject all others
        if (msg.sender == buyer && state != WaitingFor.BuyerEscrowPayment && state != WaitingFor.BuyerAccept)
            throw;
        if (msg.sender == seller && state != WaitingFor.SellerEscrowPayment && state != WaitingFor.SellerRelease)
            throw;
        if (msg.sender == carrier1 && state != WaitingFor.Carrier1Accept && state != WaitingFor.Carrier1Release)
            throw;
        if (msg.sender == carrier2 && state != WaitingFor.Carrier2Accept && state != WaitingFor.Carrier2Release)
            throw;

        // make sure that the right amounts are being paid into this escrow contract by buyer and seller
        if (state == WaitingFor.BuyerEscrowPayment && msg.value != 2 * purchasePrice + carrier1Fee + carrier2Fee)
            throw;
        if (state == WaitingFor.SellerEscrowPayment && msg.value != purchasePrice)
            throw;

        // perform state transitions
        if (state == WaitingFor.BuyerEscrowPayment)
            state = WaitingFor.SellerEscrowPayment;
        else if (state == WaitingFor.SellerEscrowPayment)
            state = WaitingFor.SellerRelease;
        else if (state == WaitingFor.SellerRelease)
            state = WaitingFor.Carrier1Accept;
        else if (state == WaitingFor.Carrier1Accept)
            state = WaitingFor.Carrier1Release;
        else if (state == WaitingFor.Carrier1Release)
            state = WaitingFor.Carrier2Accept;
        else if (state == WaitingFor.Carrier2Accept) {
            state = WaitingFor.Carrier2Release;
            carrier1.send(carrier1Fee);
        } else if (state == WaitingFor.Carrier2Release)
            state = WaitingFor.BuyerAccept;
        else if (state == WaitingFor.BuyerAccept) {
            state = WaitingFor.Completed;
            carrier2.send(carrier2Fee);
            seller.send(2 * purchasePrice);
            buyer.send(purchasePrice);
        }
    }
}

  注:以上需要转换成新版的sol文件

三、操作:

如下图所示:

参考:https://github.com/validitylabs/TradeManager

原文地址:https://www.cnblogs.com/windel/p/9192703.html

时间: 2024-10-09 03:27:08

区块链实现简单的电商交易(以太坊)的相关文章

区块链应用:php如何开发一个以太坊支付系统

当我第一次考虑通过加密货币实施支付时,我查看了像Stripe这样的可用解决方案.我觉得Stripe的问题在于,它只允许使用美国商家帐户进行比特币支付,所以这对我来说不是一个选择.在以太坊世界,它看起来更糟糕.有一些较新的服务,但他们都想要分享蛋糕. 那么从头开始构建以太坊支付系统,我们需要什么? 运行PHP的Web服务器. 启用了RPC的专用网络中至少有一个Parity节点. 网络服务器上的虚拟地址生成器,如vanity-eth. 那它是如何工作的? 使用coinbase或kraken API中

京东如何打造K8s全球最大集群支撑万亿电商交易

在过去一年里,Kubernetes以其架构简洁性和灵活性,流行度持续快速上升,我们有理由相信在不远的未来,Kubernetes将成为通用的基础设施标准.而京东早在2016年年底上线了京东新一代容器引擎平台JDOS2.0,成功从Openstack切换到JDOS2.0的Kubernetes技术栈,打造了完整高效的PaaS平台. 6月28日京东基础架构部技术总监.集群技术部负责人鲍永成受邀出席了Rancher Labs举办的Container Day 2018容器技术大会,并做了题为<京东如何打造ku

电商交易背景知识合集第一季

郑昀编纂 基于网络资料 创建于2015/9/7 最后更新于2015/9/7 特别感谢知乎梁川.天顺等知乎网友的精彩答案 本文档适用人员:交易领域的产品研发人员 提纲: 银联 一些错综复杂的关系 银联是什么 银联商务是什么 快捷支付绕过银联了吗 能通过卡号判断是对公账户或对私账户吗 快捷支付 为什么要推快捷支付 POS POS签单上的各种号码 信用卡刷卡后都发生了什么 第三方支付公司 为什么需要有备付金 直联网关和间联网关 何谓银企直连 支付宝是怎么对账的 我们作为商户如何接入 预付费卡牌照与第三

转: 电商交易中支付相关知识

from: http://www.cnblogs.com/zhengyun_ustc/p/paybg.html 评点: 实在是长见识, 全干货!!!谢谢原作者 郑昀编纂 基于网络资料 创建于2015/9/7 最后更新于2015/9/7 特别感谢知乎梁川.天顺等知乎网友的精彩答案 关键词:在线支付,POS,第三方支付,清算,银企直连,快捷支付,对公对私,支付宝,对账,App 本文档适用人员:交易领域的产品研发人员 提纲: 银联 一些错综复杂的关系 银联是什么 银联商务是什么 快捷支付绕过银联了吗

电商交易数据分析

1.分析目的:根据过往电商成交数据进行数据分析发现规律和问题从而指导业务 2.数据 导入库 导入数据 加载好数据之后,第一步先分别使用describe和info方法看下数据的大概分布 加载device_type 3.数据清洗 orderId orderId在一个系统里是唯一值 先看下有没有重复值 如果有重复值一般最后处理,因为其他的列可能会影响到删除哪一条重复的记录 先处理其他的列 userId userId只要从上面的describe和info看下值是不是在正常范围就行 对于订单数据,一个用户

用JS做一个简单的电商产品放大镜功能

使用js制作一个简单的产品放大图 购物网站的产品页经常会放有一个产品展示图区.该图区有一个功能就是产品图的放大功能,移动左侧的焦点区域,可以放大细节部分观看,详情如下图.实现该功能的方法也非常简单. 实验:制作产品焦点放大图. 所需技能:1.基本的获取页面元素的方法: 2.几个简单的事件: 3.会使用dom设置元素的属性: 案例原理:1.焦点框的跟随鼠标事件: 2.焦点框的移动区域规定: 3.大盒子内容的显示: 适合对象:js初学者 -------------------------------

区块链+跨境支付市场空间可期 新的代币生态空间正形成

跨境电商支付这一规模不断增长的行业所隐藏的痛点正亟待解决. 而区块链带来的各类解决方案也让跨境电商交易主体们不断的想要"拥抱"区块链.现存的电商交易支付中主要存在三大问题亟待解决.首先,在跨境电商平台购物时,交易支付会产生高昂的手续费,这个手续费不单单针对消费者,商家在接收跨境付款时,也需要支付一定的费用. 第二是交易环节中的造假问题,交易记录和卖家反馈容易造假.商家和消费者都没有可靠记录,这使得索赔和诈骗纠纷通常很难解决:第三是现在的电商平台提供的信贷服务购物导致服务群体仍有限. 而

EOS和以太坊那个区块链平台更好?

显然,你已经听说过两个最受欢迎的智能合约区块链,但想知道EOS与以太坊之中哪个更好?或许你想比较一下两种技术?好吧,你来对了地方,因为我要告诉你你需要知道的一切! 在这个EOS vs Ethereum指南中,我将首先解释每个项目的基础知识,然后概述每个区块链的执行情况.这将包括交易时间,交易费用和可扩展性等内容. 之后,我将简要介绍如何在没有第三方的情况下验证交易.这将包括以太坊使用的工作量证明(Proof of Work)与EOS使用的股份授权证明(Delegated Proof of Sta

区块链的跨链技术介绍完整版

如果说共识机制是区块链的灵魂核心,那么对于区块链特别是联盟链及私链来看,跨链技术就是实现价值网络的关键,它是把联盟链从分散单独的孤岛中拯救出来的良药,是区块链向外拓展和连接的桥梁. 自比特币七年前诞生以来,数以百计的竞争币被开发出来,有着各种新的优势和特性,但比特币的霸主地位依然屹立不倒,而很多复制竞争币却湮灭在历史中.虽然比特币有不少缺点和限制,但比特币却又是最去中心化.最多分布节点.最公平区块链,从数字货币地位.节点数量.去中心的权威等方面比特币还是很有优势.同时,类似以太坊.比特股的区块链