進階教程:CoinPoker透明洗牌技術詳解
探討加密哈希函數如何確保洗牌過程的公正性。透過學習如何使用RNG驗證工具,玩家將能夠驗證自己的參與和洗牌結果,確保每一局撲克遊戲都符合公平透明的標準。
其他分類
到目前為止,線上撲克室一直對其洗牌軟體保持保密。玩家無法驗證這些封閉系統是否以公平的方式洗牌,而這正是 CoinPoker 透明洗牌器所要改變的地方。
透過使用單向加密哈希函數,CoinPoker 全新洗牌器使得我們能夠安全地披露洗牌過程的資訊,並為你提供以下功能:
- 使用 Hand Hindsight 查看未發的牌
- 使用 RNG驗證工具 驗證你自己的貢獻
- 了解我們 RNG 的內部運作
在深入了解透明洗牌技術之前,先看一下我們的簡短教程,幫助你親自體驗這一功能!
如何使用驗證工具證明參與
如果你是第一次接觸我們的透明洗牌器,我們建議你先查看這個基本指南《CoinPoker的透明公開洗牌過程》,裡面附有圖片詳解。
步驟 1:為了證明手牌的公平性,你需要訪問前面提到的單向哈希函數。你可以通過點擊RNG洗牌順序連結,位於手牌歷史標籤頁的底部,來找到這些資訊。

步驟 2:在這裡,你會看到一長串哈希序列。第一部分是初始牌組的順序,接下來是每個玩家和 CoinPoker 的加密種子,最後是最終牌組順序中每張牌的哈希值。

將洗牌後的哈希牌組下列出的數字視為它們在牌組中的位置,而每個玩家的哈希值則是他們在手牌開始時提交的加密“洗牌因子”。
步驟 3:如果沒有驗證工具,這些數據是沒有意義的。你可以通過點擊窗口頂部的連結來訪問該工具。

步驟 4:下一步是驗證手牌,根據你的需求,驗證過程可能有兩種情況:
- 通過證明你參與了“洗牌”來驗證手牌的公平性。
- 驗證最終牌組中一張牌的實際位置是否與你在洗牌前參與確定的加密位置相匹配。
選項 1:
將加密種子或我們稱之為“洗牌因子”的數據輸入到驗證工具中。這些數據由藍色箭頭標記。輸出結果將是“集體洗牌因子”或組合哈希,以及最終牌組順序。

如果它們匹配,就代表你已經成功驗證了你在洗牌中的參與!
選項 2:
選擇一張已發的牌(這些牌的左側和右側分別有一個哈希值和加密哈希函數)。將右側函數中的哈希值輸入到牌卡驗證部分。輸出結果應該是 CoinPoker 左側列出的哈希值,以及正確的牌面值。

步驟 5:盡情享受探索未發牌並證明你參與在線撲克首個去中心化 RNG 系統的樂趣吧!
進階教程詳解:CoinPoker的RNG如何運作
想像一下未洗牌的牌組如下:2♣, Q♦, K♥
實際上這會是 52 張牌的排列,但為了讓你理解這個過程,我們將數量限制為三張。使用這個牌組順序,CoinPoker 將創建初始牌組並與桌上的所有玩家共享,接下來的步驟將依此進行。
步驟 1
CoinPoker 使用一個秘密值來運行其 RNG,我們稱之為種子。這個值僅暫時存在,並僅用於啟動整個過程。
步驟 2
CoinPoker 使用這個隨機種子生成一個鹽值;這是隨機數據,充當單向加密函數的密碼或口令。它與每張牌結合,生成每張牌的哈希值。以之前提到的三張牌為例,公式大致如下:
- Hash(2c + salt1) = aa
- Hash(Qd + salt2) = bb
- Hash(Kh + 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’s_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 使用聚合種子來洗牌初始牌組。最終牌組的哈希值隨後被分發給所有玩家。請注意,這是直到手牌完成之前使用的最終牌組。
初始牌組:Qd, Kh, 2c → RNG with 使用聚合種子 → 最終牌組:Kh, 2c, Qd
(Hashes: cc, aa, bb)
RNG 驗證工具的工作原理
使用加密哈希函數的一個主要優勢是,我們能夠安全地公開有關洗牌的信息,這些信息後來可以用來證明洗牌是否公平。我們稱之為 RNG 驗證工具,接下來我們將繼續介紹步驟,幫助你理解它的工作原理。
請注意,Alice 和 Bob 彼此並不知道對方的真實種子,只能訪問自己的真實種子。他們所能訪問的是其他玩家和 CoinPoker 的所有種子哈希值(請記住步驟 8 和 9)。
手牌結束後,玩家將收到所有參與者的真實種子,他們可以使用這些種子來驗證自己在最終牌組洗牌中的參與情況,以及牌面的隨機性。
步驟 13-18:驗證玩家對洗牌牌組的影響
步驟 13
首先,玩家需要使用每個真實種子來驗證他們擁有的哈希值是否正確。他們通過將真實種子輸入哈希公式,檢查結果是否與實際收到的值匹配。
如果 Hash(Alice_seed) 確實等於 XX,那麼它就被驗證為正確。
步驟 14
一旦所有玩家和 CoinPoker 的真實種子都用於驗證哈希值,玩家還可以通過將缺失的值輸入哈希函數來檢查聚合種子是否正確:
Hash(alice_seed + bob_seed + server_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開源代碼