背景
最近项目中需要做一个抽奖的功能,在这个功能里,随机数种子必须是公开的,方便用户查询的,计算过程方便公示的。本来的想法是使用声明抽奖后的第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的生态实在太缺了,不太好做,就决定用这个单陷门函数控制的方法了。