Alvan

Alvan

Smart contract developer in Shanghai

在抽奖系统中生成lucky code

背景

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

原理

该方法分为三步:

1.创建随机数

在创建某个抽奖项目时,项目方可以自主选用一些密钥 x1,x2,x3...xnx_1,x_2,x_3...x_n

同时定义并公开一个陷门函数ff

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

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

每一个用户参与抽奖时,可以添加一个随机数,最后生成一个随机数组a0,a1...ama_0,a_1...a_m

3.揭示中奖密码

管理员传入密钥 y1,y2,y3...yny_1,y_2,y_3...y_n,合约验证f(x1,x2,x3...xn)==f(y1,y2,y3...yn)f(x_1,x_2,x_3...x_n)==f(y_1,y_2,y_3...y_n)

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

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

后记

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