0%

在抽奖系统中生成lucky code

背景

最近项目中需要做一个抽奖的功能,在这个功能里,随机数种子必须是公开的,方便用户查询的,计算过程方便公示的。本来的想法是使用声明抽奖后的第x个区块的区块哈希,这样用户也很容易验证,代码写起来也很简单。但是不幸的是aptos链并没有通过高度获取哈希这种东西,这很令我头秃。组长提议从链下引入,但是公平公正和中心化的稳定性又成了问题,最后我选用了这种方法:

原理

该方法分为三步:

1.创建随机数

在创建某个抽奖项目时,项目方可以自主选用一些密钥 \(x_1,x_2,x_3...x_n\)

同时定义并公开一个陷门函数\(f\)

在执行交易时,把\(f(x_1,x_2,x_3...x_n)\) 传入合约存储,并触发事件以供用户查验

2.构造随机数(可省略)

每一个用户参与抽奖时,可以添加一个随机数,最后生成一个随机数组\(a_0,a_1...a_m\)

3.揭示中奖密码

管理员传入密钥 \(y_1,y_2,y_3...y_n\),合约验证\(f(x_1,x_2,x_3...x_n)==f(y_1,y_2,y_3...y_n)\)

若不成功,则说明管理员徇私,不予通过。

若成功,则中奖号码为\((\sum_{i=0}^ma_i + \sum_{i=1}^n y_i)\%m\)

后记

本来想做一个mpc的过程,但是aptos的生态实在太缺了,不太好做,就决定用这个单陷门函数控制的方法了。