1. Home
  2. Docs
  3. EOS DApp合约开发之DICE游戏
  4. 第六课:DICE游戏项目——开发进度

第六课:DICE游戏项目——开发进度

下面按照功能结构将DICE游戏项目开发步骤进行拆分。

  • 第一阶段:开发环境搭建、熟悉EOS合约语法、项目功能需求、接口文档、整体架构设计
  • 第二阶段:DICE合约监听转账通知实现押注
  • 第三阶段:后端传递种子给合约开奖
  • 第四阶段:前端(基于Web、钱包App)使用Scatter API、RESTful API和websocket与合约、后端交互
  • 第五阶段:实现diceToken合约
  • 第六阶段:实现分红合约设计Token通证经济模型
  • 第七阶段:合约安全——漏洞攻击与防范
  • 第八阶段:测试,部署合约、部署后端、部署前端

第一阶段:开发环境搭建、熟悉EOS合约语法、项目功能需求、接口文档、整体架构设计

今天的工作是为合约开发前做准备,熟悉合约开发所需技术

  1. 熟悉UI设计图、产品需求文档、架构设计文档、开发进度文档、前端接口文档
  2. 使用脚本或者docker搭建EOS环境(本教程使用的是EOSIO V1.2.6)
  3. 熟悉使用cleos命令行工具
  4. 创建本项目所需账号
  5. 创建并发行EOS和JXB代币
  6. 熟悉C++基本语法
  7. 使用C++编写helloworld合约,并使用cleos编译、部署、运行合约
  8. 了解EOS合约语法,如:多索引表、inline action、defer action、eosio.code权限等
  9. 熟练NodeJS语言
    • 熟悉VSCode编辑器
    • 创建后端项目diceContract并集成eosjs库
    • 编写nodejs脚本deploy.js实现编译与部署合约
    • 编写nodejs脚本test.js实现调用合约

第二阶段:DICE合约处理转账通知实现押注

  1. 构建dice合约
  2. 用C实现apply方法分发合约action
  3. apply方法中监听transfer方法并触发create action,即押注
  4. 在test.js脚本中使用openssl生成随机的18位长度的base64数据,即种子
  5. 获取转账的memo里的玩家押注数据:种子、押注数、推荐者
  6. 定义多索引表betings,用于记录玩家押注数据
  7. 储存玩家押注数据到betings表中
  8. 实现removedb action用于删除表所有数据
  9. 完善dice合约:权限认证、押注额限制、过滤不合法的转账押注
  10. 在test.js脚本中调用eosjs库实现押注与获取押注的所有数据

第三阶段:后端传递种子给合约开奖

  1. 在test.js中使用openssl生成随机的32位长度的十六进制数据,即种子
  2. dice合约增加开奖方法,即receipt action
  3. 获取betings中最早未开奖游戏的押注数据,然后在表中删除
  4. 根据种子参数获取开奖结果,即实现随机函数
  5. 定义多索引表beteds,记录已经开奖后的押注数据,并将user(玩家)、seed(种子)作为二级索引
  6. 储存玩家押注、开奖数据到beteds表中
  7. 判断玩家赢了则赔钱给玩家
  8. 提取玩家押注额的1.5%到奖池用于分红
  9. 在test.js中调用合约的receipt action并传递种子实现开奖
  10. 当玩家押注时,在test.js中实现自动为玩家开奖
  11. 测试合约逻辑与合约安全。至此,完成DICE合约开发
  12. 可选功能:

    合约实现控盘功能,适当降低玩家赢的概率

    给前端增加开奖结果的公平性验证接口

第四阶段:前端(基于Web、钱包App)使用Scatter API、RESTful API和websocket与合约、后端交互

第一部分:开发后端项目diceServer自动调用合约开奖

  1. 定时器轮训查询合约betings表中的数据
  2. 若有押注数据,则使用openssl随机生成的种子调用合约开奖aciton

第二部分:根据前端接口文档开发后端webServer项目

  1. 创建NodeJS后端项目webServer,并集成socket.io、集成Express框架、实现http接口,使前端能访问。
  2. http接口:
接口 备注
最新三十条所有投注 用于玩家刚进入前端页面时,需要显示的所有投注数据
前端转账的seed 前端调用转账押注时,memo中包含seed种子
我的余额 包含我的EOS、JXB余额
  1. websocket接口:
接口 备注
所有投注 后端将玩家最新的投注数据推送给前端

第三部分:开发React项目实现前端、后端、合约之间的交互

  1. 在Google浏览器中安装Scatter钱包插件
  2. 配置好Scatter钱包与TokenPocket钱包App的开发环境,包含:EOS节点配置、导入EOS账号
  3. 搭建React项目,熟悉使用Scatter API实现DICE押注
  4. 并使用TP钱包App、Google浏览器的DApp,押注测试成功
  5. 在React中集成socket.io并订阅,使后端能通过socket推送消息给前端
  6. 至此,实现了dice合约、webServer后端、React前端之间相互交互

