基于以太坊Ethereum & IPFS的去中心化Ebay区块链项目实战
1. 介绍
1.1 eBay简介
eBay
,(EBAY
,中文电子湾、亿贝、易贝)是一个管理可让全球民众上网买卖物品的线上拍卖及购物网站。ebay
于1995年9月4日
由Pierre Omidyar
以Auctionweb
的名称创立于加利福尼亚州圣荷西。人们可以在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. 项目架构
在我们开始执行代码之前,让我们来看看我们将在本课程中构建的Dapp的体系结构。
- Web前端:
Web
前端是HTML
,CSS
和Javascript
的组合(大量使用web3js
)。用户将通过这个前端应用程序
与区块链
,IPFS
和nodeJS服务器
交互。 - 区块链:这是所有代码和交易所在的应用程序的心脏。商店中的所有产品、用户出价和托管都写在区块链上。
- MongoDB:尽管产品存储在区块链中,但是查询区块链展示产品和应用各种过滤器(仅显示特定类别的产品,显示即将过期的产品等)效率并不高。我们将使用
MongoDB
数据库来存储产品信息并查询它以展示产品。 - NodeJS服务器:这是前端通过其与数据库进行通信的后端服务器。我们将公开一些简单的API来为前端查询和从数据库中检索产品。
- IPFS:当用户在商店中列出商品时,前端会将产品文件和描述上传到
IPFS
,并将上传文件的散列HASH存储到区块链中。
3. 应用程序流
为了理解我们在前面部分中看到的所有组件,让我们看看用户列出项目时的应用程序流程。这将使您更好地了解所有组件如何协同工作。
Web
前端将包含一个HTML
表单,用户可以在其中输入产品详细信息(名称,起始价格,图像,说明等)并点击保存 ①。- 网络前端将产品图像和产品描述上传到
IPFS
,并获取这些上传数据的链接。 ② 和 ③。 - 网页前端然后调用合约将产品信息 + IPFS链接存储到区块链上。在成功将产品添加到区块链中时,合约会触发事件,该事件会返回所有产品信息。 ④ 和 ⑤。
NodeJS
服务器设置为监听这些事件,当事件被合约触发时,服务器读取事件的内容并将产品插入到MongoDB
中。 ⑥,⑦ 和 ⑧。
当我们实现这些功能时,我们将继续讨论剩下的应用程序流程。
4. 实现步骤
- 先通过
truffle framework
和Solidity
实现合约代码,并将其部署到truffle develop
自带的测试网络中,并且在truffle console
中可以自由交互。 - 然后我们将学习
IPFS
,通过命令行安装并与之交互。 - 在后端实现完成后,我们将构建
Web
前端以与合约和IPFS
进行交互。我们也会实现招标,揭示前端的拍卖功能。 - 我们将安装MongoDB并设计数据结构来存储产品。
- 数据库启动并运行后,我们将实现监听合约事件的NodeJS服务器端代码,并将请求记录到控制台。然后我们将执行代码将产品插入数据库。
- 我们将更新我们的前端,从数据库而不是区块链中查找产品。
- 我们将实现托管合同和相应的前端,参与者可以向买方/卖方发放或退款。
5. 以太坊智能合约(Ethereum Contract)
- Truffle Project
- 电子商务产品(Ecommerce Product)智能合约
- 从区块链中添加和检索产品
- 控制台交互
- eBay拍卖
- 密封拍卖
- 揭标
- Contract Code
- 控制台交互
6. IPFS
IPFS
安装配置-
API
介绍ipfs
ipfs-api
interface-ipfs-core
-
demo
演示- 直接在终端和
IPFS
交互 - 创建一个节点并向
IPFS
添加一个文件 - 部署个人独立博客到
IPFS
- 创建一个浏览器
APP
来在节点之间交换文件 dag API
IPFS + Ethereum BlockChain
- 如何使用
IPFS PubSub Room
构建应用程序 - 如何使用
CRDT
与IPFS
建立协作编辑应用程序
- 直接在终端和
7. Web前端 - Product
- 概述
- 设置上传到区块链的种子数据
- HTML/React 设置
- 渲染产品
- 展示产品列表
- 实现产品提交表单
- 上传表单数据到IPFS
- 保存
8. Web前端 - 拍卖
- React 前端
- JS 实现拍卖逻辑
- 锁定和显示出价
9. 托管服务(Escrow Service)
- 概述
- 托管智能合约(Escrow Contract)
- 声明获胜者
- 发行资金
10. 产品离线(Products Offchain)
- 概述
- MongoDB设置
- 产品定义
- NodeJS app 设置
- Solidity Events
- 存储产品
- 查看产品