转载—DAPP实战:从0到1全过程(1)
转载微信订阅号(区块链之录)文章:
大家好!从今天开始,本公众号将推出DAPP开发系列教程,以项目Forever bird(http://47.95.248.105)为例,详细讲解基于以太链的DAPP开发全过程,包括整体架构设计,智能合约编写、调用、发布,以及从前台到后台的整体开发流程。
在开始之前呢,先做一些准备工作,笔者所采用的开发语言和工具如下:
准备工作:
前端:react
后端:go、nodejs
web服务器:nginx
钱包:metamask
智能合约:solidity
智能合约发布工具:truffle/remix
以太坊客户端:testrpc/geth
工具:web3j
数据库:mysql
前后端开发语言可以根据自己的喜好自由选择,对于基础开发环境的搭建本文不再叙述。
Forever bird介绍
Forever bird是笔者已经开发完成的一套用于加密鸟的交易和养成DAPP。下面介绍系统的主要功能和玩法。
环境依赖:需要安装浏览器钱包Metamask插件,请使用pc端浏览器chrome或者firefox访问。
安装matamask(https://metamask.io/)需要访问应用市场,如果不能访问可以访问路径下载metamask包进行离线安装(https://github.com/MetaMask/metamask-extension/releases),如果安装过程有什么疑问请留言。
定义和主要功能
鸟:每只鸟是用户完全拥有且不会消失的区块链鸟,每只鸟具有力量、速度和体重(单位:盎司)三个重要属性。每周都会按照鸟的体重进行排序,前20bird可以参与平台盈利分红。
主要功能如下:
捉鸟 捉鸟,首先调用智能合约生成bird,一个bird对应一个token id,然后把对应的token id绑定到对应用户。因此,该用户就拥有了唯一、独有、永恒的bird。
鸟市 用户拥有bird之后,可以在鸟市进行交易,平台会收取3.5%的交易费,交易之后购买者就可以拥有bird的所有权。
PK 玩家可以选择其他人的bird进行pk,pk会按照bird的力量、速度、体重和随机因子进行计算,胜者可以获取失败者的体重(如何两者级别相差很大,胜者可能不会获取体重),但是胜者和失败者都会增加经验值。
经验增加到一定数值能够提高bird的等级,等级的提高会增加bird的力量、速度和体重。
0~10级:经验值增加50升一级。
11~30级:经验值增加100升一级。
31~80级:经验值增加200升一级。
80级以上:经验值增加300升一级。
每升一级,力量增加3%,速度增加3%。
吃水果 每个bird在一定时间可以吃一个水果,水果分三类:力量型、速度型和经验型。三类水果会对应提高bird的力量、速度和经验。
分红 分红的比重:平台周盈利的30%
排名方式:按照bird体重(盎司),如果盎司相同,按照id升序排序(创建时间越早优先级越高)。
奖励总数:排名前20名
奖励比例:
第一名:奖励金 * 20%
第二名:奖励金 * 15%
第三名:奖励金 * 10%
第4~10名:奖励金 * 5%
第11~20名:奖励金 * 2%
bird首页如下:
用户登录之后会进入“我的”页面,如下图所示:
排行榜会按照体重进行排序:
每周都会对前20的bird进行分红:
以上对forever bird的项目进行了介绍,下面讲一下总体设计架构
bird的架构模型如下:
在这个架构中,基于以太链的智能合约相当于部分功能的业务后台,与传统的service一起完成整体逻辑,下面介绍一下各模块的功能。
智能合约实现语言solidity,智能合约包含存储和逻辑两部分。
存储内容包括用户和bird token的对应关系,bird的详细信息,比如体重、力量等;还有一部分调用event存储的log。
逻辑包括bird基因生成、bird转移、pk、吃水果等改变状态的接口,获取bird基本信息、获取用户bird信息的查询接口。
service service包括go实现的业务后台,对web提供业务接口;以太链所有的交易都必须等待矿工打包确认,因此nodejs实现的定时脚本,用户查询智能合约,同步bird信息。
web展示时如果直接以太链读取交易数据会比较耗时,同时还要做大量的数据处理,因此确认的交易打包的数据会存储于service数据库。本系统nodejs通过web3j来获取合约里已经完成的交易数据,最终把交易数据存到mysql数据库里。
web端 web端要和智能合约、service进行交互,因为智能合约和service相当于两个业务后台,要保证用户数据的正确性和一致性。
首先要有统一的账户认证,本系统统一使用metamask钱包作为账户认证。web端使用浏览器钱包Metamask(生成用户以太链账户,存储用户私钥),使用metamask提供的web3j接口与以太链智能合约交互,后端service要确认用户登录,需要用户使用私钥对信息进行签名,后端对前端传递的信息进行校验,校验通过则可以保证用户的本人操作,关于如何进行签名校验,请参考一下链接:
https://medium.com/metamask/the-new-secure-way-to-sign-data-in-your-browser-6af9dd2a1527
其次要保证数据传输的完整性。为了防止数据传输过程被篡改,调用智能合约的关键接口(会变更状态的业务接口)都加入了签名校验。
最后为了确保智能合约与后台行为一致性,对bird使用了状态控制。bird的状态变迁图如下所示:
在开发阶段,系统使用了testrpc和geth搭建私链。使用testrpc(内存操作)能够快速测试功能,使用geth能模拟真实以太坊环境。发布测试公链使用remix编译发布。
下章将会为大家讲解:智能合约的编写,敬请期待。