网上赌场的Provably Fair 可证明公平

tensaix2j(58)
Published in
#cn
Words
545
Reading
3 min
9y

roulette.png

自从比特币崛起后,很多网上的赌场都有用一个叫Provably Fair证明公证的演算方式来证明赌场没有在软件里耍诈。

基本上, 当赌场要开出一系列的结果前, 需要把server seed (seed 是一个用来生成random number 的种子),用 sha256 或 sha512加密后,产生一个server seed hash 显示给 玩家看来证明赌场没有在中途更换结果.

一个结果是如何生成的基本上是靠

  1. Server Seed
    这是赌场提供的, 在开局前需要用sha256/512 加密产生server seed hash 给玩家看。

  2. Client Seed
    这是玩家可以自行提供, 可以增加更多的entropy(信息熵) 进入 random generator。

  3. Nonce.
    这个是每出一个结果就要加 1, 比如说第一个结果加1, 第二个结果加2 以此类推。

有了这三样就可以用 hmac_drbg(server_seed, client_seed, nonce) 生新的random bits, 这些random bits 就可以用来做random number

当一个session 结束后, 赌场才会公开它的 server seed 给玩家看。 玩家就可以用这个server seed + 自己的client seed 在加nonce 去验证结果看看有没有被篡改。

同时, 玩家也可以用那个 server seed hash 来确定server seed 也没有被篡改。

说到 random number generator 的 seed , seed 通常是用一个很大的数目放进去, 最好是64 bit 以上。

曾经就有一个赌场去用一个 32bit 的数字来做 seed , 比如很多缺乏经验的programmer 喜欢用当下时间来做seed 例如 srand( time(NULL))
他们都忘了 time(NULL) 会return 一个32bit integer 的 epoch time 的数目

结果整个赌场被骇客扫光了所有的钱 , 原因是

32 bit 的entropy 太少了, 只有 4,294,967,296 个可能性, 骇客早就有一个lookup map, 只需要完几轮在对照就知道那家赌场的seed 是什么。

所以要写赌场的random number generator 最好是用那些有加密功能的,例如 HMAC-DRBG 和64bit (18446744073709551616)以上的seed 而不是随便一个 srand() 跟 rand()

网上赌场的Provably Fair 可证明公平 | Ecency