碰撞游戏结果验证:算法,安全性

1)验证目的:您确切确认的内容

不可更改性:操作员无法在出价后更改结果(以牺牲服务器座椅哈希为代价)。
可重复性:通过输入,您可以获得与游戏相同的乘数。
过程完整性:严格按照规范应用消息格式,"nonce"嵌入式,舍入规则和"house edge"。

2)无法验证的数据

1.Server Seed Hash (commit)-在使用相应的"Server Seed"之前发布。
2.Server Seed(稍后/期末披露)。
3.Client Seed(您的sid;您自己设置它或平台生成)。
4.Nonce(当前的"服务器种子"中的费率计数器)。
5.散列算法(通常为"HMAC-SHA 256"或"SHA-256")。
6.消息格式(例如:' '),精确的分隔符/寄存器/编码。
7.哈希mapping公式→乘数(和舍入规则/最小规则)。

💡整个规格必须位于运营商的Fairness/Provably Fair部分。如果没有什么是红旗(参见第10条)。

3)验证算法(7步)

1.核对commit:计算"SHA-256 (ServerSeed)"并与发布的"ServerSeedHash"进行比较。
2.收集消息:严格采用平台格式(例如"msg=ClientSeed+":"+Nonce")。
3.计算回合哈希:

при `HMAC-SHA256`: `RoundHash = HMAC_SHA256(key=ServerSeed, msg=message)`;
使用"SHA-256":"RoundHash=SHA256(ServerSeed消息)"或规范中指定的。
4.取出随机性:拿起第一个'k'bit(通常是52), →整体'r',然后'u=r/2^k'。
5.应用映射公式:将"u"转换为乘数(根据游戏文档计算房屋边缘/特殊案例)。
6.根据游戏规则四舍五入(例如,最多2个标志,最少1个。00 ×等)。
7.与历史上的回合结果进行比较。匹配=正确的诚实。

4)伪代码(可以改编为Python/JS)

```python
从您的平台插入精确的mapping公式而不是stub_mapping()

import hmac, hashlib, math

def round_hash(server_seed: bytes, client_seed: str, nonce: int) -> bytes:
  • message=f "{client_seed}:{nonce} ".encode("utf-8")格式请参阅BOM
  • return hmac.new(server_seed, message, hashlib.sha256).digest()或hashlib。sha256(...)

def take_u_from_hash(h: bytes, k_bits=52) -> float:
  • 把年长的位作为一个整体r
  • r = int.from_bytes(h, "big") >> (256 - k_bits)
  • return r / (1 << k_bits) u в [0, 1)

def stub_mapping(u: float) -> float:
  • ZAGLUSHKA!更换您的游戏文档中的公式
  • 例如,有时会使用视图转换:crash=floor((const/( r+1)100)/100)
  • 和/或"房屋边缘"作为罕见的强制性1。00×.不要在实际检查中使用此工具。
  • return max(1.00, round(1.0 / max(1e-12, 1.0 - u), 2))

def verify(server_seed_hex, server_seed_hash_hex, client_seed, nonce, shown_multiplier):
  • server_seed = bytes.fromhex(server_seed_hex)
  • 1)Commit
  • assert hashlib.sha256(server_seed).hexdigest() == server_seed_hash_hex.lower()
  • 2-3)哈希回合
  • h = round_hash(server_seed, client_seed, nonce)
  • 4) u
  • u = take_u_from_hash(h)
  • 5-6)mapping+四舍五入
  • calc_mult = stub_mapping(u)
  • 7)比较
  • return abs(calc_mult - shown_multiplier) < 1e-9
  • ```

重要的是:请应用平台的Fairness部分中的精确公式而不是"stub_mapping";否则,验证将是不正确的。

5)私人案件和陷阱

在同一回合中有两个赌注:在许多平台中,"nonce"的每个赌注都会增加,即使它们是在同一回合中完成的(例如:投注A → "nonce=42",投注B → "nonce=43")。检查故事。
更改"Client Seed":更改座位时,通常会重置"nonce"(或开始新流)。检查您的平台规则。
Batchy "Server Seed":一个"Server Seed"在一系列回合中运行,然后发布新的公文。不要溷淆不同时期的种子。
四舍五入/最低限度:第二个符号的不匹配-在90%的情况下,四舍五入/最低限度(例如固定1)规则存在错误。00 ×在香料条件下)。
编码/空格:多余的空格/字符串翻译、不正确的寄存器、非UTF-8断开验证。

6)快速回合检查清单

1."SHA-256 (ServerSeed)"是否与发布的"ServerSeedHash"相匹配?
2."Message"和"nonce"格式是否正确形成?
3.是否严格按照规格应用了算法("HMAC-SHA 256"/"SHA-256")和字段密钥/顺序?
4.图解和四舍五入是否与文档相同?
5.是否考虑特殊情况(罕见的"即时崩溃",最低1。00 ×,帽子)?
6.结果是否与一分钱的游戏历史相吻合?

7)控制自动化(实践)

Logs:保留其"client_seed"、"nonce"序列、时间戳、最终乘数。
Sampling:在"咆哮""Server Seed"之后,偶尔会进行20-50回合;记录匹配百分比(必须是100%)。
回归:更改游戏/提供程序版本时,运行相同的集合。
导出:将CSV/JSON与源代码一起存储是您的"审核跟踪"。

8)安全:如何不弄错,不让自己作弊

在本地/离线检查:不要仅依靠操作员的Web验证器;保持自己的脚本。
不信任没有完整数据包的回合:没有公式/格式-没有验证。
强大"客户端种子":询问随机性,定期更改(这不会提高RTP,但会消除可重现性问题)。
TLS/会话:仅通过HTTPS、2FA、输入跟踪和历史记录上载登录。
不要将"服务器种子"传递给任何人:它由运营商在一段时间后发布;你的任务是钻探,不要提前"提取"它。

9)典型的"新手错误"

字段的顺序混淆("Nonce:ClientSeed"而不是"ClientSeed:Nonce")。
从头开始计数"nonce"而不是1(反之亦然)。
使用了整个平台的哈希(global nonce),需要您的个人"nonce"。
忽略规则四舍五入(银行家的rounding vs floor/ceil)。
与活动而不是已经披露的"Server Seed"进行对账。

10)操作员的"红旗"

在此期间开始之前没有公开的Server Seed Hash。
您无法设置您的Client Seed或查看nonce。
没有将哈希拼写为乘数的公共公式。
回合的历史记录并不能为对账提供最低限度的数据。
格式和算法在没有通知/规范存档的情况下发生了变化。

11)澳大利亚语境(AU)

货币:在AUD中管理收益/投注,存储故事的卸载(支持,有争议的问题)。
负责任的游戏(RG):存款/时间限制,暂停和自我排序-在真正的应用程序中提供;使用它们。
平台实践:在真正的运营商中,"公平性/推广博览会"块包含完整的描述和验证示例;缺乏细节是选择其他服务的理由。

12)结果

验证崩溃游戏的结果是一个明确的过程:

"Server Seed Hash" Commite,
通过"服务器种子","客户端种子","nonce"和算法恢复"RoundHash",
应用已发布的mapping公式和舍入规则,
在您的验证和游戏历史中具有相同的乘数。

保持自己的脚本,编写输入,并定期检查随机回合。所以你不是在言语上确认诚实,而是在数学上确认诚实。