《区块链DAPP开发入门、代码实现、场景应用》笔记5——区块链福利彩票的设计
笔者一直强调,一定要利用区块链的特点来解决行业存在的问题,并且该问题最好用区块链解决或者说只能用区块链解决。彩票行业就是个例子。
在讲解代码之前,首先讲解一下业务设计,如图6.15所示。

图6.15 区块链彩票业务流程
限于篇幅和业务复杂度,该系统并没有按照现有的福彩逻辑来设计,而是本着讲明白实现原理的目的,简化了系统的设计,读者可以根据自己的需求来设计符合自己需求的系统。首先在传统的福彩流程中,用户会花费人民币购买彩票,然后福彩系统将相关的投注信息传送到福彩中心。当投注日期截止后,通过机器摇号的方式决定中彩信息,工作人员记录投注信息,为投注人兑奖。在这个过程中,摇号机器可以被认为操控,在巨大的利益密切,公证人员也形同虚设。
而在本系统的设计中,用户投注的不再是人民币,而是一个彩票token,该token需要通过数字货币ETH来购买,购买的方式和过程不需要人工参与,是通过智能合约来实现。上图中的流程1,用户将ETH发送到token智能合约,该合约会按照ETH与彩票token的比例,返回用户一定量的token,然后用户通过流程2,将手中的token与一定的投注信息发送给福彩管理合约,该合约接收福彩token并记录用户的投注信息。
流程3是在满足一定条件时,管理员发起摇奖动作,冻结投注行为。通过一个公开透明的算法,选出幸运的中奖者,该过程也是通过智能合约实现,没有任何人为的参与的可能。中奖结果产生后,智能合约自动将奖金发送给中奖者,这个兑奖过程也无需用户参与的,而是通过智能合约的一个函数。只是与传统对讲把不同的是,传统兑奖得到的是法币,而本合约函数返回的是token。该兑奖过程是图中流程4的动作,当然作为福彩的管理者,需要收取一定的资金用于公益事业,因此需要把奖金池中的token转移给福彩管理员,这个工作在图中流程5的动作中实现。
投注人在中奖后,可以继续投注,也可以通过将token发送给token的智能合约,赎回ETH数字货币,这个过程就将彩票token变成了可以在现实世界中流通的数字货币。流程6是投注人将token兑换成ETH,流程7是管理机构将token兑换成ETH。
在了解基本的业务流程之后,接下来讲解具体的页面设计和代码实现,首先是页面的功能模块,如图6.16所示。

图6.16 用户投注界面
(1)首先是账号信息,在MetaMask以非管理员身份登录,会显示如上图页面的元素,所谓的非管理员身份,即不是创建彩票token合约管理合约的账号。账号信息显示的是当前账号下的ETH的余额和当前账号拥有的彩票token的数量。
(2)第二是购买token的区域,在输入框中输入愿意花费的ETH的个数,该动作会发送ETH到Token合约的购买接口。当购买成功之后,该账号下的token就会发生变化,账号信息会随之刷新。本例中,彩票token的价格是1finney,也就是说1eth可以购买1000个彩票token,1 eth = 1000 finney。因此在购买输入框中输入1,表示花费1ETH购买彩票token。
(3)第三个区域是输入投注组合区域,用户输入自己的彩票组合,并为该投注信息设定筹码数量即token个数,1token表示1注。本例中,为了简化逻辑,只允许输入3个0~9之间数字的组合。点击投注之后,彩票管理智能合约会记录客户的投注信息,并减少用户账号下的token数量。
(4)第四个区域是当期账号已经投注的记录,如图6.17所示。

图6.17 管理员界面
当用户以管理员身份登录之后,可以显示管理员专用区域,该区域需要设置彩票token的购买和出售价格,默认是1 finney,同时管理员还需要锁定投注并触发摇奖动作。摇奖结束后,需要重新开始新一期投注。
2020区块链各种应用都上马了,跟我一起学《区块链DAPP开发入门、代码实现、场景应用》吧。

