0%

Roulette Dapps

今天介绍一个位于以太坊上的完全分散和自治的赌场Dapps Eth Roulette

在一般的赌场里,只有一个老板经营赌场并获取所有利润。Eth Roulette允许任何人参与投资运作赌场合约,同时玩家也可以使用这个赌场合同玩轮盘赌。

合约

img

Roulette Dapps一个分为两个合约: - Roulette - Roscoin

Roulette 合约

如上图所示Roulette合约是轮盘赌合约,是用于给玩家提供的娱乐合约,先介绍一下轮盘赌的游戏规则:轮盘赌合约允许玩家在0到36之间的数字上押注一定数量的ETH,如果中奖了,那么奖金是投注金额的36倍。轮盘赌的随机数生成是通过与Oraclize完成的,Oraclize是在以太坊上提供预言机的服务。

关于oraclize的详细介绍可以参考这个链接:https://provable.xyz/

Roulette 中有一个players变量保存了player的押注信息

1
2
3
4
5
6
7
struct PlayerInfo {
address payable player; // 玩家地址
uint256 betSize; // 押注金额
uint8 betNumber; // 押的点数 0~36
}

mapping(bytes32=>PlayerInfo) players;

同时Roulette中还有三个事件,用于对外通知Roulette合约中发生的状况

1
2
3
4
5
6
7
// 玩家投注完成后触发
event Bet(address indexed player, bytes32 qid, uint256 betSize, uint8 betNumber);
// 预言机 返回随机数
event Play(address indexed player, bytes32 qid, uint256 betSize, uint8 betNumber, uint8 winningNumber);
// 玩家押注赢了 通知
event Payout(address indexed winner, bytes32 qid, uint256 payout);

在上图中还有一个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
2
3
4
5
6
7
8
9
// token价格计算方法
function tokenPrice() public view onlyWhenBacked returns (uint256) {
if (totalSupply() == 0 || backingContract.balanceForBacking() == 0) {
return 1 ether;
}
// 赌场总余额 除以 token供应量
return backingContract.balanceForBacking().mul(1 ether).div(totalSupply());
}

由于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。从事件可以看到这局游戏我们输了。