如何设计基于区块链的可证明公平的在线骰子游戏
在过去,当我们玩传统的骰子游戏时,游戏公平性通常会得到游戏所有者声誉的认可。如果一个非常不走运的球员连续输了10次,他就无法判断他是不是不幸运。
在区块链技术的帮助下,现在我们有办法在技术上设计一个在线可证明的公平骰子游戏。区块链是一个透明的,防篡改的在线分类帐,每个人都可以审核。
我们很高兴看到最近在EOS社区中出现了数十个在线骰子游戏。遗憾的是,他们中的大多数都不是开源的,也不是钻机抗拒的,仍然为潜在的投注留下了不明显的潜在后门,这是冒险的,并且可以在很大程度上得到改善。然而,这些接近来源的骰子游戏确实帮助许多新手拥抱区块链并了解EOS世界的美丽。他们的努力不应该被遗忘,我们感谢他们对EOS生态学的增值。
因此,我们的DappPub团队希望与我们的开源FairDice游戏分享设计,并启发那些有兴趣释放DApps力量的人。
随机性是关键
关键是游戏必须提供一种单一方无法单独控制的组合随机性。
“我如何在智能合约中生成随机数?” |
---|
![]() |
就像BM在StackExchange上面回答的问题所回答的那样,对于一个双方(player
- house
)骰子游戏,提供公平性或防装备随机性的关键点需要一个3步骤的过程:
双方(
player
&house
)提交他们种子的哈希:
hash(player_seed)
&hash(house_seed)
双方揭露他们的
hash(player_seed)
&hash(house_seed)
Roll
=hash(player_seed + house_seed)
最终Roll
是随机的,它是一种基于house
&& player
输入(house_seed
& player_seed
)的组合随机性
2.序列图:理论上的随机骰子滚动过程
根据BM的答案,我们可以绘制理论随机骰子滚动过程的简单序列图,如下所示:
序列图:理论随机骰子滚动过程 |
---|
![]() |
在步骤2中,为每个下注house
创建³³一个新house_seed
的并保持秘密直到步骤10。
在步骤3中,house
计算相应的house_hash
= hash(house_seed)
。
在步骤4中,将house
上传 house_hash
到区块链。在这一刻,player
仍然不知道是什么house_seed
,他但确信house_seed
在这次下注期间不会改变,他因为可以house_hash
在下注后使用 来验证。比喻说,house_hash
就像house
一张放在桌子上的黑卡。
在步骤5中,player
也创造了他的player_seed
。
在步骤6中,player
计算相应的player_hash
= hash(player_seed)
。
在步骤7中,player
上传player_hash
到区块链。在这一刻,house
仍然不知道是什么player_seed
,他但确信player_seed
在这次下注期间不会改变,他因为可以使用player_hash
后来验证。比喻说,player_hash
就像player
一张放在桌子上的黑卡。
在步骤8中,player
将他上传player_seed
到区块链。
在步骤9中,部署在区块链上的开源智能合约验证player_seed
&player_hash
是否匹配。
在步骤10中,house
将他上传house_seed
到区块链。
在步骤11中,智能合约验证house_seed
及house_hash
以查看它是否匹配。
在步骤12中,合约智能计算hash(player_seed, house_seed)
名单最终的卷号。
3.序列图:优化的“FairDice”随机骰子滚动过程
现在我们可以开始构建我们自己的区块链动力骰子游戏了。与其他区块链基础设施相比,EOS在这里是首选,因为它速度快,并提供良好的用户体验。
事实上,优化的全过程,的英文这不必要的player
柯林斯上传player_hash
状语从句:player_seed
在两个步骤。
house
换句话说,因为已经将他的暗牌(house_hash
)放在桌子上并且在下注期间无法改变它,所以player
可以直接将他的开放牌(player_seed
)放在桌子上,而不是将他的暗牌(player_hash
)放在桌子上桌子和player_seed
两个步骤翻转卡()。
因此,我们优化了整个流程并改善了用户体验,如下所示:
序列图:优化的“FairDice”随机骰子滚动过程 |
---|
![]() |
在步骤1中,由于在游戏中引入了“推荐奖金” referrer
,因此ROLL under to win
将一起发送给house
。
在步骤2中,为每个下注house
创建³³一个新house_seed
的并保持秘密,直到步骤9。
在步骤3中,house
计算相应的house_hash
= hash(house_seed)
。
在步骤4中,house
创建house_sign
= sign(ROLL_under, hash(house_seed), expiration_time, referrer)
。
在步骤5,house
发送house_hash
,house_sign
......到player
。
在步骤6中,player
创建他的player_seed
。
在步骤7中,player
将house_sign
与上传player_seed
到EOS区块链。
在步骤8中,部署在EOS上的智能合约检查以防止通过欺骗player
来重放攻击前house_seed
一个house_sign
。
在步骤9中,house
上传house_seed
。
在步骤10中,智能合约验证house_seed
它是否与其匹配,house_hash
以防止偷偷摸摸地house
交换house_seed
。
在步骤11中,智能合约roll
基于player_seed
与计算名单最终数量house_seed
。
欢迎添加我微信沟通学习交流