《区块链DAPP开发入门、代码实现、场景应用》笔记5——区块链福利彩票的设计的更多相关文章
- 《区块链DAPP开发入门、代码实现、场景应用》笔记4——Ethereum Wallet中部署合约
账号创建完成之后,账号余额是0,但是部署合约是需要消耗GAS的,因此需要获取一定的以太币才能够继续本次实现.在测试网中获取以太币可以通过挖矿的方式,在开发菜单中可以选择打开挖矿模式,但是这需要将Syn ...
- 《区块链DAPP开发入门、代码实现、场景应用》笔记3——Ethereum Wallet的安装
以太坊官方网站可以下载最新版本的Ethereum Wallet,用户无需选择,浏览器会根据访问者操作系统版本自动展现合适的版本,点击DOWNLOAD按钮下载即可安装,如图2.9所示,其下载网址: ht ...
- 《区块链DAPP开发入门、代码实现、场景应用》笔记2——Solidity实现简单的智能合约
本节仅以一个简单的智能合约示例,介绍智能合约的基本组成元素,本合约定义一个uint类型的变量,以及对应这个变量的读写函数. 01 pragma solidity >=0.4.0 <0.6. ...
- 《区块链DAPP开发入门、代码实现、场景应用》笔记1——天外飞仙DAPP
Solidity编程语言解决了编写智能合约的不友好的问题,但是当合约编译并部署之后,对与这些接口的访问,对于一般的使用者来说,门槛有点高, 对普通用户来说也是非常不友好,为了使广大用户理解并方便快捷的 ...
- [币严区块链]以太坊(ETH)Dapp开发入门教程之宠物商店领养游戏
阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 除此之外,你最好还了解一些HTML及JavaScript知识. 本文通过实例教大家来开发去中心化应用,应用效果如图 ...
- NEO区块链-DAPP开发直通车-第零篇
什么是DAPP DAPP 是以太坊发明的词汇 Decentralized Application. 目前基于区块链技术开发的应用程序广泛的接受使用了这一名称. NEL将为开发DAPP提供全面的服务 ...
- Bytom Dapp 开发笔记(二):开发流程
简介 这章的内容详细分析一下涉及智能合约Dapp的整个开发流程,注意是涉及只能合约,如果你只要一些基本转BTM功能没有太大意义,本内容补充一下官方提供的 比原链DAPP开发流程,详细实践过好踩到的一些 ...
- 代码的未来读书笔记<二>
代码的未来读书笔记<二> 3.1语言的设计 对Ruby JavaScript Java Go 从服务端client以及静态动态这2个角度进行了对照. 这四种语言因为不同的设计方针,产生了不 ...
- 区块链会2020再次爆发,先学点DAPP压压惊,跟我一起学《区块链DApp入门实战》
区块链DApp正在经历市场洗礼,常言道,对抗动荡最稳妥的是稳扎稳打的技术学习,不能临时抱佛脚. 马化腾说:互联网会像水和电一样融入我们的生活.而区块链呢?它是价值互联网的基石,是未来必然的趋势,也会像 ...
随机推荐
- Spring @RequestMapping 参数说明
@RequestMapping 参数说明: value: 指定请求的实际地址, 比如 /action/info之类.method: 指定请求的method类型, GET.POST.PUT.DELE ...
- 二代身份Zheng复印(手机正反面拍照生成1:1复印件图像)
下载地址 2017年7月28日 1.支持文字水印:2.优化程序,修复Bug:3.升级版本为1.1. 2017年7月17日1.二代身份*证正面(白色按钮).反面(蓝色按钮)拍摄后,退出APP自动生成A4 ...
- Hive学习笔记——parse
Hive是如何解析SQL的呢,首先拿hive的建表语句来举例,比如下面的建表语句 create table test(id int,name string)row format delimited f ...
- [线性代数xOI/ACM]系数矩阵的QGXZ分解
一些无关紧要的Q&A Q:你是怎么想到这个花里胡哨的算法的啊? A:前几天学习线性代数时有幸和Magolor大佬讨论到 $LU$ 分解在多解时的时间复杂度问题,于是yy出了这个奇怪(?)的算法 ...
- RTSP Spectification
Refer: https://www.ietf.org/rfc/rfc2326.txt Network Working Group H. SchulzrinneRequest for Comments ...
- solr的创建分片的方式
在Solr4.4之后,Solr提供了SolrCloud分布式集群的模式,它带来的主要好处是: (1)大数据量下更高的性能 (2)更好扩展性 (3)更高的可靠性 (4)更简单易用 什么时候应该使用Sol ...
- 浅谈 Docker 安全合规建设
通过阅读网上帖子及浏览相关信息,大家可能会产生一种错觉:Docker 安全性不足,对 Docker 导入生产环境持保守态度.不过实际情况是,虽然我们需要对容器的安全性高度关注,但只要使用得当,完全可以 ...
- c#内存泄漏分析
背景 给客户开发了一个WPF应用,每隔一段时间就会很卡,推测是内存泄漏引起.需要监测内存使用情况. 使用的工具 Ants Memory Profiler 百度网盘下载地址 使用教程 入门使用 参考文档 ...
- 使excel中的表头一直显示
视图 -- 冻结单元格 https://jingyan.baidu.com/article/fedf073788db6b35ac89779a.html
- @PropertySource绝对路径(java.io.FileNotFoundException问题解决)
经常使用@PropertySource 来指定配置文件,然后@value获取配置参数: @Component @PropertySource(value= {"classpath:rules ...