下载
Sarah 12 月 16, 2018

进阶教程:CoinPoker透明洗牌技术详解

探讨加密哈希函数如何确保洗牌过程的公正性。通过学习如何使用RNG验证工具,玩家将能够验证自己的参与和洗牌结果,确保每一局扑克游戏都符合公平透明的标准。

其他分类

到目前为止,在线扑克室一直对其洗牌软件保持保密。玩家无法验证这些封闭系统是否以公平的方式洗牌,而这正是 CoinPoker 透明洗牌器所要改变的地方。

通过使用单向加密哈希函数,CoinPoker 全新洗牌器使得我们能够安全地披露洗牌过程的信息,并为你提供以下功能:

在深入了解透明洗牌技术之前,先看一下我们的简短教程,帮助你亲自体验这一功能!

如何使用验证工具证明参与

如果你是第一次接触我们的透明洗牌器,我们建议你先查看这个基本指南《CoinPoker的透明公开洗牌过程》,里面附有图片详解。

步骤 1:为了证明手牌的公平性,你需要访问前面提到的单向哈希函数。你可以通过点击RNG 洗牌顺序链接,位于手牌历史标签页的底部,来找到这些信息。

步骤 2:在这里,你会看到一长串哈希序列。第一部分是初始牌组的顺序,接下来是每个玩家和 CoinPoker 的加密种子,最后是最终牌组顺序中每张牌的哈希值。

将洗牌后的哈希牌组下列出的数字视为它们在牌组中的位置,而每个玩家的哈希值则是他们在手牌开始时提交的加密“洗牌因子”。

步骤 3:如果没有验证工具,这些数据是没有意义的。你可以通过点击窗口顶部的链接来访问该工具。

步骤 4:下一步是验证手牌,根据你的需求,验证过程可能有两种情况:

  1. 验证最终牌组中一张牌的实际位置是否与你在洗牌前参与确定的加密位置相匹配。
  2. 通过证明你参与了“洗牌”来验证手牌的公平性。

选项 1:

将加密种子或我们称之为“洗牌因子”的数据输入到验证工具中。这些数据由蓝色箭头标记。输出结果将是“集体洗牌因子”或组合哈希,以及最终牌组顺序。

如果它们匹配,就代表你已经成功验证了你在洗牌中的参与!

选项 2:

选择一张已发的牌(这些牌的左侧和右侧分别有一个哈希值和加密哈希函数)。将右侧函数中的哈希值输入到牌卡验证部分。输出结果应该是 CoinPoker 左侧列出的哈希值,以及正确的牌面值。

步骤 5:尽情享受探索未发牌并证明你参与在线扑克首个去中心化 RNG 系统的乐趣吧!

进阶教程详解:CoinPoker的RNG如何运作

想象一下未洗牌的牌组如下:2♣, Q♦, K♥

实际上这会是 52 张牌的排列,但为了让你理解这个过程,我们将数量限制为三张。使用这个牌组顺序,CoinPoker 将创建初始牌组并与桌上的所有玩家共享,接下来的步骤将依此进行。

步骤 1

CoinPoker 使用一个秘密值来运行其 RNG,我们称之为种子。这个值仅暂时存在,并仅用于启动整个过程

步骤 2

CoinPoker 使用这个随机种子生成一个盐值;这是随机数据,充当单向加密函数的密码或口令。它与每张牌结合,生成每张牌的哈希值。以之前提到的三张牌为例,公式大致如下:

  • Hash(2♣ + salt1) = aa
  • Hash(Q♦ + salt2) = bb
  • Hash(K♥ + salt3) = cc

注意:为简单解释,哈希值 aa、bb 和 cc 被简化了。实际上,它们是 256 位字符串,对人类来说处理起来更为复杂。

步骤 3

CoinPoker 使用步骤 1 中的随机种子对步骤 2 中的哈希牌组进行洗牌。

  • 未洗牌的牌组哈希为:aa (2♣), bb (Q♦), cc (K♥)
  • 洗牌后的牌组(初始牌组)哈希现在是:bb (Q♦), cc (K♥), aa (2♣)

步骤 4

CoinPoker 将这个哈希牌组(作为一个向量,包括初始牌组顺序中所有牌的哈希值)发送给每个玩家。

使用哈希值的目的是使我们能够揭示牌组中的某些牌,并允许玩家验证它们,同时避免暴露其他应该保密的牌(例如,已弃牌的手牌)。现在,所有玩家都持有一个哈希值列表,揭示了初始牌组的顺序。

接下来的步骤将涵盖如何利用玩家的输入将初始牌组转换为最终牌组,这些输入与 CoinPoker 的输入结合,形成集体输入(即聚合种子)。同样,这些被称为种子。

步骤 5

