笔者一直强调,一定要利用区块链的特点来解决行业存在的问题,并且该问题最好用区块链解决或者说只能用区块链解决。彩票行业就是个例子。
在讲解代码之前,首先讲解一下业务设计,如图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开发入门、代码实现、场景应用》吧。