张蕾:区块链大乐透开源代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/uP1aXoY0D7Uq6wH/article/details/85346913


第一部分


上周写了一篇关于区块链博彩游戏的文章,受到了一些“同行”的攻击。为了表示我和他们是“同流合污”的,我准备研发一款区块链大乐透游戏,纯属娱乐,让大家感受一下技术的魅力。

游戏研发的思路:


1)基于去中心化架构,没有中心也就没有庄;


2)概率平均,代码开源,让所有参与的人都看清规则;


3)玩法简单,一键操作,每轮周期很短;


4)资产安全,无论输赢,没有人能耍赖。





第二部分



我们先从现实生活中的“抛硬币”开始我们的游戏设计。

两个人A和B打赌10块钱:B说我要“正面”(头像朝上),A说我要“反面”(头像朝下)。当硬币落地的时候,他们俩立刻就知道了谁赢谁输,他们都确信这个结果是随机的,谁也不能影响结果的产生。



抛硬币游戏之所以能够成立,首先是抛硬币的物理过程,使双方都相信这个游戏是公平的,而且输的人也能付得起钱(输了不给钱,会被打的);但是缺点就是双方必须同时在场。

如果我们把这个游戏搬到网络上,A抛了硬币,但是B在网络另一端看不到,就不会信任结果是公平的。


还有一个因素,就是线上游戏不能对输的人进行强制措施,也就无法保证赢的人能得到赔付。


下面我们看看如何解决这两个问题:

比特币出来后,就有一些基于比特币的投注游戏,最著名的是Satoshi Dice,它的解决方式是依赖一个可信的第三方:


1)抛硬币的过程(也就是计算的过程)是在中心服务器完成的,参与方A和B都能看到相同的运算结果,但是不能保证运算的随机性和公平性;


2)另外A、B双方都要把足额的赌注预先存入中心服务器上进行担保,虽然这样保证了输的人自动赔付,但是这种中心化资金池的风险很大。

我们的研发思路,是找到一个“去中心的、安全的、多方计算模式”:


1)各个参与方都要提交一些数据,所有节点将这些数据下载到本地进行计算。计算虽然是分散的,但是结果都是一致的,而且结果都是大家认可的。


2)同时,赌注放在各自钱包里,不需要提前存入资金池,但是输的一方必须要赔付赢的人。

我们要设计一个程序:既可以进行博彩计算,还要能够操作金钱。(相当于赌场发牌手+筹码兑换+保安)


第三部分



先普及一个基础知识:哈希承诺

在线下的博彩场景中,比如扑克牌游戏,每人抽取一张扑克牌,扣在桌面上,自己可以看,但是对手看不到。然后大家都翻开手里的扑克,比大小算输赢。


这里最大的一种作弊行为,就是在最后翻牌的时候偷换手里的牌,这个在博彩类的电影中经常看到(俗称出老千)。

在网络环境中,我们可以使用哈希函数作为参与者的一种“承诺”,承诺自己没有换牌。


它的过程是这样的:


每个人选择一张牌或一个数字x,必须要公开相对应的哈希值H(x)。最后当所有人都翻牌时候,再公布自己的x,其他人就可以计算H’(x)是不是等于刚才公开的H(x),也就是证明是否换牌了。当然,公开H(x)后,其他人是不能通过H(x)反向推倒出x来的。


我们现在通过这种哈希承诺机制,来实现一种博彩游戏。(看下图)


640?wx_fmt=png



A、B、C三个人参与一个游戏,每人先独立选择一个随机数。第一轮每人都要公开自己的H(x/y/z),承诺自己不会换牌。第二轮每人再公布自己的x/y/z。

然后每个人分开计算:H(x⊕y⊕z) % 3。求模函数保证每个人的胜率不超过三分之一,而且运算后,结果只能是0、1或2。如果结果是0,那么就是A赢(其他类似)。

因为x/y/z都是公开的,而且前面也经过哈希承诺,保证不能换牌,其他的算法都是公开的,所以博彩计算是在各个节点分开计算的,但是结果一定是一样的,而且大家都认可结果的公平性。


现在的问题是,在网络环境下,各个节点之间的数据传输存在延迟,数据公布也不是同步的。


比如A、B先公布了自己的X、y,这时候C还没有公布,但是他一计算,即便是公布了z,C也是输的,他就有可能不主动公布或者以掉线或关机的方式离开网络。A、B就不知道什么原因无限期等待,造成博彩游戏的中断。


下面我们来优化我们的游戏规则。


我们希望每一个哈希承诺都是有时间限制的,叫做“定时承诺”。

       

比如A对B发起一个定时承诺,A用区块链交易脚本的方式构建一个债券。这个债券最终有两者归属可能。

在一定时间后,这个债券将归属B。或者

在这个时间之前,A公开自己的x,就可以赎回自己的债券。


640?wx_fmt=png


我直接写成区块链脚本代码就是:


scriptPubKey:

 

OP_IF

 

<AlicePubKey>  OP_CHECKSIGVERIFY  <BobPubKey>  OP_CHECKSIG

OP_ELSE

 

<AlicePubKey>  OP_CHECKSIGVERIFY OP_HASH  <H(x)>  OP_EQUAL

OP_ENDIF

 

 

scriptSig for Case 1:

<BobSignature>  <AliceSignature>  0

 

scriptSig for Case 2:

x  <AliceSignature>  1

我们如何把这个定时承诺应用到博彩游戏中?


就是在游戏前,任意两个人之间建立一个定时承诺,任何人在截止日期前不透露他们的随机数字,将被没收一笔保证金,用于补偿其他两名玩家。

这种机制可以同时解决我们博彩游戏中公平性和赌注赔偿问题。


它显著的优势就是,技术难度低,目前在比特币或北斗链这些公开区块链平台上都可以实现。

它目前的缺点是:


1)需要任何两个人之间都要建立定时承诺,因此计算复杂度是 O(N的平方);


2)每个人承诺的债券比游戏的赌注要大。



因此,这种方案适合人数较少的博彩游戏。


第四部分


现在区块链上的博彩游戏已经很多了,大都采取了以上的思路。但是想运营好一个博彩游戏还是很难的:

1)技术上的公平性,怎么能让玩家相信你的公平性。所有的博彩游戏都会宣称自己是公平的,对于普通玩家来说没有技术的辨识能力;

2)博彩游戏这么多,为什么来你这里玩呀?


这就需要我们在公平性、随机性、体验感、资产安全方面进行综合设计。

虽然EOS和ETH平台上,博彩类Dapp很多,但是真正的去中心化架构、规则公开透明、没有资金池、资产完全由个人控制的博彩平台还没有,这里面有很大的市场空间。

欢迎有资源的朋友一块合作。对于有创业想法的朋友,欢迎加入北斗昆仲会,我们用下面孵化的方式,共同建立一个游戏平台,从技术领先发展到运营领先。

2019年,区块链世界将会更好玩,无限商机等着你!


猜你喜欢

转载自blog.csdn.net/uP1aXoY0D7Uq6wH/article/details/85346913
今日推荐