第四部分:测试

  1. 至此,完成Dice游戏项目基本功能。下面学习社区运营所需的通证经济

第五阶段:实现diceToken合约

  1. 构建diceToken合约
  2. 基于eosio.token合约在diceToken中实现创建、发行、转账功能
  3. 实现质押Token功能,必须根据前端接口文档定义质押action
  4. 实现赎回功能,必须根据前端接口文档定义赎回action
  5. 实现挖矿发行代币功能
  6. 根据游戏挖矿数量实现逐步减半奖励数量,同时逐步解锁为项目方发行JXB Token
  7. 另外需提供的ABI:获取押注奖励JXB的个数、获取质押数量
  8. 在后端项目diceContract中的test.js中实现调用diceToken各个action
  9. 测试合约逻辑与合约安全。至此,完成diceToken合约开发

第六阶段:实现分红合约设计Token通证经济模型

1. 开发pool合约

第一部分:构建pool合约,监听transfer方法触发create action,即完成分红

  1. 获取游戏合约账号转账的memo里的数据:玩家账号名称、推荐者、押注id
  2. 给玩家的推荐者分红10%
  3. 增加给分红池50%的分红金额
  4. 增加给英雄榜9%的分红金额
  5. 给项目方剩余利润
  6. 英雄榜:增加玩家当前小时的累计押注金额
  7. VIP:增加玩家累计押注金额,并奖励VIP回扣
  8. 调用diceToekn合约发行挖矿代币

第二部分:pool合约中实现奖池开奖action(由后端整点触发)

  1. 获取英雄榜用户押注数据,且按照押注金额降序排序
  2. 获取分红池各种Token金额
  3. 获取JXB代币质押总数
  4. 计算英雄榜靠前的玩家的分红金额,将英雄榜分红金额减半的算法全部进行分配
  5. 开始分红:

    英雄榜:根据押注金额排名,分别增加英雄榜分红金额

    分红池:根据玩家质押占比分配分红池各种Token金额,去增加玩家分红金额

  6. 记录分红池每小时的分红记录

第三部分:pool合约中实现分红余额提现action

  1. 必须根据前端接口文档定义分红余额提现action
  2. 遍历该玩家在分红余额表中的各种Token的余额
  3. 若余额大于零,则调用token合约由pool合约账号转帐相应金额
  4. 在test.js中编写测试用例,调通pool合约action

2. 开发NodeJS后端实现pool合约相关功能与接口

第一部分:开发后端diceServer项目

  1. 整点触发调用pool合约的开奖action

第二部分:根据前端接口文档开发后端webServer项目

  1. http接口:
    接口 备注
    我的-网络资源数据 包含我的CPU、NET的总量和已使用量
    首页—代币奖励数量 即游戏挖矿JXB的数量
    分红池-我的质押数量 即质押的JXB数量
    分红池-分红记录 可按天查询每小时的分红记录,包含EOS、JXB
    分红池-我的余额 是分红余额,注意与账户余额不一样
    VIP-等级 每个等级获取的奖励不一样
    VIP-我的累计押注额 根据我的累计押注额判定是VIP的哪个
  2. websocket接口:
    接口 备注
    分红数据: 包含英雄榜用户押注数据、英雄榜分红金额列表、分红各种代币的总额、代币质押总数。
  3. 合约接口
    接口说明 合约接口定义
    分红池-质押代币 void stake(account_name owner, asset value)
    分红池-赎回代币 void unstake(account_name owner, asset value)
    分红池-提现 void drawdividend(const account_name user)

第七阶段:合约安全——漏洞攻击与防范

  1. 整数溢出攻击与防范
  2. 随机数攻击与防范
  3. 重放攻击与防范
  4. 假EOS攻击与防范
  5. 假转账通知攻击与防范
  6. 交易回滚攻击与防范
  7. 内联反射攻击与防范
  8. 同名混淆交易攻击与防范
  9. 敏感权限攻击与防范
  10. 私钥泄漏防范
  11. 拒绝服务/交易阻塞/交易延迟/交易排挤攻击与防范

第八阶段:测试,部署合约、部署后端、部署前端

第一部分:测试,开发完成Dice游戏项目

  1. 修改提供的React项目中的配置文件的相关数据,如:后端服务ip、合约账号名称等
  2. 在局域网中使用TP钱包、Google浏览器测试Dice游戏项目
  3. 至此,完成Dice游戏项目开发。

第二部分:部署合约

  1. 给合约账号购买RAM、抵押获取NET与CPU
  2. 配置eosjs连接到EOS主网,使用deploy.js部署合约到主网

第三部分:部署后端

  1. 服务器搭建 Node.js/Nginx/PM2 环境
  2. 服务器与 Git 仓库读写配置
  3. PM2一键部署线上 Node.js 项目

第四部分:部署前端

  1. 前端代码编译、打包
  2. 域名DNS解析配置及 Nginx 域名配置
Was this article helpful to you? Yes No

How can we help?