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

in #cn7 years ago (edited)

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()

Sort:  

Congratulations! This post has been upvoted from the communal account, @minnowsupport, by tensaix2j from the Minnow Support Project. It's a witness project run by aggroed, ausbitbank, teamsteem, theprophet0, and someguy123. The goal is to help Steemit grow by supporting Minnows and creating a social network. Please find us in the Peace, Abundance, and Liberty Network (PALnet) Discord Channel. It's a completely public and open space to all members of the Steemit community who voluntarily choose to be there.

If you like what we're doing please upvote this comment so we can continue to build the community account that's supporting all members.

This post has received a 2.58 % upvote from @booster thanks to: @tensaix2j.

Coin Marketplace

STEEM 0.17
TRX 0.15
JST 0.028
BTC 56516.28
ETH 2315.44
USDT 1.00
SBD 2.34