以太坊Dapp项目-拍卖网站-智能合约编写测试

修订日期 姓名 邮箱
2018-10-18 brucefeng [email protected]

前言

写这篇文章的初衷其实很简单,在MyEtherWallet上申请以太坊ENS的时候,竞标的以太币两次被吞,而且是在规定时间点进行了价格公告,这篇文章的设计思路其实就是跟ENS的竞标流程类似,希望对大家有所帮助,所以,准备写完之后,再重新去整一次ENS的申请,如果再被吞,我就要举报了:-),本文主要是本人用于项目整理,便于自己查询,不做任何商业用途。

现在回归到技术上来,这个项目其实涉及到蛮多的知识点的,是非常不错的以太坊智能合约以及Dapp学习项目,至少在目前而言,还没有看到特别好的学习项目被分享出来,通过该项目,我们可以掌握如下内容:

  • 以太坊智能合约编程语言Solidity的编写
  • 智能合约框架Truffle的学习与使用
  • 以太坊与IPFS的整合
  • NodeJS编程学习
  • 以太坊Web3JS的接口学习
  • Dapp与主流数据库的整合(本文为NoSQL类型的MongoDB)
  • 维克里拍卖法则

一.项目介绍

1.项目功能

(1)项目展示

允许商家列出项目,我们将为任何人建立免费列出项目的功能,我们会将这些项目都存储在区块链和非区块链的数据库中,方便查询。

(2) 文件存储

将文件添加到IPFS:我们将商品图像和商品描述(大文本)上传至IPFS的功能。

(3)浏览商品

我们将添加根据类别,拍卖时间等过滤和浏览商品的功能。

(4)商品拍卖

实现维克里密封拍卖,招标流程跟ENS类似。

(5)托管合约

一旦投标结束,商品有赢家,我们将在买方,卖方和第三方仲裁人之间创建一个托管合同

(6) 2-of-3数字签名

我们将通过2-of-3数字,其中3名参与者中的2名必须投票将资金释放给卖方或者将金额退还给卖方。

2.项目架构

以下图片来源于网络

以太坊Dapp项目-拍卖网站-智能合约编写测试

(1) Web前端

HTML,CSS,JavaScript(大量使用web3js),用户将通过这个前端应用程序与区块链,IPFS和NodeJS服务器进行交互

(2) 区块链

这是所有代码和交易所在的应用程序的核心,商店中所有商品,用户出价和托管都写在区块链上。

(3) NodeJS服务器

这是前端通过其与数据库进行通信的后端服务器,我们将公开一些简单的API来为前端查询和从数据库中检索商品。

(4) MongoDB

尽管商品存储在区块链中,但是查询区块链展示商品和应用各种过滤器(仅显示特定类别的商品,显示即将过期的商品等)效率并不高,我们将使用MongoDB数据库来存储商品信息并查询它以展示商品。

(5)区块链存储IPFS

当用户在商店中列出商品时,前端会将商品文件和描述上传至IPFS,并将上传文件的散列HASH存储到区块链中。

3. 业务流向

以太坊Dapp项目-拍卖网站-智能合约编写测试

(1) 用户访问前端

(2) 将商品文件与描述信息传至IPFS中

(3) IPFS返回对应的Hash值

(4) 网页前端调用合约将Hash值结合产品ID,拍卖时间,分类,价格等写入区块链中

(5) 从区块链中读取数据展示在web前端

(6) NodeJs服务器监听这些事件,当事件被合约触发时,服务器从区块链中取出数据缓存至mongodb中。

4. 实现步骤

  • 先通过truffle 和 solidity实现合约代码,将其部署到truffle develop自带的测试网络中,并且在truffle console中可以自由交互。

  • 通过命令行安装并与IPFS交互

  • 在后端实现完成后,我们将构建Web前端以与合约和IPFS进行交互,我们也会实现招标,揭示前端的拍卖功能。

  • 我们将安装MongoDB并设计数据结构来存储商品

  • 数据库启动并允许后,我们将实现监听合约时间的NodeJS服务端代码,并将请求记录到控制台,然后我们将执行代码将商品插入数据库中。

  • 我们将更新到我们的前端,从数据库而不是区块链中查找商品(如何保证数据库中的数据不被篡改?)

  • 我们将实现托管合同和相应的前端,参与者可以向买方/卖方发放或退款。