为了简化这个过程的复杂性,假设桌上有两位玩家,我们称他们为 Alice 和 Bob。

步骤 6

现在 Alice 和 Bob 需要计算他们的种子的哈希值,并将其发送给 CoinPoker。公式大致如下:

  • Hash(Alice’s_seed) = XX
  • Hash(Bob’s_seed) = YY

步骤 7

CoinPoker 生成一个新的种子,不是步骤 1 中的那个。这个随机种子用于生成一个哈希值:Hash( CoinPoker_seed) = ZZ

步骤 8

玩家的哈希种子,以及 CoinPoker 的哈希种子,随后被汇总成一个承诺种子列表:[XX, YY, ZZ]。

步骤 9

CoinPoker 将承诺种子的向量发送给 Alice 和 Bob。

步骤 10

在收到承诺种子后,Alice 和 Bob 发送他们在步骤 5 中使用的真实种子。这就是用来生成哈希值的种子。因此,Hash(Alice’s_seed) = XX 和 Hash(Bob’s_seed) = YY。

步骤 11

然后,真实的种子被用来创建一个聚合种子。这个新种子考虑了所有玩家的种子以及 CoinPoker 的种子,从而得出一个由整个桌面共同贡献的值。

Hash(Alice’s_seed + Bob’s_seed + CoinPoker’s_seed) = aggregated_seed

步骤 12

CoinPoker 使用聚合种子来洗牌初始牌组。最终牌组的哈希值随后被分发给所有玩家。请注意,这是直到手牌完成之前使用的最终牌组。

初始牌组:Q♦, K♥, 2♣ → RNG 使用聚合种子 → 最终牌组:K♥, 2♣, Q♦
              (哈希值:cc, aa, bb)

RNG 验证工具的工作原理

使用加密哈希函数的一个主要优势是,我们能够安全地公开有关洗牌的信息,这些信息后来可以用来证明洗牌是否公平。我们称之为 RNG 验证工具,接下来我们将继续介绍步骤,帮助你理解它的工作原理。

请注意,Alice 和 Bob 彼此并不知道对方的真实种子,只能访问自己的真实种子。他们所能访问的是其他玩家和 CoinPoker 的所有种子哈希值(请记住步骤 8 和 9)。

手牌结束后,玩家将收到所有参与者的真实种子,他们可以使用这些种子来验证自己在最终牌组洗牌中的参与情况,以及牌面的随机性。

步骤 13-18:验证玩家对洗牌牌组的影响

步骤 13

首先,玩家需要使用每个真实种子来验证他们拥有的哈希值是否正确。他们通过将真实种子输入哈希公式,检查结果是否与实际收到的值匹配。

如果 Hash(Alice_seed) 确实等于 XX,那么它就被验证为正确。

步骤 14

一旦所有玩家和 CoinPoker 的真实种子都用于验证哈希值,玩家还可以通过将缺失的值输入哈希函数来检查聚合种子是否正确:

Hash(Alice’s_seed + Bob’s_seed + CoinPoker’s_seed) = aggregated_seed

步骤 15

现在,聚合种子已经被每个玩家验证为正确,Alice 或 Bob 可以逆向运行 RNG 函数。通过将最终牌组的哈希值和聚合种子输入计算初始牌组,玩家可以检查它是否会得到与步骤 4 中收到的初始牌组顺序相同的结果。

步骤 16

如果结果与初始牌组的哈希顺序匹配,那么玩家就成功地证明了他们参与了最终牌组的洗牌。

证明参与只是第一步。玩家还可以验证最终牌组中的卡片是否具备随机性。这可以应用于所有公共牌和其他玩家揭示的手牌(即无弃牌手牌),但为了说明,我们将展示如何验证前两张牌的公平性:

步骤 17

一旦牌局结束,玩家将收到(除了所有真实种子之外)前两张发牌的盐值和卡牌值。请注意,卡牌值和盐值已在步骤 2 的哈希函数中使用:

Hash(Kh + salt3) = cc

步骤 18

现在,Alice 和 Bob 已经获得了哈希函数中所有变量的值,他们可以逆向计算以确认 Kh 是否为最终牌组洗牌后收到的第一张牌(在步骤 12 中)。

如果 Hash(Kh + salt3) 的结果是 cc,那么玩家确认最终牌组哈希值 cc 是正确的。这个方法可以用于验证桌面上任何已揭示的卡牌。

对于未发出的牌或弃牌手牌,玩家将无法收到卡牌值或盐值。他们将能够访问哈希值,但无法使用此方法揭示这些卡牌。

虽然上述解释对于普通扑克玩家来说已经足够深入,但对于加密学爱好者而言,这仅仅是冰山一角。以下是 GitHub 上开源代码的链接:RNG开源代码

Sarah