サヌバヌを砎壊するハッカヌ ゲヌムのバック゚ンドはどのように䜜成されたか

サヌバヌを砎壊するハッカヌ ゲヌムのバック゚ンドはどのように䜜成されたか
サヌバヌの砎壊を䌎うレヌザヌク゚ストがどのように蚈画されたかを匕き続きお䌝えしたす。 前から開始 ク゚ストを解決する蚘事.

ゲヌムのバック゚ンドには合蚈 6 ぀のアヌキテクチャ ナニットがあり、この蚘事ではこれを分析したす。

  1. ゲヌムメカニズムを担圓するゲヌム゚ンティティのバック゚ンド
  2. VPS 䞊のバック゚ンドずサむトのデヌタ亀換バス
  3. バック゚ンドリク゚ストゲヌム芁玠からArduinoおよび珟堎のハヌドりェアぞのトランスレヌタ
  4. リレヌの制埡を担圓する Arduino は、トランスレヌタからコマンドを受け取り、実際の䜜業を実行したした。
  5. 実際のデバむス: ファン、ガヌランド、フロアランプなど。
  6. フロント゚ンド - プレむダヌがデバむスを制埡する Falcon Web サむト自䜓

それぞれを芋おみたしょう。

ゲヌム゚ンティティのバック゚ンド

バック゚ンドはスプリング ブヌト アプリケヌションずしお実装されたした。バック゚ンドには、いく぀かの REST コントロヌラヌ、WebSocket ゚ンドポむント、およびゲヌム ロゞックを備えたサヌビスがありたした。

コントロヌラヌは XNUMX ぀だけでした。

  • メガトロン。 珟圚の Megatron ペヌゞは、電源を入れる前ず埌の GET リク゚ストによっお送信されたした。 レヌザヌは POST リク゚ストを通じお発射されたした。
  • ペヌゞ名で提䟛されるようにチルダ ペヌゞをマッピングしたす。 チルダは、元の名前ではなく、内郚 ID ずコンプラむアンス情報を含む゚クスポヌト甚のペヌゞを生成したす。
  • 擬䌌高負荷サヌバヌ キャプチャを提䟛するキャプチャ コントロヌラ。

Websocket ゚ンドポむントは、ランプ、ガヌランド、手玙などのガゞェットを制埡するために䜿甚されたした。 これは、デバむスの珟圚のステヌタス (オンかオフか、アクティブかどうか、壁に珟圚点灯しおいる文字の色) をすべおのプレむダヌに同期しお衚瀺するために遞択されたした。 レヌザヌをオンにするタスクを少し難しくするために、同じログむン名ずパスワヌド admin/admin を䜿甚しおガヌランドずレヌザヌに暩限を远加したした。

プレむダヌは花茪をオンにしおテストし、レヌザヌで同じこずを繰り返すこずができたす。

プレむダヌを䞍必芁な遞択で苊しめないよう、このような簡単なログむン パスワヌドのペアを遞択したした。

このタスクをもう少し面癜くするために、mongodb のオブゞェクト ID がルヌム内のデバむス ID ずしお䜿甚されたした。

ObjectId にはタむムスタンプが含たれたす。XNUMX ぀のランダムな倀のうち XNUMX ぀はデバむス識別子に基づいお取埗され、もう XNUMX ぀はそれを生成するプロセスの PID ずカりンタヌ倀に基づいお取埗されたす。 レヌザヌ デバむス識別子の遞択がより興味深いものになるように、識別子を䞀定の間隔で異なる PID プロセスで生成するが、共通のカりンタヌを䜿甚したいず考えたした。 しかし、最終的には、誰もがカりンタ倀のみが異なる識別子から開始したした。 これにより、手順が単玔になりすぎお、objectId 構造の分析が䞍芁になった可胜性がありたす。

バック゚ンドリク゚ストからのトランスレヌタヌ

Python スクリプト、タむマヌに取り組み、ゲヌムの抜象抂念から物理モデルに倉換したした。 たずえば、「フロアランプをオンにする」→「リレヌ N2 をオンにする」などです。

スクリプトは RabbitMQ キュヌに接続し、キュヌから Arduino にリク゚ストを転送したした。 たた、平行光スむッチングのロゞックも実装されおいたす。いく぀かのデバむスず連動しお、それらのラむトが点灯したす。たずえば、最初にメガトロンに電力が䟛絊されるず、ステヌゞ ラむトで照らされたす。 シヌン党䜓の映画撮圱のための照明デザむンに぀いおは、プロゞェクトの共同プロデュヌサヌ兌プロダクション デザむナヌであるむリダ セロフの玠晎らしい仕事に぀いおは別の蚘事で説明したす。

翻蚳者は、タむマヌを䜿甚しおシュレッダヌを起動し、その画像をテレビに送信するロゞックも担圓したした。シュレッダヌ起動のタむマヌ、叫び声をあげるカピバラ、ゲヌム終了時のコマヌシャルなどです。

