爱意满满的作品展示区。
jybox

抛砖引玉:如何实现绝对公平的年会抽奖程序

  •  
  •   jybox ·
    jysperm · Jan 24, 2017 · 11561 views
    This topic created in 3571 days ago, the information mentioned may be changed or developed.

    传统的抽奖系统都是运行在单机上,那么这台设备就可能被做过手脚,抽奖的结果也不能令所有人信服。如果能在每个人的设备上都运行一次抽奖的话,这样结果就可以令大家信服了 —— 但显然不能简单地这样做,因为每个人抽出的结果都是不一样的。

    于是我想能否利用我在区块链中了解到的「两阶段广播」来产生去中心化的随机数?让这个抽奖程序以分布式的方式运行在所有人的设备上,会有一个后端服务器帮助客户端进行广播,但没有任何特权,每个客户端都会对抽奖过程进行验算,一旦有人作弊就会被发现。

    于是我实现了这样一个原型(https://rollup.leanapp.cn,大家可以开两个窗口体验一下),源代码和更详细的算法描述在 https://github.com/jysperm/rollup,不过目前还有一些问题:

    • 目前只要有人执意捣乱,那么抽奖将一直都无法完成
    • 我还没彻底想清楚如果后端没有公正地进行广播,会有怎样的影响

    关于两阶段广播:

    Supplement 1  ·  Feb 19, 2017
    我又写了一篇更加详细的介绍 https://jysperm.me/2017/02/distributed-random-rollup/
    38 replies  •  2017-02-03 17:45:14 +08:00
    HLT
    HLT
    Jan 24, 2017
    1
    酷
    shiny
    shiny
    PRO
    Jan 24, 2017
    2
    难度在于让大家相信你是公正的
    MOxFIVE
    MOxFIVE
    Jan 24, 2017❤️1
    3
    参考各类 1 元夺宝抽奖,把下期福彩结果当变量
    loading
    loading
    Jan 24, 2017 via Android
    4
    每人预先分配一个号码,然后用你们公司主要语言的 random 函数,现场跑。
    lhbc
    lhbc
    Jan 24, 2017
    5
    算法和代码公开,随机数现场获取。
    h4x3rotab
    h4x3rotab
    Jan 24, 2017 via iPhone❤️1
    6
    看来能理解 blockchain 的人还是太少了
    Dowding
    Dowding
    Jan 24, 2017
    7
    先抽了一拨小奖之后有其他人加入的情况下,每个人抽到大奖的概率相等么?
    cunkouwdy007
    cunkouwdy007
    Jan 24, 2017 via Android
    8
    记得国外有个专业研究真随机数的机构做了个生成真随机数的网站,也许可以用那个?
    ykrl089
    ykrl089
    Jan 24, 2017
    9
    类似彩票,弄一堆球滚下, 估计算是目前来说最公平的了。
    just4test
    just4test
    Jan 24, 2017
    10
    我曾经设想过如何构建绝对公平的赌博程序。原理跟楼主的一样。
    jybox
    jybox
    OP
    Jan 24, 2017❤️1
    11
    @takashiki 我这个算法是要等人齐了才会开始抽的。

    @cunkouwdy007 @loading @lhbc random.org 么?其实还是解决不了我一开始提出的问题:既然随机数是在一台设备上产生的,如何确定这个设备(编译器、浏览器、 HTTP Client )没有被做过手脚呢。

    @MOxFIVE 使用股票、比特币、福利彩票的结果应该算是实践上最简单可行的了。不过我们之所以认为他们可以信任,其实还是因为相比于一个年会抽奖,他们的体量太大了,去操纵的难度太大了,而不是说他们从理论上不可能被操纵。
    lydasia
    lydasia
    Jan 24, 2017❤️1
    12
    RqPS6rhmP3Nyn3Tm
    RqPS6rhmP3Nyn3Tm
    Jan 25, 2017 via iPhone
    13
    @lydasia 虽然笑出声,但的确是正解
    程序员就是容易把简单问题复杂化
    Marfal
    Marfal
    Jan 25, 2017
    14
    现场大屏幕手写
    Arnie97
    Arnie97
    Jan 25, 2017
    15
    如果你只是想找个没被做过手脚的随机数发生器,我经常能捡到这个东西:

    http://ww4.sinaimg.cn/large/a15b4afegy1fc27sh1prpj208w06oglj
    lydasia
    lydasia
    Jan 25, 2017
    16
    @Arnie97 这个哪是随机数,不过对咱来说可以当作是随机数。。
    kslr
    kslr
    Jan 25, 2017
    17
    最无法伪造的随机数当然是 Random.org 了 利用大气噪音来生成随机数,而大气噪音是空气中的雷暴所产生的
    param
    param
    Jan 25, 2017 via Android
    18
    用不可控的產生方式不就可以了嗎。。。比如說用第三方的服務來產生,而不是自家的程序。
    herozhang
    herozhang
    Jan 25, 2017 via iPhone
    19
    @kslr 问题在于如何让人相信你真的访问了这个网站
    nightv2
    nightv2
    Jan 25, 2017 via Android
    20
    每个人发一样的奖品 不就是 绝对公平么
    whale
    whale
    Jan 25, 2017
    21
    @nightv2 仔细一想:每人发一样的,相对于会抽到大奖的那几位就不公平了。

    那么,歪楼问下:世界上真有绝对么?
    alexgor
    alexgor
    Jan 25, 2017
    22
    绝对的公平在这个世界上不存在。
    griffinqiu
    griffinqiu
    Jan 25, 2017
    23
    kslr
    kslr
    Jan 25, 2017 via Android
    24
    @herozhang 算法和数据是公开的的啊?个人也可以去对比啊
    ryd994
    ryd994
    Jan 25, 2017 via Android
    25
    hash 多个随机量
    比如领导敲时间,这一时刻的现场测得的温度,到场人数,噪音等等,
    事先审查设备,事后可以记录重放
    然后再把 hash 值域投射到票上(取模?还是其他?)
    只要有足够的熵,就算有人操纵其中有一两个,剩下的熵会把效果盖掉,这就是 linux 下 /dev/random
    ryd994
    ryd994
    Jan 25, 2017 via Android
    26
    hash 多个随机量
    比如领导敲时间,这一时刻的现场测得的温度,到场人数,噪音等等,
    事先审查设备,事后重放记录
    然后再把 hash 值域投射到票上(取模?还是其他?)
    只要有足够的熵,就算有人操纵其中有一两个,剩下的熵会把效果盖掉,这就是 linux 下 /dev/random 的设计思想
    Intel 处理器有个黑盒随机数发生器,当时有人质疑并希望内核拒绝使用。后来也是用了,解释是,反正一样进熵池,就算有猫腻,其他熵源一样盖掉

    不过讲真,把年会搞成随机数据生成器审计大会,领导不会打死你?
    maomo
    maomo
    Jan 25, 2017
    27
    现场抽签不好吗。。。
    maomo
    maomo
    Jan 25, 2017
    28
    你这个问题在数学上等同于多方如何共同生成一个随机数 http://crypto.stackexchange.com/a/465
    herozhang
    herozhang
    Jan 25, 2017
    29
    @kslr 例如,我部署一个 DNS 服务器,把 random.org 的解析指向我自己假设的这个假服务器,看代码和数据是不能发现作弊的。
    CRVV
    CRVV
    Jan 25, 2017
    30
    @herozhang
    random.org 有 DigiCert 签的证书
    我觉得如果能信任浏览器和操作系统是正经的,通过证书就能确定不是假网站
    kslr
    kslr
    Jan 25, 2017
    31
    @herozhang #29 哥们,我觉得你进入了一个误区。首先回到题目上,公平的抽奖。
    首先通过公开的随机数种子来产生结果,如果用户不接受就可以用种子重新走一遍算法来验证。
    那么不管你在程序中是如何的作弊,都无法逃避结果不一致的问题。

    把过程透明化足以!

    暗箱操作? 你能控制雷暴? 对吧。

    至于程序那只不过代替人工做一道题而已。
    zingl
    zingl
    Jan 25, 2017
    32
    程序员就是矫情,我是领导我就给你们分发机选双色球
    byuc
    byuc
    Jan 26, 2017
    33
    这个的难点不在于技术,只在于没有抽中的人,永远都是不会相信这是公正、机会均等的。
    nomorelie
    nomorelie
    Jan 26, 2017 via Android
    34
    请相关个部门公证啊,设备物理隔离印章封条
    ranleng
    ranleng
    Jan 26, 2017 via Android
    35
    微信红包 手气最佳?
    maplerecall
    maplerecall
    Jan 26, 2017 via Android
    36
    说到年会抽奖…我特么年会前一周接到需求要做个抽奖需求,设计稿还拖了两天,年会前两天还突然改需求,结果最后一周什么正经事都没做就撸抽奖了……

    由于要放到大屏幕上两千人看抽奖页加了各种特效,活生生做成个烤机页面,啥手脚都没动最后自己啥都没中,简直 sad ……
    MrFireAwayH
    MrFireAwayH
    Jan 27, 2017 via Android
    37
    我们公司是自己先选喜欢的实体扑克牌……抽奖的时候去另一个新的那里抽……抽出来和自己选的一样就中奖……

    奖品是抽之前就确定了的

    每个等级的抽奖都参与
    appstore001
    appstore001
    Feb 3, 2017
    38
    开奖部分开源,代码 MD5 等多种方式检验,确保运行的 EXE 或网站源码未经修改。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3868 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 122ms · UTC 05:34 · PVG 13:34 · LAX 21:34 · JFK 00:34
    ♥ Do have faith in what you're doing.