第一节 简介
欢迎和我们一起来用以太坊开发构建一个去中心化电商 DApp! 我们将用区块链星际文件系统(IPFS)Node.js 和 MongoDB 来构建电商平台类似淘宝的在线电商应用, 卖家可以自由地出售商品, 买家可以自由地购物:
去中心化: 和淘宝或 eBay 不同, 我们把所有的商业逻辑和核心数据都放在以太坊区块链上, 这使 得它成为一个完全去中心化的应用和淘宝这样中心化的电商平台相比, 一个去中心化的 P2P 电商应用显然有其独特的价值至少你不用担心被平台封账户了
IPFS: 在以太坊上存储用于商品展示的图片和描述超文本十分昂贵, 由于以太坊虚拟机的限制, 有时甚至是不可行的为了解决这个问题, 我们将会把商品图片和商品描述信息存储在同样去中心化的星际文件系统 (IPFS) 中, 而仅仅在链上保存这些数据的 ID
商品拍卖: 对于卖家而言, 拍卖显然是一种非常好的提升商品利润空间的销售手段因此我们在课程项目中将实现去中心化环境下的维科瑞 (Vickery) 拍卖 这非常类似于 eBay 的自动竞价系统, 而不是简单地对商品进行固定标价
资金托管: 中心化的平台有一个优点在于它天然提供了买卖双方之间的信任中介在去中心化的环境中, 我们将使用一个多方托管合约来应对买卖双方可能的风险, 托管合约采用投票机制来决定买家货款的最终流向
链下数据存储: 不要被去中心化限制我们的思维, 传统的技术依然有其强大之处我们将使用 MongoDB 在链下做一个同步的数据备份, 以便实现单纯用区块链很难实现的功能: 灵活的商品查询
第二节 去中心化, why?
在开始构建我们的应用之前, 非常值得花一分钟时间, 来理解为什么要在像以太坊这样的去中心化平台上搭建在线卖场
eBay 或淘宝这样的 C2C 电商平台已经获得了巨大成功, 因为它使得买卖双方都相当便利:
在互联网成为主流之前, 人们只能在小范围内或者在邻里之间买卖商品当越来越多的人使用互联网, 出现了像 eBay 这样的平台, 无论来自世界的任何一个地方, 你都可以在网上买卖商品无论是商家还 是消费者, 这样的平台都有其价值
尽管 eBay 这样的平台方便了大家, 也改善了贸易和经济, 但它也存在一些缺点:
被平台束缚参与的商家受制于拥有平台的企业在任何时候, 平台拥有者可以自行决定在是否对某个商家进行封号处理, 而如果商家严重依赖于平台, 那么账号被封就是一个巨大的打击
商家费用高商家上架商品要交费, 售出商品也要交佣金收费本身并没有错, 毕竟 eBay 这样的平台提供了服务但是, 上架费有时太高了, 这导致商家最后盈利很少, 或是将成本转嫁到消费者身上
数据失控商家或消费者都无法拥有本应属于自己的数据评论购买历史等等所有数据都为平台拥有者所有比如, 如果一个商家想要换一个提供商, 或者想要导出商品评论或是其他数据都非常不容易, 甚至不可能
在以太坊上构建的去中心化电商平台就解决了这些问题: 商家的账户不会被封; 数据也是公开的, 所以很容易导出数据; 相对于中心化的平台, 交易佣金也会低得多
第三节 初步的功能特性
现在你应该已经理解了为什么要构建去中心化的电商应用, 也了解了我们要构建的应用是什么, 现在让我们来大致看一下, 在这个项目中将要实现的主要功能特性:
商品上架: 应用应该支持卖家上架商品进行销售我们将实现让任何人自由上架商品的功能
商品浏览与搜索: 应用应该支持买家方便地浏览商品列表我们会实现浏览商品的功能, 以及基于商品类别拍卖时间等条件进行查询的功能
商品拍卖: 跟 eBay 一样, 我们会实现维科瑞拍卖方式的商品竞价销售由于以太坊上的一切交易都是公开的, 因此我们的实现将会与中心化环境下有所不同
资金托管: 一旦出价结束, 商品拍卖有了赢家以后, 我们会创建由胜出的买方卖方和任意第三方参与的托管合约, 由托管合约来管理交易资金
托管资金保护: 为了保护托管资金, 我们将采用多重签名 (2/3) 来实现防欺诈保护, 即三个参与者有两个同意时, 才会将托管资金释放给卖方, 或是将托管资金返还给买方
为了便于查询, 我们会将商品数据同时存在链上和链下(数据库); 同时, 为了避免图片等数据占用昂贵的链上存储, 我们将把图片和商品描述信息上传到同样去中心化的 IPFS 网络
第四节 基础知识要求
为了顺利地完成本课程的学习, 你应该对以下语言 / 技术有一些了解:
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://t.cn/RnmDmaD
来源: https://www.cnblogs.com/helloworld2018/p/8676484.html