メガトロン トヌクンを生成するロゞックはどのように構成されおいるか

テストショット

25 秒ごずに新しいトヌクンが生成され、10/10 の出力でレヌザヌを 255 秒間オンにするために䜿甚できたした。 ぞのリンク Megatron コヌドを含む github.

その埌、レヌザヌは 1 分間冷华されたした。この間、レヌザヌは䜿甚できなくなり、新しいショットのリク゚ストは受け付けられたせんでした。

このパワヌはロヌプを焌き切るには十分ではありたせんでしたが、どんなプレむダヌでもメガトロンを発射し、レヌザヌビヌムが動䜜するのを芋るこずができたした。

トヌクンの生成には MD5 ハッシュ アルゎリズムが䜿甚されたした。 そしお蚈画はうたくいきたした MD5 + カりンタヌ + シヌクレットからの MD5 戊闘トヌクンの堎合、テスト トヌクンの堎合はシヌクレットなし。

MD5 は、埌揎者である Pavel が行った商甚プロゞェクトぞの参照です。 ほんの数幎前、このプロゞェクトでは MD5 が䜿甚されおいたしたが、MD5 は時代遅れの暗号化アルゎリズムであるずプロゞェクト アヌキテクトに䌝えたずころ、MD5 から MDXNUMX を䜿甚し始めたした。 私たちが可胜な限り初心者のプロゞェクトを䜜るこずに決めたので、圌はすべおを芚えおいお、少し参考にするこずにしたした。

コンバットショット

メガトロンの戊闘モヌドは 100% レヌザヌ出力 3 ワットです。 これは、重りを保持しおいたロヌプを焌き切り、氎槜を砎壊し、サヌバヌに氎が浞氎するのに十分な2分間です。

私たちはプロゞェクトの Github にいく぀かのヒントを残したした。それは、テスト トヌクンず戊闘トヌクンが同じカりンタヌ むンゞケヌタヌに基づいお生成されるこずが理解できるトヌクン生成コヌドです。 戊闘トヌクンの堎合、カりンタヌ倀に加えお゜ルトも䜿甚されたすが、これは最埌の XNUMX 文字を陀いおほが完党にこの芁旚の倉曎の歎史に残っおいたす。

このデヌタを知っおいるず、塩の最埌の 2 ぀の蚘号を分類するこずができ、実際に、16 進法に倉換された Lost の数倀が䜿甚されおいるこずがわかりたした。

次に、プレむダヌは (テスト トヌクンを分析しお) カりンタヌ倀を取埗し、次のカりンタヌ倀ず前のステップで遞択した゜ルトを䜿甚しお戊闘トヌクンを生成する必芁がありたした。

カりンタはテストショットごずに 25 秒ごずに単玔に増加したす。 これに぀いおはどこにも曞いおいたせんが、ゲヌム内のちょっずしたサプラむズであるはずでした。

キャプチャむンタラクションサヌビス

ゲヌムの䞖界では、これはファンをオンにしおヒント付きのフリップチャヌトを開くためにロヌドする必芁があるキャプチャず同じものでした。 カメラの隣には負荷監芖機胜を備えたラップトップがありたした。

サヌバヌを砎壊するハッカヌ ゲヌムのバック゚ンドはどのように䜜成されたか

サヌビス 珟圚の負荷ずしおモニタリングに衚瀺するものを蚈算したした。枩床ず CPU ファンです。 メトリクスはタむムベヌス デヌタベヌスに転送され、grafana によっお描画されたす。

最埌の 5 秒間にキャプチャを衚瀺するリク゚ストが 50 件を超えた堎合、負荷は固定 + ランダムなステップ数だけ増加したす。 100% の負荷が XNUMX 分で達成できる蚈算になりたす。

実際、サヌビスには最終ゲヌムで衚瀺されるものよりも倚くのロゞックがありたした。CPU ファンの回転のみが芋えるようにモニタヌを配眮したした。

ク゚ストの開始時に、圌らは Falcon の Web サむトから Grafan にアクセスできるようにしたいず考えおいたした。 ただし、バック゚ンド アプリケヌション レポヌトからのスプリングブヌト メトリックも含たれおおり、クリヌンアップする時間がなかったため、アクセスをブロックするこずにしたした。 それもそのはず、ク゚ストの開始時点でさえ、䞀郚のプレむダヌはアプリケヌションが Springboot フレヌムワヌクで蚘述されおいるず掚枬し、いく぀かのサヌビスの名前を調べさえしたした。

ホスティングずデヌタバス

バック゚ンドからサむト (RabbitMQ が実行されおいた VPS サヌバヌ) に情報を転送するためのツヌル。

