这里介绍一个基于区块链以太坊开发的战舰游戏项目。做这个项目的初衷是对layer2区块链技术的proof-of-concept。因此,本项目是一个可以在每一个人的电脑上面执行的demo。为了让大家也能执行该程序,本人在文末放置了完整源码,同时也说明了项目配置细节和技术。

先看该游戏执行时的一个动图:

使用的编程技术有:

  • HTML; Javascript; CCS; (网页前端)
  • Web3 (提供了调用智能合约的js接口)
  • ganache-cli (在本地模拟以太坊节点)
  • remix (以太坊智能合约的IDE)
  • Solidity (智能合约编程语言)

具体的环境配置请阅读本人的上一篇文章: 区块链/以太坊/智能合约solidity,全栈开发区块链借贷记账小应用,含完整源码

游戏规则

该游戏名称是“Battleship game”,游戏的规则有很多变种,这里只使用最简单的。具体为:

每一个玩家都可以看到上图所示的页面。该页面分为两部分,下面部分表示当前玩家的棋盘信息,开始的时候,该玩家随机选择两个格子,用于放置两个战舰;上面部分显示对方玩家的棋盘信息,除了对方玩家的战舰位置。开始的时候,上面部分的棋盘是空的。游戏开始之后,两个玩家轮流猜测对方的战舰的位置,每一次只能猜一个方格。如果对方的战舰不在所猜测的方格中,那么就会在对应位置显示一个水花的图像;反之,则出现一团火的图像。因为双方看不到对方的棋盘,因此,每一次都需要对方玩家回复“所猜测的方格是否有战舰”(我们可以采用密码学的技术检测出对方是否撒谎)。当某一个玩家率先猜中了对方两个战舰的位置,该玩家就赢了,并可以收取自己和对方的赌注。

这里为了便于演示,将所有的棋盘放到一个页面上。

技术细节

这里使用了layer-two区块链协议,使得不需要每走一步棋都要访问区块链和更新区块链的状态。因此,这样可以节省交易手续费和时间。比如,现在以太坊一个交易被打包进区块的时间是13秒左右,如果还要确定该区块确实被包含到区块链中,还需要更长时间来确认;并且,当前时间点的以太坊的一个平均交易费用是11美元,可贵了。因此,如果每走一步棋都要将状态保存到区块链中,是缓慢和不经济的。估计不会有人愿意使用几个小时玩这样的游戏吧。为了解决这个问题,我们使用state channel技术。在正常情况下,一个玩家只需要更新区块链状态两次(游戏开始和结束的时候)。在游戏中途,如果有某一个玩家耍赖,比如中途离开或者撒谎,他们再使用智能合约来解决这些争端(dispute),以确保公平。

下图显示,如果使用layer1的区块链技术,每走一步棋都需要向区块链发布一个交易。

下图所示的正是我们使用的方式。

一个问题:如何检测对方玩家撒谎? 具体为,每一个玩家在游戏开始前都需要随机指定两个格子,表示两个战舰的位置,如果某玩家中途变卦,不承认自己所指定的那两个格子呢?再者,当前玩家猜测对方玩家战舰所在的方格位置,对方玩家需要回复该方格下是否有战舰,如果对方玩家不诚信呢?我们使用了Merkle tree进行commit(承诺)。介绍merkle tree(形如下图)不属于本文的范围。

根据密码学中的hash函数的特点,任意一个节点的变化都会导致根节点变化。并且,我们能够很容易证明某一个节点是否属于该merkle tree。

这里,我们对两位玩家的所有的游戏方格分别生成两棵merkle tree,叶子节点表示方格的编号。这里为了保密性,在编号后面合并一个随机数(合并后的数据作为hash函数的输入)。

因此,解决方法是,在玩家指定两个战舰的位置之后,需要生成一棵merkle tree,并向对方发送根节点。该根节点便是对方的承诺,且它不会泄露战舰的位置信息。在游戏过程中,如果要揭露某一个方格下是否存在战舰,需要将对应编号的叶子节点和从该节点到根节点的路径信息发送给对方。若对方能够构造出相同的根节点,证明该玩家是诚信的。(这里涉及到了密码学hash函数的知识)。

