传统的抽奖系统都是运行在单机上,那么这台设备就可能被做过手脚,抽奖的结果也不能令所有人信服。如果能在每个人的设备上都运行一次抽奖的话,这样结果就可以令大家信服了 但显然不能简单地这样做,因为每个人抽出的结果都是不一样的。
于是我想能否利用我在区块链中了解到的「两阶段广播」来产生去中心化的随机数?让这个抽奖程序以分布式的方式运行在所有人的设备上,会有一个后端服务器帮助客户端进行广播,但没有任何特权,每个客户端都会对抽奖过程进行验算,一旦有人作弊就会被发现。
于是我实现了这样一个原型(https://rollup.leanapp.cn,大家可以开两个窗口体验一下),源代码和更详细的算法描述在 https://github.com/jysperm/rollup,不过目前还有一些问题:
关于两阶段广播:
![]() | 1 HLT 2017-01-24 20:20:17 +08:00 酷 |
![]() | 2 shiny 2017-01-24 20:26:43 +08:00 难度在于让大家相信你是公正的 |
![]() | 3 MOxFIVE 2017-01-24 20:39:09 +08:00 ![]() 参考各类 1 元夺宝抽奖,把下期福彩结果当变量 |
![]() | 4 loading 2017-01-24 21:14:53 +08:00 via Android 每人预先分配一个号码,然后用你们公司主要语言的 random 函数,现场跑。 |
![]() | 5 lhbc 2017-01-24 21:19:23 +08:00 算法和代码公开,随机数现场获取。 |
![]() | ![]() 看来能理解 blockchain 的人还是太少了 |
![]() | 7 takashiki 2017-01-24 21:22:37 +08:00 先抽了一拨小奖之后有其他人加入的情况下,每个人抽到大奖的概率相等么? |
![]() | 8 cunkouwdy007 2017-01-24 21:51:09 +08:00 via Android 记得国外有个专业研究真随机数的机构做了个生成真随机数的网站,也许可以用那个? |
9 ykrl089 2017-01-24 21:56:34 +08:00 类似彩票,弄一堆球滚下, 估计算是目前来说最公平的了。 |
10 just4test 2017-01-24 22:21:05 +08:00 我曾经设想过如何构建绝对公平的赌博程序。原理跟楼主的一样。 |
![]() | 11 jybox OP ![]() @takashiki 我这个算法是要等人齐了才会开始抽的。 @cunkouwdy007 @loading @lhbc random.org 么?其实还是解决不了我一开始提出的问题:既然随机数是在一台设备上产生的,如何确定这个设备(编译器、浏览器、 HTTP Client )没有被做过手脚呢。 @MOxFIVE 使用股票、比特币、福利彩票的结果应该算是实践上最简单可行的了。不过我们之所以认为他们可以信任,其实还是因为相比于一个年会抽奖,他们的体量太大了,去操纵的难度太大了,而不是说他们从理论上不可能被操纵。 |
![]() | 12 lydasia 2017-01-24 23:20:43 +08:00 ![]() |
13 RqPS6rhmP3Nyn3Tm 2017-01-25 00:22:09 +08:00 via iPhone @lydasia 虽然笑出声,但的确是正解 程序员就是容易把简单问题复杂化 |
14 Marfal 2017-01-25 00:46:49 +08:00 现场大屏幕手写 |
15 Arnie97 2017-01-25 01:08:42 +08:00 |
17 kslr 2017-01-25 01:52:54 +08:00 最无法伪造的随机数当然是 Random.org 了 利用大气噪音来生成随机数,而大气噪音是空气中的雷暴所产生的 |
![]() | 18 param 2017-01-25 03:10:43 +08:00 via Android 用不可控的生方式不就可以了。。。比如用第三方的服生,而不是自家的程序。 |
20 nightv2 2017-01-25 08:17:09 +08:00 vi Android 每个人发一样的奖品 不就是 绝对公平么 |
![]() | 22 alexgor 2017-01-25 09:26:51 +08:00 绝对的公平在这个世界上不存在。 |
23 griffinqiu 2017-01-25 09:29:40 +08:00 |
![]() | 25 ryd994 2017-01-25 16:03:58 +08:00 via Android hash 多个随机量 比如领导敲时间,这一时刻的现场测得的温度,到场人数,噪音等等, 事先审查设备,事后可以记录重放 然后再把 hash 值域投射到票上(取模?还是其他?) 只要有足够的熵,就算有人操纵其中有一两个,剩下的熵会把效果盖掉,这就是 linux 下 /dev/random |
![]() | 26 ryd994 2017-01-25 16:07:42 +08:00 via Android hash 多个随机量 比如领导敲时间,这一时刻的现场测得的温度,到场人数,噪音等等, 事先审查设备,事后重放记录 然后再把 hash 值域投射到票上(取模?还是其他?) 只要有足够的熵,就算有人操纵其中有一两个,剩下的熵会把效果盖掉,这就是 linux 下 /dev/random 的设计思想 Intel 处理器有个黑盒随机数发生器,当时有人质疑并希望内核拒绝使用。后来也是用了,解释是,反正一样进熵池,就算有猫腻,其他熵源一样盖掉 不过讲真,把年会搞成随机数据生成器审计大会,领导不会打死你? |
![]() | 27 maomo 2017-01-25 16:18:15 +08:00 现场抽签不好吗。。。 |
![]() | 28 maomo 2017-01-25 16:32:45 +08:00 你这个问题在数学上等同于多方如何共同生成一个随机数 http://crypto.stackexchange.com/a/465 |
29 herozhang 2017-01-25 18:56:57 +08:00 @kslr 例如,我部署一个 DNS 服务器,把 random.org 的解析指向我自己假设的这个假服务器,看代码和数据是不能发现作弊的。 |
30 CRVV 2017-01-25 19:14:08 +08:00 |
31 kslr 2017-01-25 19:25:52 +08:00 @herozhang #29 哥们,我觉得你进入了一个误区。首先回到题目上,公平的抽奖。 首先通过公开的随机数种子来产生结果,如果用户不接受就可以用种子重新走一遍算法来验证。 那么不管你在程序中是如何的作弊,都无法逃避结果不一致的问题。 把过程透明化足以! 暗箱操作? 你能控制雷暴? 对吧。 至于程序那只不过代替人工做一道题而已。 |
32 zingl 2017-01-25 23:36:29 +08:00 程序员就是矫情,我是领导我就给你们分发机选双色球 |
![]() | 33 byuc 2017-01-26 16:47:10 +08:00 这个的难点不在于技术,只在于没有抽中的人,永远都是不会相信这是公正、机会均等的。 |
34 nomorelie 2017-01-26 17:40:07 +08:00 via Android 请相关个部门公证啊,设备物理隔离印章封条 |
![]() | 35 ranleng 2017-01-26 19:00:33 +08:00 via Android 微信红包 手气最佳? |
![]() | 36 maplerecall 2017-01-26 19:37:50 +08:00 via Android 说到年会抽奖…我特么年会前一周接到需求要做个抽奖需求,设计稿还拖了两天,年会前两天还突然改需求,结果最后一周什么正经事都没做就撸抽奖了…… 由于要放到大屏幕上两千人看抽奖页加了各种特效,活生生做成个烤机页面,啥手脚都没动最后自己啥都没中,简直 sad …… |
37 MrFireAwayH 2017-01-27 13:45:27 +08:00 via Android 我们公司是自己先选喜欢的实体扑克牌……抽奖的时候去另一个新的那里抽……抽出来和自己选的一样就中奖…… 奖品是抽之前就确定了的 每个等级的抽奖都参与 |
38 appstore001 2017-02-03 17:45:14 +08:00 开奖部分开源,代码 MD5 等多种方式检验,确保运行的 EXE 或网站源码未经修改。 |