在當今的中國,網上購物已經成為了我們不可或缺的一部分,通過電商網站檢視商品,下單購物,支付,付款到支付寶,買家收貨确認後,貨款自動打入賣家的賬戶,這些購物的體驗多數人每天都可能發生。大家都知道,淘寶的背後是阿裡巴巴這樣的中心化機構操控,賣家在淘寶開C店,開天貓需要經過淘寶,要交押金,交維護費用,推廣商品也是需要交費的,,羊毛自然出在羊身上,這些費用又會通過商品價格轉移到消費者的身上,加大了顧客的負擔。我們來看看通過區塊鍊實作的去中心化的購物功能。下面我們先從淘寶購物流程進行分析,再來設計一下去中心化購物流程的實作。
淘寶購物核心流程分析
我們通過在淘寶一次購物來分析一下整個購物流程,以及相關的角色,包括買家,賣家,以及淘寶,我們把淘寶認為是一個中心化的組織。
我們先看看買家主要的操作流程,如下圖所示:
買家檢視商品,選好商品下訂單購物,支付商品的費用,由淘寶進行保管。
買家線下收貨,确認收貨後,通過通知淘寶,完成購物。
再看看賣家銷售的流程,如下圖所示:
賣家接收訂單後,線下發貨,通知淘寶,更新訂單狀态,待客戶收貨後,接收貨款。
淘寶承擔的工作,如下圖所示:
網上購物時,電商作為中心化的組織,主要為買家提供付款保管作用。待買家确認收貨後,将的付款,發送給賣家。其實承擔的工作也比較簡單,但卻是電商網站最核心的功能。
去中心化購物應用設計
由上面的分析,我們不難發現,電商購物網站是一個中心化應用,其主要的功能為買賣雙方提供一個付款監管的,讓買賣雙方都能按照購物規則完成購物和銷售。通過電商平台進行商品的銷售,因為有了一個中心化的組織,使得我們網上購物有了一個保證,保證了我們資金安全和貨品的安全,與此同時也增加了商品的費用。
那麼我們有沒有一種去中心化的購物網站,答案當然是有的,要不筆者也不會寫這篇文章。基于以太坊區塊鍊開發去中心化的購物應用,可以很好地解決我們遇到的問題,降低商品銷售的成本,進而降低商品的價格。
區塊鍊的特性公開透明,不可抵賴,不可篡改。運作在區塊鍊上的智能合約,就行法律一樣的程式代碼,讓我們得訂立的條文,寫到合約上,釋出後不可篡改,這樣的特性保證我們得資金更加的安全。
我們現在考慮使用以太坊的智能合約來實作電商網站所承擔的職能:
- 買方下訂單,支付後,合約對付款進行監管,買方不能再操控付款。
- 待買家收貨确認後,把貨款發送給賣方。
- 買賣交易通過ether币作為貨币。需要首先把商品的價格轉換為以太币相應的價值。
智能合約的購物實作
pragma solidity^0.4.22; contractProductsales { uint public price; uint public amount ; address public seller; address public buyer; enum State { Created, Locked, Inactive} State public state; // 合約建立者為賣家 constructor(uint productPrice) publicpayable { seller = msg.sender; price =productPrice; } 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 () public payable { require( msg.value == price, "請按商品價格付款!" ); emit PurchaseConfirmed(); buyer = msg.sender; state = State.Created; } /// 取消購物取回以太币 /// 隻允許買家通路,隻有賣家未發貨之前可以通路. function abort() public onlyBuyer inState(State.Created) payable { emit Aborted(); state = State.Inactive; buyer.transfer(price); } /// 确認收貨,發送貨款到賣家 function confirmReceived() public onlyBuyer inState(State.Locked) payable { emit ItemReceived(); // 防止‘send’方法被再次調用,首先設定state。這一步非常重要。 state = State.Inactive; // 賣家提取貨款 seller.transfer(address(this).balance); } |
合約主要實作了商品支付的監管,買家支付後費用先儲存在合約賬戶,訂單确認收貨後,支付貨款才發送給賣家,因為智能合約一經釋出即不可修改,進而保證了合約按既定的購物規則執行,保證買賣雙方的利益。
去中心化應用的前端與WEB應用前端相似,前端設計就忽略過了。
總結:本文介紹了去中心化購物應用的設計思路,使用以太坊智能合約實作,訂單支付,貨款保管,訂單确認後支付貨款給賣家,這些中心化組織承擔的核心的功能。應用前端的設計和開發和web應用前端相似,本文就不多介紹。智能合約的部份代碼作了簡化,實際的業務場景可能會複雜很多,主要提供一個開發購物應用的思路,希望給讀者啟到抛轉引玉的作用。
參考:以太坊官方文檔。
歡迎加公衆号一起交流。