另一个问题:如果一个玩家a中途离开,怎么办?
当前实现的功能:需要玩家b向智能合约中提交一个控告。为了回应该控告,玩家a要在一分钟之内调用智能合约,取消掉该控告。如果一分钟之后玩家a不回复,那么玩家b就可以取走所有的赌注。

区块链和智能合约的作用

在这个游戏中,智能合约充当了裁判的角色:若某个玩家撒谎或者中途离开,那么智能合约就会把赌注给另一个玩家。因此,本质上区块链中的智能合约解决了信用问题,并且,重要的是,不需要依赖任何可信的第三方。游戏玩家不需要相信任何人:不用担心对方不诚信,不用担心游戏平台和对方玩家勾结;不用担心自己的赌注莫名奇妙就被取走;不用担心游戏平台宕机。

下图表示的是智能合约的fields,也即是智能合约需要保存的数据。我们保存了两个玩家的地址,赌注的数量,游戏状态,最终赢家的地址,两个merkle tree的跟节点,超时不回复的数据等等。

该项目还实现了下图红圈所示的功能。

  • Forfeit Game,表示当前玩家放弃该游戏,包括赌注。(已实现)
  • Claim Win,在当前玩家猜中对方两个战舰之后,点击该按钮就可以取走所有的赌注。(已实现)
  • Accuse Cheating,原本的功能是当发现对方玩家撒谎时,将撒谎的数据发布到智能合约中,让智能合约裁决。如果读者想要实现该功能,需要注意,某一个玩家在向对方发送数据前,需要对该数据签名,以避免耍赖。因此,当某一个玩家要求智能合约裁决时,智能合约需要验证相关签名。(未实现)
  • Accuse Timeout,控告对方玩家中途离开;(已实现)
  • Respond to Accusation, 当当前玩家被控告时,该玩家需要在一分钟内点击该按钮,表示自己在线,来回复控告。(已实现)
  • claim timeout winnings,如果被告人没有在一分钟之内回复,就可以点击该按钮来取走所有的赌注。(已实现)

需要完善的地方

很明显,这个项目只是一个demo。它距离真实的游戏还有很长的路:

  • 首先,需要将两个玩家的棋盘放到两个页面中,让两个玩家相互看不到对方。
  • 页面还不够友好,比如点击某一个按钮之后,没有弹框显示执行结果。
  • 开始游戏之后,缺少页面UI来重置游戏。目前,需要进入remix来点击函数“clear_state_test”来重置游戏 (如下图所示)。
  • 因为只是为了proof-of-concept,本人没有严格检查智能合约的安全性问题。

项目环境搭配和本地代码执行

请参考本人上一篇文章来搭建项目环境:https://liangyihuai.blog.csdn.net/article/details/115913338


因为该项目是在斯坦福大学课程的一个项目作业的源码之上编写的,如果我把源码放到GitHub上面,那位教授肯定很不开心,因此,本人把完整的源码放到了CSDN资源下载页面中。

下载页面(包含智能合约):https://download.csdn.net/download/liangyihuai/18418646

谢谢

