dice2.win 解析
最近一直在关注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块,我对这方面不是很熟悉,就没有分析了。为了处理这个东西,增加了很多的代码,并且代码复杂度也明显增加了。希望了解这方面的朋友来补充。
Congratulations @blockchain-fans! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :
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
Congratulations @blockchain-fans! You received a personal award!
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!