使用随机预言机(以彩票为例)

一天早上,我看到一篇文章,内容是 可验证的随机数生成器 在 Waves 平台区块链上。

整体思路很清晰,但具体实现方法却不清楚。 一些代码、签名、什么、在哪里、为什么?

与预言机作者进行了多次协商,结果可以将绘图逻辑(用 PHP 实现)与获取随机数的算法结合起来。

  1. 在锦标赛/回合开始时,我们向预言机请求代码的第一部分(R 代码)。

    目前,还没有关于玩家人数、奖金名额、奖金金额或彩票是否存在的信息。 预言机通过交易发出个人随机代码,该代码只能使用一次,并且只能由请求的人使用。 顺便说一下,R​​-code 是可以“购买”的(意思是请求交易的成本 + 响应交易对预言机的补偿,按当前汇率计算,这个金额约为 0.015 美元),代码本身是免费发行的) 提前多次,以免稍后等待响应交易的收到。 我在数据库中创建了一个定期更新的小型缓冲区。

  2. 锦标赛通常持续 Waves 平台区块链的 60 个区块,目前约为 1 小时。 如果 60 个区块后至少有两张门票,则锦标赛被视为已完成并关闭,否则锦标赛活动时间将延长至接下来的 60 个区块。
  3. 锦标赛结束后,我们会立即生成并发送一笔日期交易(我们还为此支付大约 0.005 美元的佣金),如有必要,还会发送几笔,其中记录了抽签的所有条件以及有序的玩家列表(门票)我们需要从中选出获胜者。
  4. 在这个阶段,我们已经有了代码的第一部分(R-code)加上交易日期ID(TXID)。 我们以串联的形式(R-code + TXID)将它们发送给预言机进行签名,我们再次支付佣金+补偿。 预言机检查接收到的数据的唯一性和归属性,并作为响应向我们发送 sha256 格式的代码的第二部分(S 代码),这是随机数生成器的起点。
  5. 为了获得指示中奖彩票序列号的随机数,我们将 S 代码从 sha256 二进制数据转换为十六进制 (HEX) 表示形式。 然后从生成的十六进制字符串中,我们得到一个数字。 我们得到结果数字除以门票数量 (all_tickets) 的余数,并将结果加 1(以获取 all_tickets 之前的数字 1)。 结果,我们得到了获胜者的序列号。
  6. 如果根据抽奖的条件,有多个获奖者,那么我们重复前面的操作,金额等于奖品名额的数量。 在这种情况下,每次我们从列表中删除一张已中奖的彩票并将 all_tickets 减少 1 时,我们指示之前收到的号码而不是 S 代码。

我们来看一个具体的真实例子,第119场比赛:

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

根据抽奖条件,奖金的30%,即在这种情况下,必须有 2 张彩票获得奖品,奖品大小根据公式 (投注 * 所有门票 - 费用)/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.

来源: habr.com

添加评论