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

2023-12-12 06:20

本文主要是介绍张蕾:区块链大乐透开源代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一部分

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

 

游戏研发的思路:

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年,区块链世界将会更好玩,无限商机等着你!

 

这篇关于张蕾:区块链大乐透开源代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/483539

相关文章

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

运营版开源代码 多语言跨境商城 跨境电商平台

默认中英双语 后台带翻译接口 支持133种语言自动翻译 支持多商户联盟 一键部署版本 伪静态+后台登陆后缀 源码下载:https://download.csdn.net/download/m0_66047725/89722389 更多资源下载:关注我。

数据库遇上知识图谱、区块链、深度学习

参考资料: https://zhuanlan.zhihu.com/p/33381916 https://www.zuozuovera.com/archives/1062/ 东南大学D&Intel Lab相关ppt 数据库的核心概念——表示、存取、查询 有了数据库是干什么,大概实现的逻辑,特点,才能引申出对当今这些新技术的对比、适应和发展。 目的:研究数据表示、存取数据模型:表示数据的模型,通

区块链技术介绍

一.概述 1.什么是区块链?   区块链是一种分布式数据库技术,它以链式数据结构的形式存储数据,每个数据块与前一个数据块相关联,形成了一个不断增长的数据链。每个数据块中包含了一定数量的交易信息或其他数据,这些数据经过加密和验证后被添加到区块链上。由于每个数据块都包含了前一个数据块的哈希值,因此任何尝试篡改数据的行为都会被迅速地检测出来。 2.区块链技术的起源   区块链的起源可以追溯到

容器第四课,JDK源代码分析,自己实现LinkedList,双向链表的概念_节点定义

package com.pkushutong.Collection;public class Test03 {private Test03_01 first; //第一个节点private Test03_01 last; //最后一个节点private int size;public void add(Object obj){Test03_01 t = new Test03_01();if(fi

【UE4源代码观察】观察Core模块

话题 Core模块是整个引擎中最核心的模块,在之前的博客【UE4源代码观察】可视化所有模块的依赖情况中有统计,它被983个模块引用,恐怕除了第三方的模块外基本所有模块都有引用。我想首先观察其中的内容,然后再做测试:将Core模块拷贝到之前【UE4源代码观察】手动建立一个使用UBT进行编译的空白工程建立的空白工程中,看能否将它成功编译,理论上讲,“核心”不应再依赖太多其他的东西,所以我应该不会再需

【UE4源代码观察】在空白工程中测试跨模块调用函数

目的 在之前的博客【UE4源代码观察】手动建立一个使用UBT进行编译的空白工程中,成功让UBT工作起来了。现在我想要测试编译出的多个模块之间是否能互相调用,我记录下测试的过程。最终工程见 工程GIT链接。 实践 第一部分 首先仿照TestA模块建立TestB模块。 在TestB.h文件中声明了一个函数 int TestBFunc(int x, int y); 并在TestB.cpp中