如何设计一个可信的抽奖系统

两个月前,我们和一些开发者在广州进行了一次面基,那天我有人提出了这么一个问题,让我印象深刻——

如何设计一个真正可信的楼层抽奖系统

所谓可信,就是能够让公众确信,这个抽奖结果是可信的,而不是被任何人所伪造,以使得结果利于自己。

你作弊没有不重要,让别人(一群无所不用其极的杠精)确信你没作弊很重要
——沃兹基硕德

真随机数?

或许大家第一个想到的是真随机,然而,真随机是最不靠谱的办法。因为真随机没有可复现性,任何人都可以质疑你的真随机数是否为自己挑选出来的,而你也没有任何方法为自己辩解。

基于随机数种子的伪随机数?

伪随机数似乎是一个不错的选择,提供seed就可复现,目前的随机数算法熵值足够大,能够在做到可复现的同时提供充足的随机性,吗?
那我就要问了,你怎么证明这个种子的合理性?这个种子是不是你特意挑选,以控制随机数结果的?

@neo 的代码似乎提供了一个不错的方法,将seed连同中奖人数、最高楼层号、帖子ID、创建时间和最后回复时间一起进行混淆,并通过md5+sha1+sha2连续哈希加密,使得输出结果不可预测……吗?
首先,如你所见,我是一个无所不用其极的杠精。
那我就要问了,假如 @neo 从老黄的烤箱里偷了一张算力高达 1145141919810 MH/s 的显卡,他就能够在开奖之前解密此压缩包,并且通过看不见的大手精准控制帖子的创建时间、最后发帖时间,仍然能够控制搜索结果 :bili_007:

基于网络延迟的抽奖方法

我们最后讨论出了个极其鬼扯的结果,它能够利用网络延迟的不可预测性,确保客户端或者服务端没有把握操纵结果。
但是这个地方太小,我写不下
其实看名字也都知道是怎么操作了。我们需要假设的前提条件是网络稳定,延迟在200ms内,那么用户决定向服务器提交seed的时机,服务器以接收到seed的时间为准,使用seed+毫秒级别的timestamp计算随机数,并向公众公开seed和timestamp,由公众审查并确认客户端与服务端的时间偏差在合理范围内。这种方法理论上能够避免服务端与客户端任意一方单独作弊,但是对于客户端联合服务端作弊的情形无能为力。

40 个赞

:bili_057: 砂糖太强啦!

3 个赞

学习了,太强啦! :rofl:

1 个赞

:saluting_face:学习到了!

1 个赞

醍醐灌顶

真的能学习到吗(惊恐

1 个赞

:grimacing:学习到了真随机数是不可信的,以及抽奖系统最重要的点是可复现

2 个赞

tg上有一个基于以太坊区块计算的抽奖机器人

可以看一下

其中一个公示链接:V2B Flat 主题 - 永久免费托管资格 | 抽奖公示 - Not Lottery Bot

4 个赞

这题我会, 比特币 + 以太坊的开奖前最后一个区块哈希的 SHA 512 结果呢
还不够的话, 加上 Interoperable Randomness Beacons | CSRC 的呢

3 个赞

bingo,这就是我发的帖子的机器人的做法

学到了,只要直接作弊,就没这些苦恼,以后直接找贴主py交易了 :tieba_025:

7 个赞

简单,直接双色球开奖号码

2 个赞

使用一个外部服务也许可以解决随机种子的问题,除了开奖前区块链最后一个块的数据以外,也可以看看
HTTP API reference | drand - Distributed Randomness Beacon.

例如当前最后一个随机数 Cloudflare | Protocol 一样的

这里面包含了一个round,这个网络是每30喵生成一次,易算出指定时间的随机id,即可按照id查找对应的随机数,开奖。

3 个赞

我来了 :bili_038:

如果真要杠的话,最后回复时间可以通过卡自动关闭时间 timing 控制,层高有一定概率能用小号控制。seed 贴主知道,或者弱口令被破解,其他内容是明牌的。

这样下来贴主花费很大精力控制层高还是有概率可以控制抽奖结果的,如果能加一些不可控的随机值,控制结果的难度会更高,比如随机抽取一些回复用户 ID、时间、内容哈希加入混淆,这样只要有一些回复不可控就无法控制结果了。
或者干脆 seed 不让贴主提供,或者贴主提供部分,另一部分由第三方提供。

免责声明:当然,现版本黑幕难度挺高了,站里的抽奖应该没有必要

3 个赞

:bili_057: 砂糖太强啦!

1 个赞

把每个评论的人的信息及评论内容也加上做hash呗

4 个赞

细想了一下,这里不能简单的随机抽取,否则会造成结果不可复现。
抽取楼层需要通过某种算法得出。
或者全部楼层都加入计算

如果他用这么好的东西, 就为了个抽奖, 那给他又如何 :smirk:

1 个赞

控制结果的成本可以说足够高了

所有方案都有一个核心问题,就是不信任你的人还是不相信你的过程。

比如你让用户提交seed,那么这个记录可以在用户发送后的“合理偏差范围内”有大量的值可以取,没准就可以取到对你的目的比较有利的值。

毕竟你的过程并不是完全可观测的。

现实中如何解决这个问题呢?就是靠双方都信任的第三方来公证。