是否存在通过算法保证公平的抽奖模式?

2023-06-28 22:22:30 +08:00
 LeeReamond

如题,由彩票问题引发的思考,如今网络上各种抽奖、彩票等等,是否存在使用算法保证公平的方式?一定要用传统的迷之机器物理摇号+不公正的公证员吗?

想了想,感觉一个简单的想法是使用所有参与抽奖者的信息做总和哈希,生成一段指向唯一中奖者的秘钥。这样每当有新的参与者加入,总和哈希都会变化,使得秘钥不可控。

但是这种方式似乎无法防止枚举作弊,也就是比如如果我想让第 1001 号抽奖者中奖的话,如果我有足够的算力,我可以穷举哪种组合下哈希会指向 1001 ,然后得到结果后按图索骥,伪造一些虚拟身份参与抽奖。

老哥们有无看法?

4906 次点击
所在节点    程序员
63 条回复
phpfpm
2023-06-28 22:28:52 +08:00
找一些大家无法控制的数字,比如股市收盘
zooo
2023-06-28 22:36:06 +08:00
web3 应该已经有抽奖的智能合约了吧(个人猜测)

你找找

每增加一位抽奖人都会成为一个随机源,保证公平
LeeReamond
2023-06-28 22:38:54 +08:00
@phpfpm 金融行业从业人员似乎并不认为股市收盘无法控制。。。也许太阳黑子爆发之类的东西无法预测?但是不具备实用性啊
tool2d
2023-06-28 22:52:23 +08:00
随机数生成器不是挺好用的,好像 linux 有那种无法预测的真随机数。
Deplay
2023-06-28 22:56:50 +08:00
之前看过,实时大气数据作为随机数种子,考虑到地球是一个混沌系统,应该可以认为完全随机
Deplay
2023-06-28 22:57:44 +08:00
补充一下,还有通过 cpu 的噪音,温度,频率来实现的
Ericcccccccc
2023-06-28 23:01:29 +08:00
用股票指数当答案, 至少可以防止操纵结果.
cmdOptionKana
2023-06-28 23:01:38 +08:00
股市可以,如果单一市场怕操控,可以把多个国家的股市加在一起,我就不信有人能控制全球股市。
phpfpm
2023-06-28 23:11:10 +08:00
@LeeReamond 当然能控制,但是得花钱。。
ffgrinder
2023-06-28 23:19:23 +08:00
@LeeReamond 来,你告诉我怎么个控制法?
chendy
2023-06-28 23:21:12 +08:00
引入足够多的随机因子做随机即可
myd
2023-06-28 23:25:53 +08:00
确实有点难想,随机数需要公开(可观测)、不可控。类似于计算机生成随机数、太阳黑子、温度都存在观测设备被控制的可能
hamsterbase
2023-06-28 23:26:50 +08:00
挖矿。 工作量证明
hamsterbase
2023-06-28 23:30:01 +08:00
以拿比特币最新的 hash 作为随机因子。 这个是无法被控制,全球公开的。
swulling
2023-06-28 23:33:11 +08:00
上面的歪楼了,这个问题的关键不在于所谓的真随机数,而在于可以独立复现结果。

什么意思呢,假如真有一个真随机数,基于这个随机数设计了抽奖程序,那么谁知道你的程序里玩了什么猫腻?靠第三方审查代码又会陷入信任陷阱。

这个问题的关键是你开源一个抽奖程序,然后程序的种子必须是未来某个时刻产出的随机数,产出过程无法被控制,产出结果全网可看且不可篡改。

巧了,比特币挖的新块的 hash 值就符合这个要求。所以才有数字货币智能合约。
LeeReamond
2023-06-29 00:16:38 +08:00
@swulling 所以比特币是通过全网算力保证在未来某时刻一定会出现这样一个符合要求的 hash ,不过似乎无法普及到大部分抽奖都采用?
rekulas
2023-06-29 00:38:12 +08:00
总和哈希并不安全,有些区块链抽奖就用的这个方式,已经有多起攻击案例

目前我了解最为安全的应该是"承诺"的方式
例如随便想个简单模式,之前在知乎也回答过

用户 a 选择了一个号码比如 784516 ,再自己创建一个随机数例如 32 位的 de90fcea....,再将号码和当期期号和随机数一起进行 sha256 计算指纹,然后你将指纹提交给彩票中心购买该指纹的所有权,这样彩票中心只知道你的指纹没法知道你的号码。

开奖就简单了,开奖后彩票中心通知中奖号码是 784517 ,购买过彩票的用户都开始上传自己的原始信息-彩票号码、期号、随机数,(sha256 的计算复杂性也保证了用户没办法现场计算一个虚假的信息来冒充中奖信息-超算都没法),彩票中心收到信息之后告知你的号码只错了一位得了一等奖。

有没有漏洞? 还是存在的,中心可以进行自我攻击创建多个中奖号码,但至少解决了中心知晓每个号码的问题-这样对平台来说没办法修改中奖率了,如果彩票敢这样玩,我也敢每期买.

要想彻底防范感觉还是引入三方随机数生成,或者基于多个可信分布式秘钥(或类似门限签名)来组合生成最终中奖结果,空了我再想想
chenjia404
2023-06-29 01:08:43 +08:00
很简单,未来某个比特币的区块哈希做随机数。
louisxxx
2023-06-29 02:39:39 +08:00
你说你公平 但没人信你啊
LeeReamond
2023-06-29 03:22:33 +08:00
@rekulas 合理,但是用作抽奖的话用户需要进行两次交互,太麻烦了,但是可能是目前为止的最优解了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/952529

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX