基於Ethereum & IPFS的去中心化Ebay區塊鏈專案開發實戰

weixin_34124651發表於2018-10-07

轉載於:黎躍春老師

1. 介紹

1.1 eBay簡介

eBay,(EBAY,中文電子灣、億貝、易貝)是一個管理可讓全球民眾上網買賣物品的線上拍賣及購物網站。ebay1995年9月4日Pierre OmidyarAuctionweb的名稱創立於加利福尼亞州聖荷西。人們可以在ebay上通過網路出售商品。

1.2 本課程介紹

這是一箇中級水平的課程,您可以建立一個類似eBay的市場,在這個市場上賣家可以拍賣他們的產品,買家也可以通過拍賣來購買。

因為我們會將所有的業務邏輯和資料儲存在以太坊區塊鏈上,所以這將是一個完全去中心化的應用程式。與此同時,如果我們將所有的圖片和大量文字都儲存在以太坊區塊鏈上,這將非常昂貴,甚至由於以太坊EVM的一些限制,我們根本不可能將大量的圖片和文字儲存到區塊鏈。為了解決這個問題,我們將在IPFS(Inter Planetary File System)上儲存大量的文字和影像。我們將更多地瞭解IPFS並將其融入到本課程的應用中。

1.3 為什麼要去中心化

在我們開始構建應用程式之前,花一分鐘的時間來了解在像Ethereum這樣的去中心化平臺上構建產品的動機。

eBay取得了巨大的成功,因為它使得買賣非常有效率。在網際網路成為主流之前,人們只能在當地社群購買和出售商品,當然也可以在一定的地理範圍內購物。隨著越來越多的人上網,像eBay這樣的公司完全可以體驗整個線下購物拍賣的場景,任何人都可以在網際網路上從世界任何地方買賣任何東西。 eBay對於消費者和商人都具有劃時代的意義。

儘管這對大家都有好處,並且總體上改善了貿易和經濟,但是它有一些缺點。

  • 參與的商人都在受到公司的相關限制:公司可以隨時決定是否阻止商家自行處理交易,這對商人來說可能是一個巨大的打擊。

  • 商家支付費用列出他們的產品,並支付銷售佣金。付費本身並不是那麼糟糕,因為eBay提供服務。然而,上市費有時太高,商家要麼保證金很高,要麼把這筆費用交給消費者。

  • 商家/消費者不擁有他們的任何資料。評論、購買歷史等都是這些公司所有。例如,如果商家想將自己的操作轉移到另一個提供商,那麼匯出她的評論或其他資料是幾乎不可能的。

在以太坊這樣的平臺上構建產品解決了這些問題。商戶的賬戶不能被封鎖,資料是公開的,所以它可以很容易匯出,交易費用比中心化的公司少很多很多。

1.4 專案詳情

現在,您已經瞭解了構建此應用程式的原因以及為什麼要構建這個應用程式,接下來我們來看一個高階別的,我們將在此專案中實現的所有功能。

  • 專案展示:一個網站應該允許商家列出他們的專案。我們將為任何人建立免費列出他們的專案的功能。我們會將這些專案都儲存在區塊鏈和非區塊鏈的資料庫中,以方便查詢。

  • 將檔案新增到IPFS:我們將新增將產品影像和產品描述(大文字)上傳到IPFS的功能。

  • 瀏覽產品:我們將新增根據類別、拍賣時間等過濾和瀏覽產品的功能。

  • 拍賣:就像eBay,我們將實現維克裡拍賣(Vickrey auction),即次價密封投標拍賣(Second-price sealed-bid auction)對物品進行投標。因為以太坊上的一切都是公開的,不像中心化應用程式,所以我們的實現將有所不同。我們的實現將非常類似於ENS的招標流程。

  • 託管合約:一旦投標結束,產品有贏家,我們將在買方賣方第三方仲裁人之間建立一個託管合同。

  • 2-of-3 數字簽名:我們將通過實施2-of-3 數字簽名解決方案來增加欺詐保護,其中3名參與者中的2名必須投票將資金釋放給賣方或將金額退還給買方。

1.5 技術需求

要成功完成本課程,您應該對以下語言/技術有基本的瞭解:

  • Solidity物件導向程式設計:在講解這個專案之前,我們會先給大家講解Solidity物件導向程式設計基礎,如何編寫簡單合約,部署合約,合約簡單互動。

  • HTML/CSS/React:您應該對構建前端的HTML / CSS有基本的瞭解。

  • Javascript:我們在這個過程中廣泛使用JavaScript。它在伺服器端用於將資料儲存到資料庫並查詢資料庫並將結果返回到前端。前端使用Web3.js區塊鏈進行互動。我們盡力保持javascript程式碼儘可能簡單,以迎合不同背景的學生。

  • Database:我們將在本課程中使用MongoDB來儲存產品資訊。沒有必要特別瞭解MongoDB的知識,但是對這個過程需要對資料庫有基本的瞭解。

2. 專案架構

14298671-d914dc6f6bb9a729.png
eBay dapp 專案架構

