在彩票示例中使用随机预言

一天早上,关于Waves平台区块链上经过测试的随机数生成器的一篇文章引起了我的注意。

整体情况是可以理解的,但是具体实现的方法却不可行。 任何代码,签名,什么,在哪里,为什么?

经过与甲骨文作者的几次协商,结果证明是将绘制的逻辑(用PHP实现)与一种用于获得随机数的算法相结合。

  1. 在锦标赛/回合开始时,我们要求oracle提供代码的第一部分(R代码)。

    目前,还没有关于玩家数量,奖品数量,奖赏金额以及彩票存在的信息。 甲骨文通过交易发布个人随机代码,将来该代码只能使用一次,并且只能用于请求该代码的人。 顺便说一下,可以预先“购买” R代码(指的是请求交易的成本+响应交易的预付款,这是按当前汇率计算的0.015美元的量,该代码本身是免费发行的),因此您不必等待以后再接收响应交易。 我在数据库中做了一个小的定期更新的缓冲区。
  2. 锦标赛以60个Waves平台区块链的标准块进行,目前大约1小时。 如果在60个盖帽之后其中至少有两张门票,则认为该比赛已举行并结束,否则锦标赛活动时间将延长60个盖帽。
  3. 比赛结束后,我们立即形成并发送交易日期(我们还为此支付约0.005美元的佣金),如有必要,在其中确定一些图纸的所有条件和球员(门票)的有序列表,我们需要从中选择赢家。
  4. 在这一阶段,我们已经有了代码的第一部分(R代码)加上交易日期ID(TXID)。 我们将它们以串联(R代码+ TXID)的形式发送给Oracle进行签名,再一次支付佣金+赔偿金。 oracle检查数据的唯一性和所属性,并作为响应将sha256格式的第二部分代码(S代码)发送给我们,这是随机数生成器的起点。
  5. 为了获得表示中奖彩票序列号的随机数,我们将S代码从sha256二进制数据转换为十六进制(HEX)表示形式。 然后从生成的HEX字符串中得到一个数字。 我们得到将结果数除以门票数(all_tickets)的余数,然后将结果加1(将all_tickets数设为1)。 结果,我们获得了获奖者的序列号。
  6. 如果根据抽奖条款有多个获奖者,那么我们将重复前次操作,其金额等于奖品的数量。 同时,每次我们从列表中删除已经中奖的票证并将all_tickets减少1时,我们将指示之前收到的号码而不是S代码。

让我们分析一个具体的现实示例,第119号锦标赛:

只有7张门票(all_tickets)
票价50枚硬币(投注)
游戏费10%(费用)

根据抽奖的条件,有30%的人中了奖,即 在这种情况下,必须获得2张彩票,其奖金的大小是使用公式(Bet * all_tickets-Fee)/ 2计算的。

1.收到的R码: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2.比赛结束后,我们将以成对的形式提供门票清单:数字+地址(从中支付参加比赛的钱包地址)。 请注意,地址可以重复,这意味着一位参加者在一场锦标赛中购买了几张门票,这不受规则的限制。

发送交易日期: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3.请求的S代码:带有注释的FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV (R代码+ TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4.收到的S码: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5.确定获奖者。

6.已发送的付款

结果,我们在区块链中逐步进行了抽奖过程的固定,并可以随时检查抽奖过程。 整理组织者的结果几乎是不可能的,至少它不会悄悄解决。

determine the winner № 1 All_tickets: Index: 1 Ticket:139 Index: 2 Ticket:141 Index: 3 Ticket:143 Index: 4 Ticket:145 Index: 5 Ticket:147 Index: 6 Ticket:149 Index: 7 Ticket:151 1. bin -> hex ( bin2hex(sha256(S-code)) ): Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC -> 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 2. hex -> gmp number: 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 99037963059744689166154019807924045947962565922868104113173478160267437352342 3. gmp -> modulo (mod=7): 99037963059744689166154019807924045947962565922868104113173478160267437352342 -> 4 4. modulo -> ticket: 4 -> 145 determine the winner № 2 All_tickets: Index: 1 Ticket:139 Index: 2 Ticket:141 Index: 3 Ticket:143 Index: 4 Ticket:147 Index: 5 Ticket:149 Index: 6 Ticket:151 1. bin -> hex ( bin2hex(sha256(previous hex)) ): daf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0 2. hex -> gmp number: 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0 -> 67565829218838067182838043983962684143266386786567427968312120473742580659360 3. gmp -> modulo (mod=6): 67565829218838067182838043983962684143266386786567427968312120473742580659360 -> 1 4. modulo -> ticket: 1 -> 139 End. 

Source: https://habr.com/ru/post/zh-CN454102/


All Articles