第一节 简介
欢迎和咱们一块儿来用以太坊开发构建一个去中心化电商DApp!咱们将会构建一个相似淘宝的在线电商应用,卖家能够自由地出售商品,买家能够自由地购物:css

- 去中心化: 和淘宝或eBay不一样,咱们把全部的商业逻辑和核心数据都放在以太坊区块链上,这使 得它成为一个彻底去中心化的应用。和淘宝这样中心化的电商平台相比,一个去中心化的P2P电商应用显然有其独特的价值——至少你不用担忧被平台封帐户了。
- IPFS: 在以太坊上存储用于商品展现的图片和描述超文本十分昂贵,因为以太坊虚拟机的限制, 有时甚至是不可行的。为了解决这个问题,咱们将会把商品图片和商品描述信息存储在一样去中心化的星际文件系统(IPFS)中,而仅仅在链上保存这些数据的ID。
- 商品拍卖: 对于卖家而言,拍卖显然是一种很是好的提高商品利润空间的销售手段。所以咱们在课程项目中将实现去中心化环境下的维科瑞(Vickery)拍卖 —— 这很是相似于eBay的自动竞价系统,而不是简单地对商品进行固定标价。
- 资金托管: 中心化的平台有一个优势在于它自然提供了买卖双方之间的信任中介。在去中心化的环境中,咱们将使用一个多方托管合约来应对买卖双方可能的风险,托管合约采用投票机制来决定买家货款的最终流向。
- 链下数据存储: 不要被去中心化限制咱们的思惟,传统的技术依然有其强大之处。咱们将使用MongoDB在链下作一个同步的数据备份,以便实现单纯用区块链很难实现的功能:灵活的商品查询。
课程地址:http://xc.hubwiz.com/course/5abbb7acc02e6b6a59171dd6html
第二节 去中心化,why?
在开始构建咱们的应用以前,很是值得花一分钟时间,来理解为何要在像以太坊这样的去中心化平台上搭建在线卖场。前端
eBay或淘宝这样的C2C电商平台已经得到了巨大成功,由于它使得买卖双方都至关便利:web

在互联网成为主流以前,人们只能在小范围内、或者在邻里之间买卖商品。当愈来愈多的人使用互联网, 出现了像eBay这样的平台,不管来自世界的任何一个地方,你均可以在网上买卖商品。不管是商家还 是消费者,这样的平台都有其价值。mongodb
尽管eBay这样的平台方便了你们,也改善了贸易和经济,但它也存在一些缺点:数据库
- 被平台束缚。参与的商家受制于拥有平台的企业。在任什么时候候,平台拥有者能够自行决定在是否对某个商家进行封号处理,而若是商家严重依赖于平台,那么帐号被封就是一个巨大的打击。
- 商家费用高。商家上架商品要交费,售出商品也要交佣金。收费自己并无错,毕竟eBay这样的平台提供了服务。可是,上架费有时过高了,这致使商家最后盈利不多,或是将成本转嫁到消费者身上。
- 数据失控。商家或消费者都没法拥有本应属于本身的数据。评论、购买历史等等全部数据都为平台拥有者全部。好比,若是一个商家想要换一个提供商,或者想要导出商品评论或是其余数据都很是不容易,甚至不可能。
在以太坊上构建的去中心化电商平台就解决了这些问题:商家的帐户不会被封;数据也是公开的,因此很容易导出数据;相对于中心化的平台,交易佣金也会低得多。后端
第三节 初步的功能特性
如今你应该已经理解了为何要构建去中心化的电商应用,也了解了咱们要构建的应用是什么,如今让咱们来大体看一下,在这个项目中将要实现的主要功能特性:服务器

- 商品上架:应用应该支持卖家上架商品进行销售。咱们将实现让任何人自由上架商品的功能。
- 商品浏览与搜索:应用应该支持买家方便地浏览商品列表。咱们会实现浏览商品的功能,以及基于商品类别、拍卖时间等条件进行查询的功能。
- 商品拍卖:跟eBay同样,咱们会实现维科瑞拍卖方式的商品竞价销售。因为以太坊上的一切交易都是公开的,所以咱们的实现将会与中心化环境下有所不一样。
- 资金托管:一旦出价结束,商品拍卖有了赢家之后,咱们会建立由胜出的买方、卖方和任意第三方参与的托管合约,由托管合约来管理交易资金。
- 托管资金保护:为了保护托管资金,咱们将采用多重签名(2/3)来实现防欺诈保护,即三个参与者有两个赞成时,才会将托管资金释放给卖方,或是将托管资金返还给买方。
为了便于查询,咱们会将商品数据同时存在链上和链下(数据库);同时,为了不图片等数据占用昂贵的链上存储,咱们将把图片和商品描述信息上传到一样去中心化的IPFS网络。网络
课程地址:http://xc.hubwiz.com/course/5abbb7acc02e6b6a59171dd6架构
第四节 基础知识要求
为了顺利地完成本课程的学习,你应该对如下语言/技术有一些了解:
- Solidity/Truffle:课程将会深刻使用solidity来编写合约。若是你尚未学过,建议你先学习一下以太坊开发DApp入门教程,这样至少写过一两个简单的合约。同时,对truffle开发框架的基本了解也会十分有助于完成本课程。

- HTML/CSS/JavaScript:相比入门课程,本课程将会有更多的HTML和CSS代码。你应该对使用HTML/CSS构建前端有基本的了解。同时,咱们将会进一步使用JavaScript。它会在服务端将数据保存到数据库,查询数据库并将结果返回给前端。web3.js用于前端与区块链的交互。为了适用各类背景的学习者,咱们已经保持JavaScript代码尽量地简单。

- Database:咱们会用MongoDB在链下保存产品信息。无须特别了解MongoDB,可是基本的数据库知识有助于你顺利完成本课程的。

第五节 系统架构
在开始着手具体的实现以前,先来看一下在本课程咱们将要构建的去中心化电商DApp的架构。

- Web前端:web前端使用HTML/CSS/JavaScript开发,其中大量使用了web3js来访问区块链。用户将会经过这个前端应用来访问以太坊、IPFS和NodeJS服务器。
- 以太坊区块链:这是去中心化应用的核心,全部的代码(电商合约、资金托管合约)和交易都存储在链上,这包括全部的商品信息、买家的出价信息、商品竞价结果、资金流向投票结果等。
- MongoDB:尽管核心数据存储在区块链上,可是为了方便买家对商品的检索和查询,例如只显示某一类的商品,或者显示即将过时的商品等等,咱们会用MongoDB数据库来同步地存储和检索商品信息。
- NodeJS服务器:这是后端服务器,咱们会利用它给前端提供REST风格的API来查询商品, 同时,也利用它来响应对前端静态页面的请求。
- IPFS: 当卖家上架一个商品时,前端会商品图片文件和介绍文本上传到IPFS,并将所上传文件的哈希值存到链上。
第六节 理解架构的做用
为了帮助理解上一节谈到的那些组件的做用,让咱们来看看一下卖家上架一个商品的流程:

- (1)前端使用一个HTML表单来采集用户输入的商品细节,例如起拍价、商品图片、描述信息等。
- (2)(3) 前端将商品图片和介绍文本上传到IPFS,并返回所上传内容对应的连接(哈希)。
- (4)(5) 而后,web前端会调用电商合约将商品信息和IPFS连接存储到链上。当合约成功地将商品存入区块链后,就会触发一个事件,该事件中包含了商品全部的信息。
- (6)(7)(8) NodeJS服务器监听区块链事件,当事件被电商合约触发时,服务器读取事件内容并将商品信息插入到MongoDB数据库中。
当开始具体实现商品上架这一特性时,咱们将重温这一流程。
第七节 敏捷开发
咱们将采用敏捷开发的思想来实现去中心化电商DApp:

咱们将所有的产品特性分别列入8个迭代周期,经过每一次的冲刺(sprint),咱们都将获得一个能够发布的版本:
前两个冲刺主要集中在使用solidity和truffle框架实现电商合约方面,这包括合约的设计、开发 、编译、部署与测试:
- sprint-1:实现电商合约的商品上架和展现方法。
- sprint-2:实现电商合约的商品竞价和出价揭示方法。
在电商合约基本实现以后,接下来的三个冲刺主要集中在前端用户界面的构建方面,这包括使用web3 与合约的交互,以及经过ipfs的开发接口上传图片等数据交互,固然,还有必不可少的DOM操做:
- sprint-3:为买家提供商品浏览界面。
- sprint-4:为卖家提供商品上架操做界面。
- sprint-5:为买家提供商品详情界面、竞价表单以及出价揭示表单。在接下来的两个冲刺里,咱们将首先实现资金托管合约,用来管理竞价结束后胜出买家的资金;而后实现相应的用户操做界面。
- sprint-6:实现资金托管合约。
- sprint-7:基于资金托管合约,为参与托管各方提供操做界面。最后,为了便于商品的查询检索,咱们将使用MongoDB来实现商品数据的链下存储。
- sprint-8:实现链下数据的同步与数据查询。
课程地址:http://xc.hubwiz.com/course/5abbb7acc02e6b6a59171dd6