今天介绍一个位于以太坊上的完全分散和自治的赌场Dapps
Eth Roulette
。
在一般的赌场里,只有一个老板经营赌场并获取所有利润。Eth Roulette
允许任何人参与投资运作赌场合约,同时玩家也可以使用这个赌场合同玩轮盘赌。
合约
Roulette Dapps一个分为两个合约: - Roulette - Roscoin
Roulette 合约
如上图所示Roulette
合约是轮盘赌合约,是用于给玩家提供的娱乐合约,先介绍一下轮盘赌的游戏规则:轮盘赌合约允许玩家在0到36之间的数字上押注一定数量的ETH,如果中奖了,那么奖金是投注金额的36倍。轮盘赌的随机数生成是通过与Oraclize完成的,Oraclize是在以太坊上提供预言机的服务。
关于oraclize的详细介绍可以参考这个链接:https://provable.xyz/
Roulette 中有一个players变量保存了player的押注信息
1 | struct PlayerInfo { |
同时Roulette中还有三个事件,用于对外通知Roulette合约中发生的状况
1 | // 玩家投注完成后触发 |
在上图中还有一个maxBet
返回当前可下注的最大金额,为了保障赌场的利润,需要限制玩家下注的的最大金额,为了确定最优的最大赌注大小是什么,以及平衡利润、存活率和可用性。为此,我模拟了轮盘赌游戏中的1000/10000次赌注,并重复此10000次。平均生存率和期末利润如下。
1000 次后
Bet size percentage | Survival rate | Average ending profit |
---|---|---|
0.1% | 100.00% | 2.73% |
0.2% | 100.00% | 5.35% |
0.3% | 100.00% | 7.12% |
0.4% | 99.99% | 11.46% |
0.5% | 98.81% | 14.44% |
0.6% | 95.49% | 19.65% |
0.7% | 87.82% | 21.10% |
0.8% | 79.68% | 29.54% |
0.9% | 68.16% | 33.32% |
1.0% | 56.18% | 30.30% |
10000 次后
Bet size percentage | Survival rate | Average ending profit |
---|---|---|
0.1% | 100.00% | 32.27% |
0.2% | 98.01% | 72.74% |
0.3% | 80.06% | 120.22% |
0.4% | 51.91% | 151.74% |
0.5% | 29.04% | 306.58% |
0.6% | 13.74% | 153.93% |
0.7% | 5.93% | 121.54% |
0.8% | 2.11% | -28.23% |
0.9% | 0.71% | -48.60% |
1.0% | 0.27% | -92.31% |
Bet size percentage 表示赌注的比例,以赌场中的资金总额为参考
Survival rate: 表示实验过程中,赌场未破产次数除以总实验次数,表示赌场的生存率
Average ending profit: 表示实验过程中,赌场盈利情况
对于轮盘赌合同,我们把最大赌注设置为赌场总余额的0.5%,因为这可以在保持长期利润较高的情况下,同时也可以保证较高的生存率,也就是赌场破产率较低。当然也可以选择0.1% ,这样可以保证赌场具有最高生存率,但长期利润不高。
Roscoin 合约
Roscoin是一个ERC20 Token,玩家可以自由买卖,Roscoin是作为投资连接轮盘赌智能合约的一种手段。Roscoin的价值是根据轮盘赌合约的余额和Roscoins的总供应量计算的。
1 | // token价格计算方法 |
由于token的价格来自轮盘赌合约的余额,所以这是一种跟踪赌场业绩并对其进行投资的方法。
实战
使用Dapps之前需要先安装网页钱包MetaMask,安装完MetaMask钱包后,在网页中打开Roulette Dapps,页面会弹出以下界面,Dapps会与安装好的Metamask钱包连接以便于通过MetaMask钱包与以太坊交互,比如:通过Metamask钱包签名交易,向以太坊网络发送交易,查询当前Dapps事件等。
点击连接后就可以使用Dapps了,在主界面中包含两个模块:1. 轮盘赌界面,2. 投资赌场界面。
现在我们看一下轮盘赌游戏怎么玩,首先在页面中填写BetNumber(押注数字),BetAmount(押注金额),填写完毕后点击Bet按钮。
点击Bet后Dapps会调用MetaMask钱包开始签名,Metamask会弹出页面展示Dapps请求签名的信息,用户确认没有问题后,点击确认,之后Metamask会向以太坊发送签名后的交易。
交易发送后,会等待以太坊网络处理,可以在Metamask中看到交易处理状态。
同时也可以在以太坊浏览器Etherscan中查看交易的状态
正如前文所说,Dapps中的随机数是通过oraclize服务提供的,当Dapps中发出一个交易后,oraclize会调用合约中的callback函数,在callback函数中,oraclize会将随机数提供给Dapps
当oraclize返回随机数后,就可以判断这局游戏的结果了,可以通过交易中的事件可以看到,我们押注的数字是18,oraclize返回的数字是0。从事件可以看到这局游戏我们输了。