笔者一直强调,一定要利用区块链的特点来解决行业存在的问题,并且该问题最好用区块链解决或者说只能用区块链解决。彩票行业就是个例子。

在讲解代码之前,首先讲解一下业务设计,如图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——区块链福利彩票的设计的更多相关文章

  1. 《区块链DAPP开发入门、代码实现、场景应用》笔记4——Ethereum Wallet中部署合约

    账号创建完成之后,账号余额是0,但是部署合约是需要消耗GAS的,因此需要获取一定的以太币才能够继续本次实现.在测试网中获取以太币可以通过挖矿的方式,在开发菜单中可以选择打开挖矿模式,但是这需要将Syn ...

  2. 《区块链DAPP开发入门、代码实现、场景应用》笔记3——Ethereum Wallet的安装

    以太坊官方网站可以下载最新版本的Ethereum Wallet,用户无需选择,浏览器会根据访问者操作系统版本自动展现合适的版本,点击DOWNLOAD按钮下载即可安装,如图2.9所示,其下载网址: ht ...

  3. 《区块链DAPP开发入门、代码实现、场景应用》笔记2——Solidity实现简单的智能合约

    本节仅以一个简单的智能合约示例,介绍智能合约的基本组成元素,本合约定义一个uint类型的变量,以及对应这个变量的读写函数. 01 pragma solidity >=0.4.0 <0.6. ...

  4. 《区块链DAPP开发入门、代码实现、场景应用》笔记1——天外飞仙DAPP

    Solidity编程语言解决了编写智能合约的不友好的问题,但是当合约编译并部署之后,对与这些接口的访问,对于一般的使用者来说,门槛有点高, 对普通用户来说也是非常不友好,为了使广大用户理解并方便快捷的 ...

  5. [币严区块链]以太坊(ETH)Dapp开发入门教程之宠物商店领养游戏

    阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 除此之外,你最好还了解一些HTML及JavaScript知识. 本文通过实例教大家来开发去中心化应用,应用效果如图 ...

  6. NEO区块链-DAPP开发直通车-第零篇

    什么是DAPP DAPP 是以太坊发明的词汇 Decentralized Application. 目前基于区块链技术开发的应用程序广泛的接受使用了这一名称.   NEL将为开发DAPP提供全面的服务 ...

  7. Bytom Dapp 开发笔记(二):开发流程

    简介 这章的内容详细分析一下涉及智能合约Dapp的整个开发流程,注意是涉及只能合约,如果你只要一些基本转BTM功能没有太大意义,本内容补充一下官方提供的 比原链DAPP开发流程,详细实践过好踩到的一些 ...

  8. 代码的未来读书笔记&lt;二&gt;

    代码的未来读书笔记<二> 3.1语言的设计 对Ruby JavaScript Java Go 从服务端client以及静态动态这2个角度进行了对照. 这四种语言因为不同的设计方针,产生了不 ...

  9. 区块链会2020再次爆发,先学点DAPP压压惊,跟我一起学《区块链DApp入门实战》

    区块链DApp正在经历市场洗礼,常言道,对抗动荡最稳妥的是稳扎稳打的技术学习,不能临时抱佛脚. 马化腾说:互联网会像水和电一样融入我们的生活.而区块链呢?它是价值互联网的基石,是未来必然的趋势,也会像 ...

随机推荐

  1. C# xml转化为类集合

    XmlDocument doc = new XmlDocument(); doc.Load(HttpContext.Current.Server.MapPath("~/WebConfig/w ...

  2. <c:forEach>, <c:forTokens> 标签

    这些标签封装了Java中的for,while,do-while循环. 相比而言,<c:forEach>标签是更加通用的标签,因为它迭代一个集合中的对象. <c:forTokens&g ...

  3. 解决在SQLPLUS中无法使用方向键、退格键问题

    1. wget ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/matthewdva:/build:/E ...

  4. elementui---表格拖动排序的问题

    刚刚用elementui的表格,需要用到一个拖动排序的需求,简单弄了下,使用 Sorttable 来做还是挺快的,但是发现一个问题,拖动排序显示不正常. <el-table :data=&quo ...

  5. react 核心技术点

    1.react生命周期 react生命周期分为初始化阶段.运行阶段.销毁阶段. (1) 初始化阶段: componentWillMount:实例挂载之前 Render:渲染组件 componentDi ...

  6. Python3基础 from...import 局部导入

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  7. MyBatis 返回 List mapperxml怎么写

    转: MyBatis 返回 List mapperxml怎么写? 原创 微wx笑 发布于2018-06-20 13:59:23 阅读数 10742 收藏 展开 有时候,我们不需要整个表的所有字段,而是 ...

  8. SDN实验---Ryu的源码分析

    一:安装Pycharm https://www.cnblogs.com/huozf/p/9304396.html(有可取之处) https://www.jetbrains.com/idea/buy/# ...

  9. SimpleDataFormat 线程不安全解决

    SimpleDataFormat 是我们常用的时间转换工具,我再spark中使用sdf对时间戳进行转换,发现转化出的时间有异常,原来sdf是线程不安全的, 改用joda time,错误消失,样例如下 ...

  10. Redis Sentinel 高可用部署实践集群

    一.Redis Sentinel 介绍    1.Sentinel     数据库环境搭建,从单机版到主备.再到多数据库集群,我们需要一个高可用的监控:比如Mysql中,我们可能会采用MHA来搭建我们 ...