在我們開始執行程式碼之前,讓我們來看看我們將在本課程中構建的Dapp的體系結構。

  • Web前端:Web前端是HTMLCSSJavascript的組合(大量使用web3js)。使用者將通過這個前端應用程式區塊鏈IPFSnodeJS伺服器互動

  • 區塊鏈:這是所有程式碼和交易所在的應用程式的心臟。商店中的所有產品使用者出價託管都寫在區塊鏈上。

  • MongoDB:儘管產品儲存在區塊鏈中,但是查詢區塊鏈展示產品應用各種過濾器(僅顯示特定類別的產品,顯示即將過期的產品等)效率並不高。我們將使用MongoDB資料庫來儲存產品資訊並查詢它以展示產品。

  • NodeJS伺服器:這是前端通過其與資料庫進行通訊的後端伺服器。我們將公開一些簡單的API來為前端查詢和從資料庫中檢索產品。

  • IPFS:當使用者在商店中列出商品時,前端會將產品檔案和描述上傳到IPFS,並將上傳檔案的雜湊HASH儲存到區塊鏈中。

3. 應用程式流

14298671-3f0eeeb920f37880.png
應用程式流

為了理解我們在前面部分中看到的所有元件,讓我們看看使用者列出專案時的應用程式流程。這將使您更好地瞭解所有元件如何協同工作。

  • Web前端將包含一個HTML表單,使用者可以在其中輸入產品詳細資訊(名稱,起始價格,影像,說明等)並點選儲存 ①。

  • 網路前端將產品影像和產品描述上傳到IPFS,並獲取這些上傳資料的連結。 ② 和 ③。

  • 網頁前端然後呼叫合約將產品資訊 + IPFS連結儲存到區塊鏈上。在成功將產品新增到區塊鏈中時,合約會觸發事件,該事件會返回所有產品資訊。 ④ 和 ⑤。

  • NodeJS伺服器設定為監聽這些事件,當事件被合約觸發時,伺服器讀取事件的內容並將產品插入到MongoDB中。 ⑥,⑦ 和 ⑧。

當我們實現這些功能時,我們將繼續討論剩下的應用程式流程。

4. 實現步驟

  • 先通過truffle frameworkSolidity實現合約程式碼,並將其部署到truffle develop自帶的測試網路中,並且在truffle console中可以自由互動。

  • 然後我們將學習IPFS,通過命令列安裝並與之互動。

  • 在後端實現完成後,我們將構建Web前端以與合約和IPFS進行互動。我們也會實現招標,揭示前端的拍賣功能。

  • 我們將安裝MongoDB設計資料結構來儲存產品。

  • 資料庫啟動並執行後,我們將實現監聽合約事件的NodeJS伺服器端程式碼,並將請求記錄到控制檯。然後我們將執行程式碼將產品插入資料庫。

  • 我們將更新我們的前端,從資料庫而不是區塊鏈中查詢產品。

  • 我們將實現託管合同相應的前端,參與者可以向買方/賣方發放或退款。

5. 以太坊智慧合約(Ethereum Contract)

  1. Truffle Project
  2. 電子商務產品(Ecommerce Product)智慧合約
  3. 從區塊鏈中新增和檢索產品
  4. 控制檯互動
  5. eBay拍賣
  6. 密封拍賣
  7. 揭標
  8. Contract Code
  9. 控制檯互動

6. IPFS

  1. IPFS安裝配置
  2. API 介紹
    • ipfs
    • ipfs-api
    • interface-ipfs-core
  3. demo演示
    • 直接在終端和IPFS互動
    • 建立一個節點並向IPFS新增一個檔案
    • 部署個人獨立部落格到IPFS
    • 建立一個瀏覽器APP來在節點之間交換檔案
    • dag API
    • IPFS + Ethereum BlockChain
    • 如何使用IPFS PubSub Room構建應用程式
    • 如何使用CRDTIPFS建立協作編輯應用程式

7. Web前端 - Product

  1. 概述
  2. 設定上傳到區塊鏈的種子資料
  3. HTML/React 設定
  4. 渲染產品
  5. 展示產品列表
  6. 實現產品提交表單
  7. 上傳表單資料到IPFS
  8. 儲存

8. Web前端 - 拍賣

  1. React 前端
  2. JS 實現拍賣邏輯
  3. 鎖定和顯示出價

9. 託管服務(Escrow Service)

  1. 概述
  2. 託管智慧合約(Escrow Contract)
  3. 宣告獲勝者
  4. 發行資金

10. 產品離線(Products Offchain)

  1. 概述
  2. MongoDB設定
  3. 產品定義
  4. NodeJS app 設定
  5. Solidity Events
  6. 儲存產品
  7. 檢視產品

11. 專案效果

14298671-230f0ade56ebd1af.png
image
14298671-3a08b6b00e0a5281.png
image
14298671-72c05cd683251982.png
image
14298671-18d4e764d77736c5.png
image
14298671-075e34c43e0a67bf.png
image
14298671-cf1f312a4ac28d42.png
image
14298671-db3e35ec953a526a.png
image
14298671-624f1c58548504ed.png
image
14298671-71ee219a6ab742ad.png
image
14298671-db2548c76550a53a.png
image

12. 技術交流

相關文章