
Wir erzählen Ihnen weiterhin, wie unsere Laserquest mit der Zerstörung des Servers arrangiert wurde. Beginnend mit dem vorherigen Artikel über das Lösen der Quest .
Insgesamt hatte das Backend des Spiels 6 architektonische Einheiten, die wir in diesem Artikel analysieren werden:
- Backend von Spieleinheiten, die für Spielmechanismen verantwortlich waren
- Backend- und Standortdatenaustauschbus auf VPS
- Übersetzer von Backend-Anfragen (Spielelementen) zu Arduino und Hardware auf der Site
- Arduino, der für die Relaissteuerung verantwortlich war, erhielt Befehle vom Übersetzer und erledigte die eigentliche Arbeit
- Aktuelle Geräte: Ventilator, Girlanden, Stehlampen usw.
- Frontend - die Falcon-Site selbst, von der aus Spieler Geräte steuern
Lassen Sie uns jeden von ihnen durchgehen.
Backend von Spieleinheiten
Das Backend wurde als Spring-Boot-Anwendung implementiert: Es verfügte über mehrere Rest-Controller, einen Websocket-Endpunkt und Dienste mit Spielelogik.
Es gab nur drei Controller:
- Megatron. Die aktuelle Seite von Megatron wurde über GET-Anforderungen gesendet: vor und nach dem Einschalten. Der Laser feuerte eine POST-Anfrage ab.
- , . , ID .
- , - .
Der Websocket-Endpunkt wurde zur Steuerung von Geräten verwendet: Lampen, Girlanden und Buchstaben. Es wurde ausgewählt, um allen Spielern synchron den aktuellen Status des Geräts anzuzeigen: ob es ein- oder ausgeschaltet ist, aktiv oder nicht, welche Farbe des Buchstabens befindet sich jetzt an der Wand. Um das Einschalten des Lasers etwas zu erschweren, haben wir die Berechtigung für die Girlande und den Laser mit demselben Admin / Admin-Login und Passwort erteilt.
Spieler könnten es testen, indem sie die Girlande einschalten und dasselbe mit dem Laser tun.
Wir haben ein so triviales Paar von Login-Passwörtern gewählt, um die Spieler nicht mit unnötiger Auswahl zu quälen.
Um die Aufgabe etwas interessanter zu gestalten, wurden Objekt-IDs von mongodb als Kennungen für Geräte im Raum verwendet.
ObjectId enthält einen Zeitstempel: zwei zufällige Werte, von denen einer basierend auf der Gerätekennung und der zweite basierend auf dem PID-Prozess, der ihn generiert, und dem Zählerwert verwendet wird. Ich wollte die Identifikatoren in regelmäßigen Abständen und aus verschiedenen PID-Prozessen erzeugen, aber mit einem gemeinsamen Zähler, damit die Auswahl der Identifikatoren des Lasergeräts interessanter war. Am Ende haben jedoch alle mit Bezeichnern begonnen, die sich nur im Wert des Zählers unterscheiden. Vielleicht machte dies die Bühne zu einfach und erforderte keine Analyse der Struktur von objectId-Bezeichnern.
Übersetzer von Backend-Anfragen
Python-Skript , das sich mit Timern befasste und von Spielabstraktionen in ein physisches Modell übersetzte. Zum Beispiel "Stehlampe einschalten" → "Relais N2 einschalten".
Das Skript stellte eine Verbindung zur RabbitMQ-Warteschlange her und übermittelte Anforderungen aus der Warteschlange an Arduino. Es wurde auch die Logik des parallelen Einschaltens des Lichts implementiert: Zusammen mit einigen Geräten wurde das Licht eingeschaltet, beispielsweise als der Megatron anfänglich mit Strom versorgt wurde, wurde er mit Bühnenlicht beleuchtet. Das Lichtdesign für eine filmische ganze Szene ist eine separate Geschichte über die großartige Arbeit unseres Projekt-Co-Produzenten und Produktionsdesigners Ilya Serov, und wir werden in einem separaten Beitrag darüber berichten.
Der Übersetzer war auch für die Logik verantwortlich, den Aktenvernichter per Timer zu starten und das Bild an den Fernseher zu übertragen: den Timer zum Starten des Aktenvernichters, die schreiende Capybara, die Anzeige am Ende des Spiels.
Wie die Logik zur Erzeugung des Megatron-Tokens angeordnet war
Testaufnahme
Alle 25 Sekunden wurde ein neuer Token generiert, mit dem der Laser 10 Sekunden lang bei einer Leistung von 10/255 eingeschaltet werden konnte. Link zum Github mit Megatron-Code .
Dann wurde der Laser 1 Minute lang abgekühlt - während dieser Zeit war er nicht verfügbar und akzeptierte keine neuen Anfragen für einen Schuss.
Diese Kraft reichte nicht aus, um das Seil zu durchbrennen, aber jeder Spieler konnte von Megatron aus schießen und den Laserstrahl in Aktion sehen.
Der MD5-Hashing-Algorithmus wurde verwendet, um das Token zu generieren. Und das Schema war MD5 von MD5 + Zähler + Geheimnis für den Kampfmarker und ohne Geheimnis für den Test.
MD5 ist ein Verweis auf ein kommerzielles Projekt, das von Pavel, unserem Backender, durchgeführt wurde. Noch vor ein paar Jahren verwendete dieses Projekt MD5, und als er dem Projektarchitekten mitteilte, dass es sich um einen älteren Verschlüsselungsalgorithmus handelt, wurde MD5 von MD5 verwendet. Da wir uns für das maximale Noob-Projekt entschieden hatten, erinnerte er sich an alles und beschloss, eine kleine Referenz zu machen.
Kampfschuss
Megatrons Kampfmodus ist 100% 3W Laserleistung. Dies reicht für 2 Minuten, um das Seil zu verbrennen, das die Kettlebell hielt, um das Aquarium zu zerbrechen und den Server mit Wasser zu füllen.
Wir haben ein paar Hinweise zum Github des Projekts hinterlassen: nämlich den Token-Generierungscode, anhand dessen man verstehen konnte, dass Test- und Kampftoken basierend auf einem Zählerindikator generiert werden. Im Fall des Kampfmarkers wird neben dem Gegenwert auch das Salz verwendet, das mit Ausnahme der letzten beiden Zeichen in der Geschichte der Änderungen in diesem Kern fast vollständig verblieben ist.
In Kenntnis dieser Daten war es möglich, die letzten beiden Salzsymbole zu durchlaufen und tatsächlich herauszufinden, dass dafür Zahlen von Lost verwendet wurden, die in das 16-stellige System übersetzt wurden.
Dann mussten die Spieler den Zählerwert abfangen (indem sie den Testmarker analysierten) und einen Kampfmarker unter Verwendung des nächsten Zählerwerts und des im letzten Schritt ausgewählten Salzes generieren.
Der Zähler wurde einfach bei jedem Testschuss und alle 25 Sekunden erhöht. Wir haben nirgendwo darüber geschrieben, es hätte eine kleine Spielüberraschung sein sollen.
Service für die Interaktion mit Captcha
In der Spielwelt war dies das gleiche Captcha, das geladen werden musste, um den Lüfter einzuschalten und ein Flipchart mit einem Hinweis zu öffnen. Neben der Kamera befand sich ein Laptop mit Lastüberwachung.
Der Dienst berechnete, was in der Überwachung als aktuelle Last angezeigt werden soll: Temperatur und CPU-Lüfter. Metriken wurden an die Zeitbasisdatenbank übergeben und in grafana gerendert.
Wenn in den letzten 5 Sekunden mehr als 50 Anforderungen für die Captcha-Anzeige eingegangen sind, hat sich die Last um fix + eine zufällige Anzahl von Schritten erhöht. Die Berechnung war, dass 100% Last in zwei Minuten erhalten werden konnte.
Tatsächlich war der Dienst logischer als im letzten Spiel: Wir haben den Monitor so eingestellt, dass nur die Drehung des CPU-Lüfters sichtbar war.
Zu Beginn der Quest wollten sie Grafana über die Sokol-Website zugänglich machen. Es enthielt jedoch auch Springboot-Metriken für den Backend-Anwendungsbericht, für deren Bereinigung wir keine Zeit hatten. Daher haben wir beschlossen, den Zugriff darauf zu schließen. Und das zu Recht - zu Beginn der Quest vermuteten einige Spieler, dass die Anwendung im Springboot-Framework geschrieben wurde, und gruben sogar den Namen einiger Dienste aus.
Hosting und Datenbus
Ein Tool zum Übertragen von Informationen vom Backend zur Site, dem VPS-Server, auf dem RabbitMQ gestartet wurde.
Das Backend und der Datenbus wurden auf unserem VPS gespeichert . Die Leistung war vergleichbar mit der des Computers, den Sie auf dem Bildschirm gesehen haben: ein 2-Core-VPS mit 2 Gigabyte RAM. Der Tarif wurde für Ressourcen genommen, da die Spitzenlast nur für wenige Tage geplant war - das tun unsere Kunden, die planen, VPS für kurze Zeit zu laden. Dann stellte sich heraus, dass die Last höher war als wir erwartet hatten und ein fester Tarif rentabler wäre. Wenn Sie eine Quest durchführen möchten, wählen Sie die Tarife der Turbolinie .
Um den Server vor DDoSa zu schützen, haben wir Cloudflare verwendet.
Es sollte gesagt werden, dass der VPS alles mit Bravour überstanden hat.
Arduino, der für die Relaissteuerung verantwortlich war, erhielt Befehle vom Übersetzer und erledigte die eigentliche Arbeit
Dies ist eher ein Thema für den nächsten Artikel über den Hardware-Teil des Projekts: Das Backend hat einfach Anforderungen gesendet, um ein bestimmtes Relay zu aktivieren. Es kam vor, dass das Backend fast alle Entitäten kannte und Anfragen von ihm wie "Diese Entität aktivieren" aussahen. Wir haben dies getan, um die Site frühzeitig zu testen (wir haben noch nicht alle Arduino und Relais gesammelt). Am Ende haben wir alles so belassen.
Vorderes Ende
Wir haben die Site schnell auf Tilde erstellt, es hat einen Arbeitstag gedauert und uns 30.000 des Budgets gespart.
Anfangs dachten wir, wir sollten nur die Site exportieren und die fehlende Logik einbringen, aber wir stießen auf Nutzungsbedingungen, die uns dies untersagten.
Wir waren nicht bereit, die Lizenz zu verletzen, daher gab es zwei Möglichkeiten: alles selbst zu erfinden oder Tilda direkt zu kontaktieren, über das Projekt zu berichten und um Erlaubnis zu bitten, den Code zu ändern.
Wir haben uns für die zweite Option entschieden und sie haben uns nicht nur auf halbem Weg getroffen, sondern uns sogar ein Jahr lang ein kostenloses Geschäftskonto zur Verfügung gestellt, wofür wir sehr dankbar sind. Es war sehr peinlich, ihnen das Design von Sokols Website zu zeigen.
Infolgedessen haben wir dem Frontend eine js-Logik zum Senden von Anforderungen an elementare Geräte hinzugefügt und die Stile der Schaltflächen zum Ein- und Ausschalten von Spielelementen geringfügig geändert.
Site-Design
Suchverlauf, der ein separates Kapitel wert ist.
Wir wollten nicht nur eine altmodische Site erstellen, sondern eine absolut widerliche, die gegen alle grundlegenden Designregeln verstößt. Gleichzeitig war es wichtig, die Glaubwürdigkeit zu bewahren: Er musste die HNO-Geschichten nicht brechen, die Anmaßung des Autors demonstrieren, und die Spieler mussten glauben, dass eine solche Website existieren und sogar Kunden bringen könnte. Und er brachte! Während das Spiel lief, wurden wir zweimal gebeten, Websites zu erstellen.
Zuerst habe ich das Design selbst gemacht und versucht, mehr GIFs und glänzende Elemente einzufügen. Aber mein Mann, ein Designer mit 10 Jahren Erfahrung, sah ihm über die Schulter und wies ihn als "zu gut" ab. Um die Entwurfsregeln zu brechen, müssen Sie sie kennen.
Es gibt verschiedene Farbkombinationen, die ein anhaltendes Ekelgefühl hervorrufen: Grün und Rot mit gleicher Saftigkeit, Grau und Rosa, Blau plus Braun. Infolgedessen haben wir uns für eine Kombination aus Rot und Grün als Grundfarben entschieden, Gifs mit einer Katze hinzugefügt und 3-4 Fotos von Sokolov selbst auf dem Fotobestand ausgewählt. Ich hatte nur wenige Anforderungen: einen Mann mittleren Alters, in einem schlecht sitzenden Anzug, ein paar Größen größer und in der Pose "professionelles Fotoshooting im Studio". Für den Test zeigten sie es Freunden und fragten: "Wie gefällt es dir?"
Bei der Entwicklung des Designs musste sich mein Mann jede halbe Stunde hinlegen und begann, einen Hubschrauber zu fliegen. Pascha versuchte, die Entwicklerkonsole für den größten Teil des Bildschirms zu öffnen, während er das Frontend beendete - er behielt die Augen.
Tatsächliche Geräte
Lüfter und Lampen wurden über Halbleiterrelais montiert, damit sie nicht sofort mit voller Leistung eingeschaltet wurden - so dass der Stromaufbau parallel zur Überwachung erfolgen würde.
Aber wir werden im nächsten Beitrag darüber sprechen, über den Hardware-Teil des Spiels und den tatsächlichen Aufbau der Site.
Bleib dran!
Weitere Artikel über die Suche nach der Zerstörung des Servers
- Beginn des Spiels
- Erster Hinweis
- Wer hat den Aktenvernichter gestoppt oder wie war es notwendig, die Quest mit der Zerstörung des Servers abzuschließen?
