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

在讲解代码之前,首先讲解一下业务设计,如图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. python skimage图像处理(三)

    python skimage图像处理(三) This blog is from: https://www.jianshu.com/p/7693222523c0  霍夫线变换 在图片处理中,霍夫变换主要 ...

  2. C++11版本不能使用一个单行命名空间方式特化一个函数的bug

    warning: specialization of ‘template<class _Iterator> struct std::iterator_traits’ in differen ...

  3. cps在jenkins构建报错

    修改ares的版本号即可,改为2.0.1.14-20191126-RELEASE

  4. php 回调函数结合闭包(匿名函数)的使用示例

    <?php /** * php 回调函数结合闭包(匿名函数)的使用 */ function callback( $callback ){ $variable = 'program'; $ret1 ...

  5. python 实现一个简单tcp epoll socket

    python 实现一个epoll server #!/usr/bin/env python #-*- coding:utf-8 -*- import socket import select impo ...

  6. 【转】什么是5G?居然有人用漫画把它讲得如此接地气!

    最近一系列层出不穷的新闻,似乎都离不开一个关键词——5G.在各大报道中,都提到5G网络是移动无线技术的下一个重要发展. 任正非之前也在采访中说过: “5G,别人两三年也不会追上我们的.” “5G并不是 ...

  7. Mac下 homebrew 安装mysql

    操作步骤 安装homebrew brew install mysql 安装mysql 安装完成之后,可以运行命令启动mysql服务 mysql.server start 然后输入命令设置密码 mysq ...

  8. jquery预加载显示百分比

    jquery预加载显示百分比 <pre> <img class="bj loadimg" loadimg="/weiqingshu/images/1/b ...

  9. canal使用

    报错信息:com.alibaba.druid.pool.DruidDataSource - testWhileIdle is true, validationQuery not set 解决方法: 找 ...

  10. netty中的channelPipeline在编程中的作用

    在netty编程中我们绝大多数是要是用nio的,nio相比传统的io更加高效,而nio中核心概念离不开channel,buffer,selector三个重要的对象. 那么在netty中有一个chann ...