区块链游戏项目(战舰游戏)基于layer2区块链技术,使用以太坊的solidity语言, 含全栈完整源码相关推荐

  1. 区块链技术之以太坊ETH白皮书

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 基于中本聪区块链比特币1.0之后,天才少年Vitalik Buterin(V神)在2013年年末发布了以太坊白皮书,其实 ...

  2. V神又在操心区块链技术落地,以太坊大涨!

    V神又在操心区块链技术落地,以太坊大涨! 12月1日,以太坊联合创始人 Joseph Lubin 连发20条推特,详细阐述了区块链技术和去中心化现状.在他认为,如今的以太坊社区比以往任何时候都更加健康 ...

  3. 区块链开发(二)部署和运行第一个以太坊智能合约

    区块链开发(二)部署并运行第一个以太坊智能合约 李赫2016年8月22日 本文首发8BTC 网络上不少部署智能合约的文章,但是都有一个共同的特点,就是采用命令行的方式来部署,先是建立SOLC的编译环境 ...

  4. 区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-熊丽兵-专题视频课程...

    区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-103人已学习 课程介绍         区块链开发技术进阶-深入详解以太坊智能合约语言 solidity视频培训教程:本课程是 ...

  5. 基于IPFS去中心化相册以太坊Dapp

    Dapp-IPFS-Image 基于IPFS去中心化相册以太坊Dapp 注意: 使用该 github 克隆到本地, 需要 执行 $ npm install 安装依赖 node_modules 安装IP ...

  6. HTML实现怀旧小游戏,超级玛丽、飞机大战…等十余款【完整源码分享】

    HTML怀旧小游戏 介绍 超级玛丽.飞机大战.赛车.俄罗斯方块.飞翔的鸟.王校长热狗飞机大战.植物大战僵尸.冒险岛.塔块游戏.五子棋.贪吃蛇 怀旧小游戏,简单HTML实现,可下载修改代码调整难度,增加 ...

  7. C#毕业设计——基于C#+asp.net+sqlserver的客户关系管理系统设计与实现(毕业论文+程序源码)——客户关系管理系统

    基于C#+asp.net+sqlserver的客户关系管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于C#+asp.net+sqlserver的客户关系管理系统设计与实现,文章末尾 ...

  8. 【java毕业设计】基于javaEE+原生servlet+tomcat的教师工资管理系统设计与实现(毕业论文+程序源码)——教师工资管理系统

    基于javaEE+原生servlet+tomcat的教师工资管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于javaEE+原生servlet+tomcat的教师工资管理系统设计与实 ...

  9. 基于JAVA融呗智慧金融微资讯移动平台小程序端计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVA融呗智慧金融微资讯移动平台小程序端计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVA融呗智慧金融微资讯移动平台小程序端计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技 ...

最新文章

  1. js中Dom元素及获取方法
  2. 【分享】计算机视觉方向必备opencv基础知识总览
  3. 别瞎操心了!机器人根本不会抢你的饭碗
  4. 【Android开发经验】android:windowSoftInputMode属性具体解释
  5. 使用Seata彻底解决Spring Cloud中的分布式事务问题!
  6. ai去除水印_ai全自动视频剪辑软件,每天批量制作800条原创视频!
  7. 你们数学老师当年是怎么叫这些符号的…
  8. mysql视图,总结
  9. Oozie 安装及 examples app 的使用
  10. linux中找不到vim命令
  11. 软考网络工程师必过教程---必看
  12. 什么是TCP粘包?怎么解决TCP粘包问题?
  13. OutMan——C语言中的冒泡排序、选择排序、折半查找以及指针的介绍
  14. Android Camera高级特性——手动对焦
  15. 蚂蚁金服副 CTO胡喜:从 BASIC 到 basic ,蚂蚁金服十五年技术架构演进之路
  16. SPOJ的账号注册方法
  17. GridView合并表头单元格
  18. 帮网管省心省力的koomail公共地址薄
  19. 简单操作破解PDF加密文件
  20. 高中计算机学校分数线,高中职校录取分数线

热门文章

  1. 数据结构—二叉树线索化(线索化的先序、中序、后序遍历)
  2. 微信分享打不开分享界面
  3. Social Justice Awards秋季赛学霸怎么理解?
  4. 关于小程序订单中心页设置的公告
  5. c语言讲两个数组合并_两列数据相互去掉重复值后合并
  6. HP-UX 11.31 安装RAC 添加共享磁盘的问题(两种办法)
  7. 如何推广微信公众号 微信公众号推广技巧
  8. 多维数组VS多维空间
  9. 电信云2020校招-技术笔试题
  10. 还不知道 Puppeteer 的注意了,它能干大事