如何创建有关销毁服务器的黑客游戏的后端



我们继续告诉您如何安排我们的激光追击任务,以解决服务器损坏的问题。从上一篇有关解决任务的文章开始



总的来说,游戏的后端有6个建筑单元,我们将在本文中进行分析:



  1. 负责游戏机制的游戏实体的后端
  2. VPS上的后端和站点数据交换总线
  3. 从后端请求(游戏元素)到站点上的arduino和硬件的转换器
  4. 负责继电器控制的Arduino从翻译器接收命令并完成实际工作
  5. 实际设备:风扇,花环,落地灯等
  6. 前端-猎鹰网站本身,玩家可以从中控制设备


让我们逐一介绍一下。



游戏实体的后端



后端被实现为一个Spring Boot应用程序:它具有几个rest控制器,一个websocket端点以及带有游戏逻辑的服务。



只有三个控制器:



  • 威震天 威震天的当前页面是通过GET请求发送的:开机之前和之后。激光通过POST请求发射。
  • , . , ID .
  • , - .


Websocket端点用于控制小工具:灯,花环和字母。选择该选项可以向所有玩家同步显示设备的当前状态:无论设备处于打开状态还是关闭状态,活动状态与否,墙壁上当前字母的颜色。为了使打开激光的任务稍微复杂化,我们使用相同的admin / admin登录名和密码对花环和激光进行了授权。



玩家可以通过打开花环并使用激光进行测试来进行测试。



我们选择了这样琐碎的登录密码,以免不必要的选择折磨玩家。



为了使任务更有趣,将mongodb中的对象ID用作房间中设备的标识符。



ObjectId包含一个时间戳:两个随机值,其中一个是基于设备标识符获取的,另一个是基于生成它的pid进程和计数器值的。我想使标识符以固定的时间间隔从不同的pid过程生成,但是要使用一个公共计数器,因此选择激光设备的标识符更加有趣。但是,最后,每个人都以仅在计数器值上不同的标识符开始。也许这会使阶段变得过于简单,并且不需要分析objectId标识符的结构。



来自后端请求的翻译



处理计时器并从游戏抽象转换为物理模型的Python脚本例如,“打开落地灯”→“打开继电器N2”。



该脚本连接到RabbitMQ队列,并将请求从队列传递到Arduino。它还实现了灯的并行打开的逻辑:连同某些设备一起,灯也被打开了,例如,当威震天最初通电时,它被舞台灯照亮。关于整个电影场景的照明设计是关于我们的项目联合制片人和制片设计师Ilya Serov的出色作品的单独故事,我们将在单独的文章中讲述。



译者还负责通过计时器启动碎纸机并将图像传输到电视的逻辑:启动碎纸机的计时器,尖叫的水豚,游戏结束时的广告。



产生威震天令牌的逻辑是如何安排的



试射



每隔25秒,将生成一个新令牌,可将其用于以10/255功率打开激光器10秒钟。使用威震天代码链接到github



然后将激光冷却1分钟-此时不可用,并且不接受新的射击要求。



这种力量不足以烧毁绳索,但是任何玩家都可以从威震天射击,并观察正在运行的激光束。



MD5哈希算法用于生成令牌。该方案是来自MD5的MD5 +战斗令牌的秘密+机密,而没有用于测试令牌的秘密。



MD5引用了我们的支持者Pavel制作的商业项目。就在几年前,该项目使用了MD5,当他告诉项目架构师这是一种旧式加密算法时,他们开始使用MD5中的MD5。自从我们决定进行最大的Noob项目以来,他记住了所有事情,并决定提供一些参考。



战斗射击



威震天的战斗模式是100%3W激光功率。这足以在2分钟内烧掉抓住壶铃的绳子,从而破坏水族馆并使水充满服务器。



我们在项目的github上留下了一些提示:即令牌生成代码,通过它可以了解测试令牌和战斗令牌是基于一个计数器指示器生成的。就战斗令牌而言,除了计数器值外,还使用了盐,除了最后两个字符外,盐几乎完全保留在该要点变化的历史中。



知道了这些数据后,就可以对盐的最后两个符号进行迭代,并且实际上发现使用了Lost的数字将其转换为16位数字系统。



然后,玩家必须捕获计数器值(通过分析测试令牌)并使用下一个计数器值和在最后一步中选择的盐生成战斗令牌。



每次测试射击和每25秒简单增加一次计数器。我们在任何地方都没有写过这本书,应该是一个小游戏惊喜。



