积分抽奖¶
本项目结合 Turora
实现一个区块链积分抽奖的Sample,以演示随机数的使用方法,给开发者做为参考实现。
有两种实现方案,基于 Turora
链下 API
方式获取随机数,以及基于 Turora
的VRF
方式获取链下随机数。
体验此功能前,请阅读 Truora 开发教程
业务流程¶
1 主持人开始一轮抽奖,初始化此轮抽奖每个参与者需要的积分数量,以及初始化参与此次抽奖的用户(地址);
2 参与抽奖的用户存入积分;
3 主持人关闭积分存入功能,并向预言机发起随机数请求;
4 主次人开奖。根据预言机获取的随机数,对参赛选手人数取余,得到中奖者的地址,将积分发送给中奖者。
合约函数说明¶
基于Truora API 方式的抽奖合约LotteryBacOracle
基于Truora VRF 方式的抽奖合约LotteryBacUseVrf
原理基本类似,我们以 Truora API
方式的抽奖合约作为讲解。
构造函数
调用合约的构造函数部署抽奖合约,需要传入两个参数:
randomOracle
: 已部署客户端的随机数合约的地址,用于获取随机数bac001Address
: 积分合约的地址
start_new_lottery
由主持人添加所有参与者进来,并开启一个新的抽奖环节,需要传两个参数:
_players
: 参与者的公钥地址数组_amount
: 本轮抽奖需要押注的积分数量
deposit
参与者确认自己要参与抽奖,确认后会自动转数额为
amount
的积分到合约账户下stop_deposit
由主持人结束本轮抽奖的押注,结束后未押注的用户,不能再押注
pickWinner
确定胜出者,并将奖池(合约账户)下的所有积分转给胜出者
开发教程¶
前提¶
已部署randomOracle合约,此合约提供随机数功能;
积分合约已部署,并记录地址;
相关用户拥有足够的积分,并且允许本合约从自己的账户下转走部分积分;
参与成员说明¶
主持人:
weiwei
参与抽奖成员:
alice
、bob
提供随机数服务的
randomOracle
合约用于抽奖质押的
BAC001
合约提供抽奖服务的合约
LotteryBacOracle
预准备¶
搭建预言机服务或者从服务供应商获取,得到
OracleCore
合约地址,如:0xa60a49b75ee98a19939a786d57cd2a9802e4984b
用
OracleCore
合约地址作为初始化参数,部署预言机客户端合约APISampleOracle
,记录该客户端合约的地址,如:0x89ad9c94646182534482c7f1277c61aed8c22883
部署BAC001合约,给参与抽奖的人员转入足够的积分,并记录该合约的地址,如:
0x470e30fbd66fdc02e0dbf08e0cdd9f6cdb068c8a
主持人部署抽奖合约
LotteryBacOracle
,参数是以上得到的APISampleOracle
和积分合约地址
抽奖步骤¶
主持人调用抽奖合约
LotteryBacOracle
的函数start_new_lottery
。_players
:本轮抽奖入所有参与者amount
: 本轮抽奖需要质押的bac001数量
所有参与者分别在积分合约中调用
approve
函数,允许抽奖合约LotteryBacOracle
从自己账户下转走部分积分。参与者调用抽奖合约
LotteryBacOracle
的deposit
函数确定参与抽奖,这一步操作后,参与者账户下的积分将会自动转到抽奖合约地址中,额度为本轮抽奖指定的数量。主持人调用抽奖合约
LotteryBacOracle
的stop_deposit
函数停止本轮抽奖,参与者不能继续质押了。主持人调用抽奖合约
LotteryBacOracle
的pickWinner
函数,根据随机数计算出本轮获胜者,并将所有质押的积分转给胜出者。