设计文档
设计目标
基于以太坊平台设计一款答题益智类Dapp,参与者可通过答题赢得奖金并且完善知识面。
总体功能与流程概述
-
开始答题前,参与者首先根据自己的喜好选择相应的题库,题库类型分为:文学、历史、社科、数学…
-
题库选择完毕,参与者继续选择答题模式:闯关赛或是挑战赛。
-
参与者根据所选答题模式支付相应的挑战金或闯关金(挑战金或闯关金会进入奖金池)即可开始进入答题。
-
若参与者选择挑战赛,立即加载题目并且连续答题若干道,并记录答题时长。一段时间后统计成绩,排名靠后的40%所支付的挑战金会掉入奖金池,排名靠前的60%挑战金会返还并且会分得奖金池中一定比例的奖金(排名越靠前能够分得越多,答对同样数量题目的用时短的获胜)。
-
若参与者选择闯关赛,立即加载题目并连续答题若干道。一段时间后统计所有参与者成绩,若错误率在40%以上,闯关赛的闯关金会掉入奖金池,反之会退还闯关金并且分得奖金池中一定比例的奖金(错误率越小能够分得越多,答对同样数量题目的用时短的获胜)。
整体框架
功能视图
- 前端
- 使用web3.js建立与智能合约的交互。
- 将必要的数据传输到后端进行处理。
- 统计参与者答题时间,并且与参与者地址对应,用来决定当错误率相同时谁胜谁负。
- 页面展示,包括选择答题模式、题库类型、切换答题页面以及提供参与者答题过程中所需的操作页面等。
- 后台
- 根据参与者的选项加载不同类型的题目。
- 将必要数据写入数据库并在需要时进行加载。
- 接收前端数据,计算出参与者排名,反馈给前端。
- 记录参与者历史答题记录,避免加载到相同的题库。
- 智能合约
- 从奖金池中将胜者奖金退还。
- 将挑战金或闯关金存入奖金池。
- 完成胜者奖金退还后,胜者按照一定的比例分配奖金池中的奖金。
开发语言
- 应用前端:Html5 + CSS + JS,使用Sublime作为开发工具。
- 应用后端:以太坊智能合约(Solidity)作为程序语言,与前端建立交互。
- 服务器端:采用Golang作为开发语言,MySql作为数据库,使用Liteide作为开发工具。
代码规范
注释规范
- 文件头注释(每一个文件的文件头都必须做文件头注释)
/*
* 文件名:LoadingLibrary
* 描 述:加载题库
* 作 者:
* 时 间:
*/
- 方法注释(每一个成员方法都必须做方法头注释)
/*
* 方法名: ReadFile(filename)
* 功 能:读取文件
* 参 数:filename 文件名
* 返回值:无
*/
- 块语句注释
//循环遍历字符串,并将其存储在...中
for(i = 0;i < s.length;i ++){
#code
}
- 变量注释
var flag; //一个标识位
var numer; //题目的数量
命名规范
- 文件名:每个单词首字母大写
SwitchLibrary.go
- 包文件、html、css、js、图片文件等: 全部小写,单词之间用-隔开
util
chart-showcase.html
home.css
common.js
animal-cat.jpg
- 常量:全部大写,单词间用_隔开
const NUMBER = 1;
const SHOW_LIBRARY = true;
- 方法、变量命名:驼峰法命名,首单词小写,其他单词大写
function getValue(){
#code
}
var webUrl = "http://..."
设计上存在的问题
-
答题过程中参与者将题目复制后从网上寻求答案?
解决:在禁止浏览器的复制行为的前提下。题目长度在可接受范围内尽可能加长,答题限定时长。 -
参与者多次参与答题后遇到相同的题目?
解决:在题库题量尽可能大的前提下。记录参与者的答题记录,确保每次加载到的题目不同。 -
挑战赛一次不会有很多参与者在线,如何处理结果?
解决:当只有少数参与者在线时,他们可以开始挑战赛,后面的参与者也可立即加入挑战赛,即使其他人已经完成比赛。当系统统计有足够多的人参与过本次挑战赛才会计算出最后的结果,进行奖金分配。 -
挑战赛与闯关赛队奖金池中的奖金如何分配(怎样的比例)?
解决:影响因素较多,具体分配原则要多方面考虑。初步考虑,挑战赛会分的奖金池多数奖金,因为参与者付出代价较大,具体挑战赛与闯关赛的奖金分配比例有待进一步考虑。 -
参与者参加答题需要支付的挑战金与闯关金应该如何选择?
解决:同上,综合考虑多方面因素,如参与人数、以太币市价等。
备注
- 奖金池中的奖金会有一部分进入开发者账户,作为酬劳。
- 隐形的激励政策:参与者为了赚取奖励会首先选择闯关模式(看起来更容易获得利益),这样下去的结果就是奖金池中累积的金额越来越少,参与者为了赚取更多奖励会主动参与挑战模式,由此形成资金链的循环。