开创性的区块链操作系统项目——去中心化的战舰游戏
Posted BlockFinance
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开创性的区块链操作系统项目——去中心化的战舰游戏相关的知识,希望对你有一定的参考价值。
卓有成效的开发人员 Lachezar 说,他开始使用区块链的时候很容易。Cartesi 提供了很多开发文档,他能够通过实际开发他的去中心化应用程序来获得大部分区块链知识,而不用先学复杂的 Solidity。Blockchain OS为 Lachezar 等开发人员提供了 Linux 操作系统:可以在其上运行的框架、语言和库。这意味着可以自由地将他的想法在区块链上变为现实,而不会受到 Solidity 的限制。
对于 Lachezar 来说,这不仅是一次有趣的经历,而且也是他帮助其他人加入区块链的机会。
不需要 Solidity
“我喜欢区块链操作系统的地方在于,我真的不需要处理区块链。我能够使用我已经熟悉的编程语言,例如C++、Python和javascript,这太棒了!Cartesi Machine隐藏了区块链所有复杂的一面,这使得开发变得更加容易。
我对 Solidity 没有多少实际的经验,我参加了一个基础课程来了解 Solidity ,发现它的功能非常有限,在某些时候,我需要更高的表达水平,例如解析字符串。在 Solidity 中,我不能只使用 Python 的 substring 方法。因此,当 The Blockchain OS 为我提供完整的Linux 操作系统时,我感到很自由。我能够使用在 Linux 上运行的框架、语言和平台,而不会感到困难或受限。”
一款去中心化的战舰游戏
“经典战舰游戏的在线版本,保密是非常重要,如果你弄清楚了其他玩家的棋盘,你就会立即获胜。战舰游戏的在线版本中,你必须相信处理游戏的服务器不会对你做任何虚假的事情;例如,它不会放弃你的权利。
一般来说,战舰游戏中有很多作弊行为(只需要谷歌,你就会看到)。对于像我正在构建的去中心化版本,我们使用了这个协议,在该协议中,我们加密了棋盘配置并在游戏开始时发送它,这样没有人可以看到棋盘,但他们也不能谎报最初船位的内容设置。
在游戏过程中存在信任,但如果发生争执,例如当玩家 A 认为对方在作弊时,玩家 B 必须透露他们的实际棋盘是什么。区块链将显示谁是对的。因此,尽管在区块链上,但玩家无法访问彼此的位置,因为它一直被加密直到游戏结束。”
提升处理能力
“用少量的处理能力去创建一个去中心化游戏是比较难的。解密整个棋盘意味着你必须经历所有的动作,你必须从头到尾重现所有的游戏验证。这根本不适合单个区块链交易,因此你必须执行多个操作,分块处理。而且你必须在进行下一个块之前确保每个事务处理都是正确的。
使用区块链操作系统,由于其强大的处理能力,你可以一次处理整个游戏。不用担心它变成受限的区块链交易更小的块。”
战列舰的未来
“目前,我们的目标是使第一版游戏稳定推出,一个传统的版本。但在不久的将来,我们相信可以实现多人版本,或者具有各种自定义特色的版本。例如,玩家可以决定改变棋盘的大小,使他们可以玩各类战船,而且可以增加额外的潜艇,并创造具有特定功能的战船,例如在每个特定部分受到 2 次命中之前炸毁,或一次炸毁两个方格的炸弹。
开发者可以通过构建我们的游戏,让这款经典的游戏更加精致。此外,我们正在构建一个用于开发回合制棋盘游戏的平台。使用我们的框架,人们将能够更快地开发棋盘游戏,因为他们将从高层次的技术开始。
可以想象一下,你即将可以使用机器来创建与你对战的战舰机器人,或者使用数学中的概率来确定游戏中即将发生的事情。你甚至可以将包括风和天气的元素设置进现实生活中。在游戏中创建这些更复杂的因素是很有趣的,并使其成为更丰富的用户体验元素。”
好的、坏的和丑陋的NFT
“当然,所有这些伟大的船只和定制的资产都可以变成NFT。NFT 本身是去中心化的,因为它是一种链上资产。这是我学到的东西,NFT 所代表的的不全是去中心化的。游戏平台可以将一个非常强大的 NFT 变成一个糟糕的 NFT,只需在服务器上翻转它们的含义,而无需社区中任何人对此表示同意。
很多时候,玩家经常因为他们最喜欢的角色或物品之一被削弱而感到沮丧,他们在这件事上没有发言权。因为别无选择,你要么继续玩,要么放弃。使用区块链游戏,如果你不同意开发人员所做的更改,你可以坚持使用你正在玩的版本。或者你可以创建自己的版本!”
游戏社区力量
“平衡游戏是具备挑战性、重要性的,并且通常以集中的方式完成。比如,我匹配到一个比我战斗力强,且我没有的超级战舰,我绝对会输,因为我被碾压了。事实上,这种情况在开发的时候已经被屏蔽了。。
但是通过区块链和去中心化治理,你可以让玩家使用DAO投票支持平衡。因此玩家可以决定集体增加特定船只的力量,或者集体削弱它。通过这种方式,游戏社区正在推动游戏的平衡。这与中心化游戏非常不同,在中心化游戏中,开发者必须是游戏的管理者,增加或减少游戏的力量或其他东西以达到某种平衡。现在我们可以让社区这样做。”
关于Cartesi
Blockchain OS 是一个分散的第 2 层基础设施,支持 Linux 和主流编程软件组件。 使得开发人员可以第一次在Blockchain OS上使用丰富的传统软件工具、库和他们习惯的服务编写可扩展的智能合约,Cartesi 弥合了主流软件和区块链之间的差距。
Cartesi 正在引领数百万新创业公司及其开发人员加入并使用区块链操作系统,同时将 Linux 应用程序纳入其中。 凭借开创性的虚拟机、Rollups和侧链,Cartesi 为所有开发人员铺平了道路,以帮助他们进入区块链的世界并构建下一代区块链应用程序。
Cartesi在此诚挚的邀请所有人,请和我们一起来到区块链操作系统的世界,一起探索未来。
区块链游戏项目(战舰游戏)基于layer2区块链技术,使用以太坊的solidity语言, 含全栈完整源码
这里介绍一个基于区块链以太坊开发的战舰游戏项目。做这个项目的初衷是对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语言, 含全栈完整源码