バック゚ンドずデヌタバスはオンのたたでした 私たちのVPS。 その胜力は、画面に衚瀺されおいるコンピュヌタヌ (2 GB の RAM を搭茉した XNUMX コア VPS) に匹敵したす。 ピヌク負荷は数日間だけ蚈画されおいたため、料金はリ゜ヌスに察しお請求されたした。これは、VPS の負荷を短期間に蚈画しおいるお客様が行うこずです。 その埌、負荷が予想よりも高かったため、固定料金の方が収益性が高いこずが刀明したした。 ク゚ストを行う堎合は、回線料金を遞択しおください タヌボ.

DDoSa からサヌバヌを保護するために、Cloudflare を䜿甚したした。

VPS がすべおに敬意を持っお耐えたず蚀うのは䟡倀がありたす。

リレヌの制埡を担圓する Arduino は、トランスレヌタからコマンドを受け取り、実際の䜜業を実行したした。

これは、プロゞェクトのハヌドりェア郚分に関する次の蚘事のトピックです。バック゚ンドは、特定のリレヌをオンにするリク゚ストを送信しただけです。 たたたた、バック゚ンドはほがすべおの゚ンティティを認識しおおり、バック゚ンドからのリク゚ストは「この゚ンティティをオンにする」ように芋えたした。 これはサむトの初期テストのために行いたした (ただすべおの Arduino ずリレヌを組み立おおいたせんでした)。最終的にはすべおそのたたにしたした。

フロント゚ンド

私たちはチルダを䜿っおサむトをすぐに䜜成したした。所芁時間は 30 営業日で、予算は XNUMX ドル節玄できたした。

圓初は、単玔にサむトを゚クスポヌトしお䞍足しおいるロゞックを远加するこずを考えおいたしたが、これを犁止する利甚芏玄に遭遇したした。

私たちはラむセンスに違反する準備ができおいなかったので、XNUMX ぀の遞択肢がありたした。すべおを自分たちで実装するか、Tilda に盎接連絡しおプロゞェクトに぀いお話し、コヌドを倉曎する蚱可を埗るかです。

私たちは XNUMX 番目のオプションを遞択したしたが、圌らは途䞭たで䌚っおいただけでなく、XNUMX 幎間の無料のビゞネス アカりントを䞎えおくれたした。これには非垞に感謝しおいたす。 圌らに Sokol の Web サむトのデザむンを芋せるのは非垞にぎこちなかった。

その結果、基本的なデバむスにリク゚ストを送信するためにフロント゚ンドに js ロゞックを远加し、ゲヌム芁玠をオンたたはオフにするためのボタンのスタむルをわずかに倉曎したした。

りェブサむトのデザむン

怜玢の歎史に぀いおは別の章で説明したす。

私たちは、単なる時代遅れのサむトではなく、デザむンの基本ルヌルをすべお違反した、たったく䞍快なサむトを䜜りたかったのです。 同時に、信憑性を維持するこずも重芁でした。耳錻咜喉科のストヌリヌを壊しおはならず、著者の傲慢さを実蚌する必芁があり、プレむダヌはそのようなサむトが存圚し、クラむアントを連れおくるこずさえできるず信じなければなりたせんでした。 そしお圌はそれを持っおきたした 詊合の進行䞭に、りェブサむトを䜜成したいずいう連絡が XNUMX 回ありたした。

最初は私が自分でデザむンを行い、より倚くの gif や光沢のある芁玠を含めようずしたした。 しかし、10幎来のデザむナヌの倫は、それを「良すぎる」ず䞀蹎したした。 デザむンルヌルを砎るには、それを知る必芁がありたす。

サヌバヌを砎壊するハッカヌ ゲヌムのバック゚ンドはどのように䜜成されたか

氞続的な嫌悪感を呌び起こす色の組み合わせはいく぀かありたす。同じ豊かさの緑ず赀、グレヌずピンク、青ず茶色です。 最終的に、ベヌスカラヌずしお赀ず緑の組み合わせに萜ち着き、猫のGIFを远加し、ストックフォトから゜コロフ自身の写真を3〜4枚遞択したした。 私の条件はいく぀かだけでした。䞭幎男性で、サむズが倧きすぎるサむズの合わないスヌツを着お、「プロのスタゞオ写真撮圱」のようなポヌズをずっおいるこずです。 テストでは、友達に芋せお「どうですか」ず尋ねたした。

蚭蚈開発のプロセス䞭、倫は XNUMX 分おきに暪になり、ヘリコプタヌが飛び始めたした。 パシャはフロント゚ンドの仕䞊げを終える間、目を保護するために開発者コン゜ヌルを画面の倧郚分たで開かせようずしたした。

実機

ファンずラむトは゜リッドステヌト リレヌを介しお取り付けられおいるため、すぐにフルパワヌでオンにならず、監芖ず䞊行しお電力が増加したす。

ただし、これに぀いおは次の投皿で、ゲヌムのハヌドりェア郚分ずサむトの実際の構築に぀いお説明したす。

乞うご期埅

サヌバヌを砎壊するク゚ストに関するその他の蚘事

サヌバヌを砎壊するハッカヌ ゲヌムのバック゚ンドはどのように䜜成されたか

出所 habr.com

コメントを远加したす