二.初始化项目环境

1.Truffle初识与安装

(1) Truffle简介

Truffle是针对基于以太坊的Solidity语言的一套开发框架。本身基于Javascript,相比于没有框架编写Solidity智能合约,Truffle提供了如下功能

  • 首先对客户端做了深度集成。开发,测试,部署一行命令都可以搞定。不用再记那么多环境地址,繁重的配置更改,及记住诸多的命令。
  • 它提供了一套类似mavengradle这样的项目构建机制,能自动生成相关目录,默认是基于Web的。
  • 简化开发流程:提供了合约抽象接口,可以直接通过合约.deployed()方法拿到合约对象,在Javascript中直接操作对应的合约函数。原理是使用了基于web3.js封装的Ether Pudding工具包。
  • 提供了控制台,使用框架构建后,可以直接在命令行调用输出结果,可极大方便开发调试(这一点有点不敢过于恭维,不少时候在调试的时候还不如Remix)
  • 提供了监控合约,配置变化的自动发布,部署流程。不用每个修改后都重走整个流程。

关于其相关介绍,可以直接到Truffle官网进行了解。

(2) Truffle安装

安装Truffle非常简单,官网上面也非常简单明了

$ npm install truffle -g

同样的,本文只写相关相关的内容与步骤,此处不做过多扩展,移步官方文档查看更多的内容。

2.创建项目目录

$ mkdir auctionDapp/ ; cd auctionDapp
$ truffle unbox webpack

创建项目目录`auctionDapp,并进行初始化工作,返回如下信息则表示truffle项目框架搭建完毕

以太坊Dapp项目-拍卖网站-智能合约编写测试

.
├── LICENSE
├── app  //前端设计
├── box-img-lg.png
├── box-img-sm.png
├── build //智能合约编译后文件存储路径
├── contracts //智能合约文件存储路径
├── migrations //存放发布脚本文件
├── node_modules //相关nodejs库文件
├── package-lock.json 
├── package.json //安装包信息配置文件
├── test //合约测试文件存放路径
├── truffle.js // truffle配置文件
└── webpack.config.js // webpack配置文件

将用于测试的智能合约删除,避免干扰我们的项目。

$ rm -rf contracts/{ConvertLib.sol,MetaCoin.sol}
(1) Truffle Box用途

提到Box,作为蓝鲸智云的忠实粉丝与早期布道者,有必要提一下蓝鲸MagicBox,那是一个专门提供给运维开发人员的前端框架集合,这里的box也是类似的用途,官网是这么描述的

TRUFFLE BOXES
THE EASIEST WAY TO GET STARTED
Truffle Boxes are helpful boilerplates that allow you to focus on what makes your dapp unique. In addition to Truffle, Truffle Boxes can contain other helpful modules, Solidity contracts & libraries, front-end views and more; all the way up to complete example dapps.

简而言之,TRUFFLE BOXES就是将solidity智能合约,相关库,前端框架都集成在一起的集合,方便开发人员在最大程度上简化不必要的环境搭建与技术选型工作。

以太坊Dapp项目-拍卖网站-智能合约编写测试

(2) Webpack框架

Webpack 是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。

以太坊Dapp项目-拍卖网站-智能合约编写测试

从图中我们可以看出,Webpack 可以将多种静态资源 js、css等转换成一个静态文件,减少了页面的请求。

三.编写测试智能合约

1.定义结构体

本章节定义了一个名为AuctionStore的合约,定义了枚举变量ProductStatus用于区分商品竞拍的阶段,定义枚举变量ProductCondition用于标识拍卖商品是新品还是二手商品,为了便于统计商品数量,我们定义了uint类型变量productIndex通过递增的方式存储商品数量,在商品发布之后会形成两个字典表。

  • 产品Id与钱包地址对应表productIdInStore(多对一)
产品ID 发布者钱包地址
1 0x627306090ab
  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值