与验证码互动的服务



在游戏世界中,这是必须加载的同一验证码,才能打开风扇并打开带有提示的活动挂图。摄像机旁边有一台带有负载监控功能的笔记本电脑。







该服务计算了要在监视中显示为当前负载的内容:温度和CPU风扇。指标被传递到时基数据库并以grafana格式呈现。



如果在最近5秒钟内收到了超过50个验证码显示请求,那么负载将由fix +随机的步数增长。计算结果是,两分钟内即可获得100%的负载。



实际上,服务中的逻辑要比最终游戏中显示的逻辑要多:我们将显示器设置为仅显示CPU风扇的旋转。



在任务开始时,他们希望可以从Sokol网站上访问Grafana。但是它还包含后端应用程序报告的springboot指标,我们没有时间清理它,因此我们决定关闭对其的访问。没错,在任务开始时,一些玩家猜测该应用程序是在springboot框架中编写的,甚至挖出了一些服务的名称。



托管和数据总线



从后端向站点传输信息的工具,即启动RabbitMQ的VPS服务器。



后端和数据总线保留在我们的VPS上。它的功能可与您在屏幕上看到的计算机媲美:具有2 GB RAM的2核VPS。由于高峰时段仅计划了几天,因此对资源采取了收费标准-这就是我们的客户所做的,他们打算在短时间内加载VPS。事实证明,负荷比我们预期的要高,固定关税将带来更大的利润。如果您要进行任务,请选择涡轮增压线的运价



为了保护服务器免受DDoSa的侵害,我们使用了Cloudflare。



应该说,VPS经受住了千载难逢的考验。



负责继电器控制的Arduino从翻译器接收命令并完成实际工作



下一篇文章是有关该项目的硬件部分的更多话题:后端只是发送了启用特定中继的请求。碰巧后端知道几乎所有实体,并且来自它的请求看起来像“启用此实体”。我们这样做是为了对站点进行早期测试(我们尚未收集所有的Arduino和继电器),最后我们以这种方式留下了一切。



前端



我们很快在tilde上创建了该站点,花费了一个工作日的时间,为我们节省了3万美元的预算。



最初,我们以为只是导出站点并加入我们所缺少的逻辑,但是我们遇到了禁止我们执行此操作的使用条款。



我们还没有准备好违反许可的规定,因此有两种选择:自行完成所有事情或直接与Tilda联系,介绍项目并要求获得更改代码的许可。



我们选择了第二种选择,他们不仅中途与我们会面,甚至还给了我们一年的免费商业帐户,对此我们深表感谢。向他们展示Sokol网站的设计非常令人尴尬。



结果,我们将js逻辑附加到了用于向基本设备发送请求的前端,略微更改了用于打开和关闭游戏元素的按钮的样式。



网站设计



搜索历史,值得一章。



我们不仅要创建一个老式的网站,而且要创建一个违反所有基本设计规则的绝对令人作呕的网站。同时,保持可信度很重要:他不必打破ENT的故事,展示作者的自命不凡,而玩家则必须相信这样的网站可以存在,甚至可以吸引客户。他带来了!在游戏运行时,我们两次被要求创建网站。



首先,我自己设计,尝试加入更多的GIF和闪亮的元素。但是我丈夫是一位有10年经验的设计师,他抬头看着肩膀,认为他“太好了”。要打破设计规则,您需要了解它们。







有几种颜色组合会引起持续的厌恶感:多汁的绿色和红色,灰色和粉红色,蓝色加棕色。结果,我们选择了红色和绿色作为基本颜色,并为猫添加了gif图像,并在照片库中选择了3-4张索科洛夫本人的照片。我只有几个要求:一个中年男子,穿着不合适的西装,尺寸要大几个,并摆出“在摄影棚里照相的专业照片”的姿势。为了进行测试,他们向朋友展示了该测试,并问:“您感觉如何?”



在设计开发过程中,我丈夫每半小时必须躺下,然后开始驾驶直升机。帕夏(Pasha)在整理前端时,尝试将开发人员的控制台打开到屏幕的大部分位置-他一直保持眼睛。



实际设备



风扇和灯通过固态继电器安装,因此它们不会立即以全功率打开-因此,在监视的同时会发生功率累积。



但是,我们将在下一篇文章中讨论这一点,其中涉及游戏的硬件部分以及网站的实际结构。



敬请关注!



有关服务器销毁的其他文章








All Articles