Rollup: 去中心化随机抽奖程序

作者:hi现场 日期:2018-07-20 18:57:10 浏览量:11

文/LeanCloud 工程师 王子亭

在春节前后,经常在社区中看到有关年会抽奖程序的讨论,其中抽奖的公平性是被大家讨论得最多的点。可能有的人会说可以用 random.org 来取随机数,的确这个网站可以保证数字的随机性,但如果访问 random.org 的浏览器位于一台计算机上,如何证明这个随机数确实来自 random.org 呢?如何确定这台计算机从软件到硬件、从操作系统到网络接口都没有被动过手脚呢?

所以我们需要一种「可验证」的随机数生成算法,即 这个算法不应该是运行在单个设备上的,而是可以在不同的设备上多次运行,并且总是得到相同的结果,这样才能被大家信服 —— 每个人都可以在自己的设备上进行验算。

其实说来直接使用比特币下一个区块的 hash,或者股市收盘价格作为随机数是最简单、最具有可行性的做法了。但这并不是说比特币(矿工可以有选择性地提交区块来影响随机数)或股市不能被操控,而只是相对于我们的年会抽奖来说,他们的体量都太大了,去操控比特币或股市是不划算的。

于是我想能否利用之前了解到的去中心化和区块链的知识,来实现一个去中心化的、可验算的、难以操控的抽奖程序,让这个抽奖程序以分布式的方式运行在所有参与者的设备上,会有一个后端服务器帮助客户端进行广播,但本身没有特权,客户端会对随机数的产生过程进行验算,确保没有人作弊。

其实在 Ethereum(一个类似比特币的区块链)上已经有了非常成熟的 随机数生成器,它基于「两阶段提交」来实现,在第一阶段每个人生成一个随机数,并将这个随机数的 hash 广播出去;然后在第二阶段之前的参与者再广播随机数的明文,然后将所有参与者的随机数加到一起,形成一个无法被任何操纵的随机数。

这个算法的要点在于,在第一阶段中每个人都选定了一个数字,但广播的却是数字的 hash,也就是说你没办法知道其他人选定的数字,也就无法去构造特定的数字来影响结果;而在第二阶段大家才开始广播真正的数字,同时每个人都会使用之前的 hash 进行验算,保证这时的数字与第一阶段相同。

我将这个算法进行了细化,在浏览器中用 React 实现了客户端,再用 Node.js 实现了一个基于 WebSocket 的服务器来辅助广播。大家可以在 rollup.leanapp.cn 访问到这个原型(源代码和详细算法位于 jysperm/rollup),可以自己开多个浏览器窗口进行测试:

分享:
010-574900539
Hi现场官方微信

Hi现场官方微信

获得更多现场最新动态,把握互动娱乐动向,请关注我们。