dice2.win 解析

in #dice26 years ago (edited)

最近一直在关注dapps方面的内容,一些dapps统计想着的网站上面发现了一个骰子游戏
https://dice2.win
他上面介绍是公平,公开的基于以太坊的区块链游戏。
但是以我对以太坊的认识,以太坊现在最大的应用瓶颈就是不能完全产生真的随机数。
所以 我就打算分析一下他的智能合约,理解他的相关流程。
智能合约的下载地址 : https://github.com/dice2-win/contracts
通过阅读他的智能合约,我来说一下我们的游戏的完整流程。
首先网站会在用户下注的时候提交一个随机数的hash,这个数是一个int256类型的。还有一个就是他网站提供了的一个secretSigner签名结果,是为了防止用户修改想着的内容。
当用户下注以下,我们的交易就会被打包到相应的区块里面
最后就是网站用来开奖了,这个也只有网站的 croupier(管理员设置的开奖账号来开奖)
开奖原过程是 croupier 提交他的secret,然后经过sha3和用户提交的commit比对,确认secret是正确的。然后
bytes32 entropy = keccak256(abi.encodePacked(reveal, entropyBlockHash));
最后就是通过secret 和blockhash 的sha3得到最终的随机数entropy

下面就是说说他的玩法和开奖了
他一共有四种玩法,抛硬币 骰子 两个骰子 Etheroll 以太幣过山车
前面三个都是用的mask来比对的,最后的一个用的是rollUnder (都是智能合约里面的变量)
他的mask比对用了一个很简单的办法, 就 是用的 entropy % modulo( entropy表示最终随机数,modulo就是游戏玩法,从合约代码可以知道 抛硬币 =2 骰子=6 两个骰子=36 其实就是表示多少种可能)
抛硬币 就是结果 entropy % 2,然后再执行 2^(entropy % 2),这样就会出现两个结果 2^0 2^1
用二进制表示就是01 10,我们下注就会是相应的 1 或者 2
比如是不是中奖就很简单了 直接(2 ^ dice) & bet.mask != 0 如果满足就是中奖了
第二种玩法 骰子的意思就更加容易明白了,如果就三 就是二进制 100 比如说四 就是1000 ,是几就把的的位置1
比如我们下注是3和4, 我们提交的mask就应该是二进程1100,再把它换成数字 12, 十六进制就是c
https://etherscan.io/tx/0x9577627ac54323ccfce2744f215925a6c764b9e99ccc50d531e426af659af2cd
提交的数据里面就可以看到,我们提交的mask就是c.(这个游戏的modulo是6)
第三个游戏就比较麻烦一点了,我一时没有想明白的,最后我还是把他理解通了
他的情况是两个骰子共有三十六个可能,然后他就把这三十六个数值对这种结果进行了映射,映射如下:
1(第一个骰子) 1-6(第二个骰子) 表示一到六的数字,2 2-6表示7到12的数字,以此类推。
然后它求的合是多少,比如我们下注2,他当然就只有一种情况了,就是 1 1。
比如我下注一个8和9,现在我们就来分析有几种这样的可能
(2 6) (3 5) (4 4) (5 3) (6 2) 8有这么多的可能
(3 6) (4 5) (5 4) (6 3) 9有这几种可能,然后我们把他们全部换成相应的数字
比如(2 6) = (2-1)*6 + 6 = 12 其它的也是一样的算法,就是找他们的位置
12 17 22 27 32 和为8的数字
18 23 28 33 和为9的数字
然后把这些位置的数全部置1 ,就会得到这样的结果110001100011000110000100000000000
然后我们把这个数算出他的结果,我们就用python就很容易算出来


hex(0b110001100011000110000100000000000)
'0x18c630800'


https://etherscan.io/tx/0x037721819a188ec3a58c063b5725a8f0ab3b741d2a9ee7aea785d3c1a4961cfd
这个就是上面操作的区块信息,可以看出算出的结果和我们提交的是一样的。
最后一个游戏就比较简单了,直接就是mod 100,然后比较大小。这里就不多说了

对这个游戏的一些看法:
这个由网站提交一些隐私的数据,再加了区块的hash来产生随机数。这样除非网站和矿工一起合作才能作蔽。增加了随机数的可行性。还算是比较安全的一种方式
但是这样做也有一些不足,就是这种游戏不能脱离网站来运行,也存在随时被关闭的风险。不能完全独立的运行,因为 要网站提交secret程序才能跑起来。
用以太坊网站来做dapps,整体的游戏体验还是不错的,开奖速度还是很快的,整体还是相当的不错,就是怕网络堵影响体验,或者增加了赌博的成本。
还有就是智能合约里面处理了Uncle块,我对这方面不是很熟悉,就没有分析了。为了处理这个东西,增加了很多的代码,并且代码复杂度也明显增加了。希望了解这方面的朋友来补充。

Sort:  

Congratulations @blockchain-fans! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

Award for the number of upvotes received

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

Support SteemitBoard's project! Vote for its witness and get one more award!

Congratulations @blockchain-fans! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 1 year!

You can view your badges on your Steem Board and compare to others on the Steem Ranking

Vote for @Steemitboard as a witness to get one more award and increased upvotes!

Coin Marketplace

STEEM 0.22
TRX 0.20
JST 0.034
BTC 99266.82
ETH 3364.44
USDT 1.00
SBD 3.11