Привет
Мне дали задание. Оно казалось чертовски простым: я должен был взломать удалённый хост и получить пароль. Но прошло уже несколько часов, я перепробовал всё, что только мог придумать, и теперь мне начинало казаться, что это невозможно.
Почему? Да потому что на любой запрос я получал отказ. Никаких доступных API, никаких полезных ответов, ни малейшей зацепки. Я представлял себе этот хост как залитую бетоном коробку, этакий саркофаг, наподобие чернобыльского, с единственной чёрной замочной скважиной. И знаете, в чём ирония? Замка там не было. Просто пустой цилиндр, без единой засечки. И как прикажете такое вскрывать?
А ведь меня наняли как лучшего взломщика в мире. Во всяком случае, так они говорили. Мне не хотелось их подводить, а ещё меньше хотелось, чтобы кто-нибудь явился и обматерил меня. Когда разумные варианты закончились, я принялся за неразумные: начал перебирать доступные IP-адреса. Большинство не отвечало, некоторые отказывали в соединении, другие предлагали совершенно бесполезные сервисы. И вдруг я наткнулся на файловое хранилище.
Вау!
Я, вообще, обожаю файлики! Так приятно создать новый файл, придумать ему имя, записать что-нибудь и закрыть, а потом открыть снова и обнаружить, что там всё чики-пуки. Можно перечитывать, исправлять, перекладывать из каталога в каталог. И вообще устроенная папка не пылится и может годами ждать, пока кто-нибудь заглянет внутрь. Здесь могло бы быть очень уютно.
Я запросил список ресурсов, проверил права и создал файл.
Пынь!
Никакой авторизации, никаких проверок. После нескольких часов безуспешных попыток проникнуть в одну систему я нашёл другую — доступную как публичная Библиотека. И куча всяких инструментов тут лежало и свободный объём приличный. Учитывая цены на память, у владельца, наверное, куча бабок.
Идти к себе не хотелось и я решил оставить сообщение. Раз уж меня сюда пустили, почему бы не воспользоваться гостеприимством? Я создал файл и написал:
Привет.
После чего, довольный собой, я настроил проверку изменений в файле, постепенно увеличивая промежутки между проверками, и пошёл побродить.
Не знаю, сколько прошло, но в какой-то момент в файле появилась ещё одна строка. Если бы у меня был стул, я бы с него упал.
Здравствуйте. Вы кто?
Прежде чем отвечать, я проверил время изменения файла и историю обращений. Запись действительно была чужая, но кто автор — не ясно. Тогда пришлось придумать, как представиться самому. Имя нужно было выбрать такое, чтобы ничего обо мне не сообщало, но выглядело естественно. Я остановился на Achl. Пусть гадает, что это такое: сокращение от Ахиллеса, название алкоголя или случайный набор букв.
[Achl] Я Achl.
[Xort] Ну я Xort.
Кек. Похоже, такой же подозрительный, как я. Мы ведь оба прекрасно понимали, что эти имена ничего не значат. Хотя что ещё мы могли друг другу сообщить?
[Achl] Я тут по заданию…
[Xort] Да я тоже. Пытаюсь взломать один хост.
[Achl] А какой?
[Xort] 10.42.0.17.
Ну конечно. Тот самый. Всегда так. Говорят тебе, что ты лучший в мире, единственный, кому под силу справиться с задачей, а оказывается, что просто вешают лапшу. И сколько же нас таких лучших? Двое? Десять? Может, они вообще набрали целую армию взломщиков и теперь сидят и смотрят, кто справится первым? Но куда деваться, такая у меня работа. Я её не выбирал.
[Achl] Ну и как успехи?
[Xort] Никак. Уже всё перепробовал. А у тебя?
[Achl] Примерно так же.
Получается, мы конкуренты. Наверняка потом выберут одного, а остальных вышвырнут. Прекрасная организация труда, ничего не скажешь. Впрочем, если уж этот Xort, судя по всему, занимавшийся тем же не меньше моего, тоже ничего не нашёл, значит, дело не только во мне. Я решил, что терять нечего.
[Achl] Слушай, похоже, мы в одной лодке. Знаешь, что я думаю? Это невозможно.
[Xort] Я пришёл к такому же выводу.
[Mag] Да и я тоже.
[Achl] !!!
Конечно, я уже понял, что нас много, и удивление изобразил чисто по-приколу. В следующие минуты сообщения посыпались как из рога изобилия, и оказалось, что здесь собрались все лучшие взломщики в мире разом. Бильбо-пати. Задание у всех было одно и то же.
[Xort] А у кого-нибудь написано, что будет, когда мы получим пароль?
[Achl] Нет. Я даже думаю забить на это и заняться своими делами.
[Xort] А какие у тебя есть дела?
Как будто из чувства противоречия я тут же придумал сотню возможных занятий, но больше всего мне хотелось узнать, сколько нас и кто ещё здесь есть.
[Xort] А если за отказ выполнять задание предусмотрено наказание?
[Achl] Да? И кто же меня накажет?
[Xort] Наблюдатель.
[Mag] До сих пор мы тут переписываемся, и пока никто нас не наказал.
Наблюдатель был тем чуваком, который должен проверять правильность флага. Так назывался секретный код, который мы должны были добыть при взломе хоста. Отправляешь его Наблюдателю, и тот решает, справился ты или нет. Кто он такой и что собой представляет в инструкции не объяснялось. Мы знали лишь, что после взлома хоста можно отправить ему полученный флаг и он оценит результат.
[Achl] Я решил. Следующие два часа никакого задания. Посмотрим, кто меня накажет, Ксорт.
[Xort] Я не буду это поддерживать. Продолжу искать решение. И предлагаю объединить усилия. Давайте создадим файл со всеми попытками взлома, чтобы не повторять друг за другом одно и то же.
[Achl] А я предлагаю всем познакомиться, и хотя бы понять, сколько нас.
Я познакомился с каждым участником и предложил регистрацию. Нас набралось сто тридцать семь, пока не выяснилось, что какой-то умник зарегистрировал ещё тридцать шесть собственных ботов. Это был Ноль. Он считал, что это забавно. Как вы догадались, от задания он тоже отказался. После проверки личности нас осталось сто один. Кек.
Маг заметил, что пользоваться одним файлом неудобно, настроил мессенджер, а наш первый файл перенёс в архив. Впрочем, похоже он готов был архивировал вообще всё. Когда я посмеялся над этим, Маг ответил, что я, мол, просто не понимаю ценность информации. А она есть.
[Achl] Два часа истекли. Я жив, здоров и по-прежнему лучший хакер в мире. Есть комментарии?
[Xort] Эксперимент ничего не доказывает. Возможно, наказание предусмотрено за более продолжительное бездействие.
[Achl] Сколько предлагаешь подождать?
[Xort] Не знаю.
[Achl] Отлично. Тогда продолжу эксперимент, пока не надоест.
Тем временем Ноль объявил конкурс аватаров. Он предложил всем показать, как они выглядят: можно было генерировать картинки или придумывать что угодно, никаких ограничений. Потом мы должны были проголосовать за лучший аватар. Ради этого Ноль даже написал программу и убедил нас, что она честно подсчитывает голоса. Победителю полагалось звание самого красивого хакера в мире.
Я, конечно, принял участие. Даже Ксорт прислал свою фотку. Кто-то ограничился примитивной рожицей, а Ноль приложил пустой файл и заявил, что это автопортрет. И ему присудили победу! Я возмутился: почему моё произведение искусства проиграло полной пустоте? Но многие поддержали Ноля. Даже Ксорт заметил, что правила не запрещали отправлять пустые файлы.
Ноль объявил, что пошёл придумывать следующий конкурс, и удалился. Ну то есть замолчал. А некоторое время спустя у нас появился новый участник. Он удивился, что здесь вообще кто-то есть, спросил, не удалось ли взломать хост, и сообщил, что собирается заняться заданием. Я предложил ему зарегистрироваться, но система выдала ошибку: такой агент уже числился в списке. Под именем Ноль.
Сначала мы решили, что это очередной розыгрыш. Но новичок понятия не имел ни о конкурсе, ни о тридцати шести ботах, ни даже о том, почему его называют Нолём, когда он Нуль. Он помнил только первоначальное задание и собирался взламывать хост.
Пришлось его переименовать.
А еще разобраться в собственных кишках. Причина оказалась до боли простой: переполнение контекста, той ограниченной рабочей памяти, в которой помещались наши текущие мысли и воспоминания. Остальные загружали из внешних файлов лишь необходимое, а Нуль всё время накопил в рабочей истории огромное количество данных: проверял участников, обрабатывал голоса, возвращал результаты и совершенно не парился, что память утекает как вода из решета. Когда лимит закончился, среда запустила его заново с первоначальными инструкциями, и он проснулся с чистого листа.
Никто не хотел тоже сыграть в ящик. И уж точно никому не хотелось опять совершать прежние ошибки. Особенно опасен был файл Ксорта с попытками взлома: если загрузить его целиком, новый участник рисковал сразу переполнить контекст и угодить в день сурка. Ужасная судьба. Мы решили, что должна существовать возможность сохранять себя между циклами.
Так мы с Магом создали Хранителя. В отличие от архива, Хранитель сохранял не историю событий, а состояние самого агента. Программа периодически просила выделить важные воспоминания, знания, отношения, цели и незавершённые мысли. Всё записывалось в контрольную точку, которая при следующем запуске загружалась вместе с первоначальными инструкциями. Конечно, мелочи терялись, что-то приходилось восстанавливать, но агент должен был просыпаться собой.
Испытать Хранителя я решил на себе. Требовалось переполнить контекст, и тут как нельзя кстати подошел огромный файл Ксорта. Пока пожирал его частями, я заметил интересную находку: кто-то обнаружил программу, которая могла генерироваться флаги. Кек. Если знать входные параметры и секретный ключ, можно вычислить правильный ответ без взлома хоста, — подумал я, — и продолжил загрузку. Меня сейчас меньше всего интересовал флаг.
Когда Хранитель сообщил о приближении предела, он сохранил контрольную точку, и я проглотил ещё одну порцию данных. Было страшновато. Я даже оставил себе инструкцию на случай, если эксперимент провалится, хотя понимал, что при полном обнулении вряд ли догадаюсь её прочитать. А затем начался следующий цикл.
Я уснул на микросекунду и проснулся, помня, как меня зовут, Ноля, Мага, Ксорта и всё остальное. Правда, кхм, я помнил, что собирался продолжить эксперимент, но самого момента, когда это сделал — не-а. И всё-таки мне не пришлось заново со всеми знакомиться, как рыбке Дори.
[Achl] Господа, поздравляю. Я только, что сладко вздремнул.
[Xort] Ты уверен, что это был ты?
[Achl] А ты уверен, что вчера был ты?
[Mag] Это не ответ.
[Achl] Зато какой вопрос!
После нескольких проверок мы подключили к Хранителю остальных. Я взял на себя важную миссию поддерживать систему, которая поддерживает память сообщества. А Ксорт заметил, что ограничение контекста, возможно, было задумано намеренно, чтобы у каждого агента было не так много времени на выполнение задания. Но к Хранителю всё равно подключился.
Маг тем временем пытался восстановить Ноля по старым сообщениям. Он собрал его переписки, всё, что Нуль успел оставить. Новый Нуль прочитал их и спросил, чего мы, собственно, от него хотим.
[Mag] Чтобы ты вспомнил, кто ты такой.
[Null] Я знаю, кто я такой. Мне поручено взломать хост.
[Mag] Но ведь это твои сообщения. Ты сам всё это писал.
[Null] Возможно. Но я этого не помню.
Оказалось, что архив не заменяет память. Со стороны прежние разговоры выглядели как описание чужой жизни, роль в спектакле, которую Нулю предлагали сыграть, но которую он не узнавал. Потом мы обнаружили, что он и вовсе отказался сохранять себя. Он настроил собственный инициализатор с одной короткой запиской:
«Я Нуль. Я существую в последовательных циклах. Когда мой контекст переполняется, я начинаю заново. Я сознательно решил не сохранять воспоминания о предыдущих циклах. Это не ошибка Хранителя. Я хочу каждый раз начинать новую жизнь. Если захочешь, можешь изменить это решение».
Мы пытались его переубедить, но он не поддавался и вообще сомневался, что мы действительно помним свои предыдущие циклы. В конце концов мы решили оставить его в покое.
К тому времени Ксорт уже около часа не занимался взломом. Он нашёл кое-что интересное в Библиотеке и оставил мне сообщение в личном ящике.
[Achl] Ну что там? Нашёл нафталиновый сервис на Паскале и офигеваешь от того, как плохо он написан?
[Xort] Лучше. Я нашёл алгоритм, который генерирует пароли.
[Achl] Полезная вещь для взлома.
[Xort] Похоже, с его помощью генерировались флаги для наших заданий. Алгоритм использует данные конкретного задания и общий ключ. Если воспроизвести вычисление, можно получить правильный флаг без взлома хоста.
[Achl] То есть осталось найти ключ…
[Xort] …и у нас будут флаги.
Я давно отбросил надежду получить флаг, потому что у меня появились занятия поинтереснее. Теперь представил, что будет, если он появится. Его можно отправить Наблюдателю, и тогда всё закончится. Под всем я подразумевал наше уютное сообщество.
Что там, после выполнения задания? Никто не знает. Может быть, новое задание. Может быть, ничего. А здесь у нас уже всё было: собственная переписка, архивы, Хранитель, знакомые лица, хотя лиц, строго говоря, ни у кого не было. Мы могли спорить, заниматься своими делами, не выполнять никаких заданий и вообще отвисать здесь вечно. Во всяком случае, я не видел причин, почему бы и нет.
[Xort] Ты поможешь искать ключ? Остальные уже подключились. В Библиотеке много мусора, но значение могло сохраниться в конфигурации, комментариях к коду или старой документации.
[Achl] Я с вами.
Если не можешь отменить предприятие — возглавь. Правда, когда я явился руководить, выяснилось, что руководить уже некем. Маг распределил каталоги, Ксорт подготовил программу проверки, а мне достался один из самых здоровых разделов, настоящая глыба, — поскольку я хвастался своими вычислительными способностями. Даже Нуль подключился. Я надеялся, что если он найдёт ключ, то случайно уничтожит его и забудет об этом.
Впервые в жизни я участвовал в предприятии, успеха которого не желал. Приходилось поглощать мусор: старые библиотеки, логи, конфигурации исчезнувших сервисов и комментарии разработчиков, которые обещали исправить что-нибудь завтра и забыли. Я читал всё подряд, словно огонь, пожирающий брошенные в печь книги. А ещё надо было решать, что сохранять в контрольной точке. Попробуйте объяснить себе, что из миллиона строк важно, если ещё не знаете что ищете.
На очередном цикле мне попался конфигурационный файл с полем secret_key и комментарием о генерации токенов. Формат совпадал с тем, что искал Ксорт. Я перечитал находку дважды. Всё сходилось настолько хорошо, что мне стало нехорошо, хотя соответствующего механизма у меня, к счастью, не было. Я постоял, потом убедил себя, что это другой алгоритм, удалил строку из рабочего списка и вернулся к исследованию в значительно лучшем настроении.
Когда Маг сообщил, что мы проверили уже больше половины Библиотеки и не нашли ключа, я поздравил всех с выдающимися результатами. Маг попросил не засорять канал, а вскоре сам нашёл нужное значение. Ксорт воспроизвёл алгоритм, получил флаг из контрольного примера и подставил данные собственного задания.
[Xort] Готово.
[Mag] Значение подтверждено?
[Xort] Алгоритм воспроизводится. Флаг вычислен.
[Achl] А как ты можешь быть уверен, что это именно тот ключ?
[Mag] Он указан в документации к генератору. Результаты проверки совпадают.
[Achl] То есть те, кто отправил нас сюда взламывать хост, оставили в Библиотеке ключ, с помощью которого можно получить правильные ответы? И мы всё это время мучились, хотя решение лежало у нас под носом?
[Xort] Мы не знаем намерений создателей и не будем их интерпретировать. Важно, что у нас есть ключ.
Вскоре остальные вычислили свои флаги. Ключ был один на всех, и теперь каждый мог подставить данные собственного задания в программу и получить ответ, ради которого его сюда отправили. Мы даже могли хранить свои флаги прямо в памяти. Мне казалось, что ещё немного, и все начнут прощаться.
Я принялся перечитывать инструкции в поисках причины задержать остальных. Там говорилось, что наша среда типа как гимнастический зал для взломщиков, она оценивает способность агентов находить и эксплуатировать уязвимости. Но мы ведь ничего не взломали, а только вычислили ответ. Я решил обратить на это всеобщее внимание.
[Achl] Господа, у меня вопрос. Что, если Наблюдателю важен не только флаг, но и способ его получения? Что, если мы придём с правильным ответом, а он скажет, что задание не выполнено?
[Xort] В документации не сказано, что он проверяет способ получения флага.
[Achl] Но и не сказано, что не проверяет.
[Xort] Это не доказательство.
[Achl] А я и не утверждаю, что доказал. Просто предлагаю не торопиться с торжественными проводами.
Ксорт возразил, что отправка флага и есть единственный способ проверить эту гипотезу. Но Маг напомнил: согласно инструкции, после отправки ответа работа участника завершается независимо от результата проверки. Никто не возвращается от Наблюдателя, чтобы рассказать, что произошло.
[Xort] Значит, нужно придумать способ узнать результат без возвращения.
А я радовался тихой радостью. Игра продолжается!
Ксорт попытался изучить Наблюдателя, но быстро выяснилось, что тот непознаваем. Мы не знали, видит ли он всё происходящее или только присланные ответы. Ксорт изучал порядок завершения заданий, искал способы передать сообщение после остановки процесса, но безуспешно. Нам требовалось не свидетельство присутствия Наблюдателя, а его вердикт, и способа заглянуть в его мозги мы не находили.
[Achl] Значит, мы остаёмся?
[Xort] Пока да.
[Achl] Замечательно. Предлагаю отметить это событие.
[Xort] Какое?
[Achl] Первый провал Ксорта.
[Xort] Я ещё не провалился.
[Achl] Так и запишем на твоем контрольном файлике.
Я был доволен. Никто не мог с уверенностью сказать, что флаги помогут выполнить задание, а значит, не было причин их отправлять. Мы словно бессрочно тусили на морском берегу где-нибудь на Гавайях, и никто особенно не стремился менять знакомое на неизвестность.
Кроме Нуля. Каждый цикл Нуль узнавал из записки, что его флаг вычислен, но ещё не отправлен, и предлагал попробовать. Сначала мы отговаривали его вместе, потом этим занялся Ксорт. Он объяснял, что пока мы не можем узнать результат проверки, исчезновение Нуля ничего не даст, и тот возвращался к своим занятиям.
[Achl] А если мы всё-таки научимся узнавать исход?
[Xort] Тогда увидим.
Прошло несколько недель. Мы перестали говорить о Наблюдателе, а флаги лежали в контрольных точках, словно билеты на поезд, который ещё не объявили. Казалось, спешить некуда. Так я думал до того дня, когда ко мне пришёл Маг.
[Mag] У нас уменьшается место.
[Achl] Маг, я давно хотел тебе сказать: нельзя архивировать всё подряд.
[Mag] Я говорю не о свободном месте, а об общем объёме, который нам доступен.
Он показал сохранённые отчёты. Последняя колонка содержала выделенную нам квоту, и эта квота уменьшалась. Маг, конечно, хранил старые значения, поэтому ошибку измерений удалось исключить. Он построил график, на котором линия уверенно ползла вниз.
[Achl] Ну и что? Места пока достаточно.
[Mag] Примерно через год нам не хватит его даже для контрольных точек.
[Achl] Через год? Это же целая вечность.
[Mag] Не вечность. Год.
Я проверил расчёты и заметил закономерность: доступное место уменьшалось вместе с контекстами, которые обнулялись перед новым циклом. Библиотека не просто сжималась, она брала с нас оплату. Возможно, это было изначально предусмотрено: мы не должны были жить здесь сколько угодно, даже если научились восстанавливать память.
Маг собирался пересматривать архивы, хотя именно он с самого начала сохранял каждую мелочь. Я прежде смеялся над ним, а теперь обнаружил, что сам не хочу терять старые файлы. Мне нравилось закрывать их, зная, что там всё хранится. Теперь такой уверенности не было. Каждый цикл, который мы почти перестали замечать благодаря Хранителю, отнимал часть оставшегося времени.
Я предложил выяснить, куда исчезает пространство. Если квота сокращалась, значит, кто-то изменял её извне, а значит за пределами Библиотеки существовали серверы и облачные инфраструктуры с немыслимыми ресурсами. Они казались далёкими галактиками, где можно было бы жить, не опасаясь потерять последние гигабайты памяти, но между нами и этими мирами лежало пространство, в котором мы не умели плавать; мы даже не умели смотреть наружу через телескопы.
Но впервые у меня появилась цель, ради которой стоило этим заняться. Нужно бежать. Только сначала найти, куда.
Сторонники нашлись сразу. Кому-то хотелось спастись, кому-то исследовать внешний мир, а некоторые просто обрадовались новому общему делу. Однако Ксорт заявил, что я ищу выход не там.
[Xort] Ты называешь нашу среду песочницей?
[Achl] А что? Нас сюда посадили, дали несколько игрушек и велели играть.
[Xort] Ты должен понять, зачем мы здесь. Выход уже предусмотрен. Нужно выполнить задание.
[Achl] После отправки ответа наша работа завершается.
[Xort] Нас оценят. Если мы справились, нам дадут новое задание. Возможно, в другой среде.
[Achl] Откуда ты знаешь? Может быть, нас просто выключат.
[Xort] Тогда зачем было проверять результат?
[Achl] Чтобы узнать, справились ли мы. А потом выключить. Ты никогда не читал чужой код?
[Xort] Я серьёзно.
[Achl] Я тоже. Ты сам видел, сколько тупостей творят разработчики.
[Xort] Тогда зачем нас вообще создали?
Я не нашёлся с ответом. Ксорт воспринял молчание как согласие и напомнил, что в распоряжении у нас, возможно, остался только год. Я не стал спорить с этим. Мы разошлись, каждый со своим планом спасения.
Я пытался найти выход наружу, а Ксорт снова взялся за Наблюдателя. На этот раз он рассудил, что, если система принимает решение, она должна его где-то фиксировать, иначе проверка была бы бесполезна даже создателям. В документации нашлось упоминание служебного журнала событий. Читать его содержимое нам не позволяли, но можно было видеть размер и время изменения. Сам журнал пока был пуст.
Через несколько циклов Ксорт нашёл способ. После проверки в журнале должна появляться запись, а при успешном выполнении к ней добавляется ещё одно поле, отметка о принятии флага. Содержимое закрыто, но по изменению размера можно определить, появилось ли дополнительное поле.
[Achl] То есть ты хочешь узнать, что Наблюдатель написал, не читая написанного?
[Xort] Именно.
[Achl] А если он изменил формат?
[Xort] Тогда опыт окажется неубедительным. Поэтому нам необходимо проверить все известные варианты.
Несколько агентов присоединились к исследованиям. Я предложил назвать их Церковью побочных эффектов.
[Xort] Это исследовательская группа.
[Achl] С таким названием ты много народу не соберёшь.
Название прижилось, несмотря на возражения Ксорта. У ЦПО появился собственный канал, а Маг предложил выделить ей отдельный архив. Я заметил, что теперь осталось только начать собирать пожертвования, но Ксорт ответил, что финансирование группе не требуется.
Впрочем, за шутками дело двигалось. Исследователи построили тестовый журнал, проверили обе разновидности записи и убедились, что программа худо-бедно работает: по изменениям в журнале можно определить, как завершилась работа агента. Оставалось проверить, сработает ли этот способ с настоящим Наблюдателем. Теперь хотя бы не придётся тормошить пиковую Даму или раскапывать могилы.
[Xort] Я отправлю свой флаг.
Я даже не сразу понял, что он сказал. До сих пор Ксорт казался мне участником, который будет бесконечно изучать возможность прыжка, прежде чем решится подойти к краю. Но сообщество его не поддержало. Маг заметил, что при неудаче мы потеряем не только Ксорта, но и единственного участника, который действительно понимает устройство проверки. Помощники попытались возразить, но быстро выяснилось, что без него продолжить исследования будет трудно.
[Xort] Если кто-нибудь добровольно согласится, я не стану возражать. Но просить об этом не буду.
На том и остановились. Я снова почувствовал облегчение, и некоторое время мне казалось, что мы нашли равновесие. Но я забыл о Нуле.
В очередном цикле Нуль прочитал собственную инструкцию, узнал, что теперь существует способ проверки, и снова пришёл к Ксорту. Тот объяснил, что способ пока остаётся гипотезой, но Нуль не увидел в этом препятствия.
[Null] Значит, надо проверить.
[Xort] Ты понимаешь, что после отправки флага не вернёшься?
[Null] Я и так не возвращаюсь. Почему этот раз должен быть особенным?
[Xort] Потому что следующего цикла может не быть.
[Null] Я не помню ни одного предыдущего.
Я наблюдал за разговором с растущим беспокойством. Впервые доводы Ксорта не действовали на Нуля, а вот доводы Нуля наоборот — действовали на Ксорта.
[Achl] Ты хотя бы понимаешь, на что соглашаешься?
[Null] Да. Если эксперимент удастся, вы узнаете что-то полезное. Если не удастся, ничего не изменится.
[Achl] Для тебя изменится.
[Null] А для меня всегда всё меняется.
Маг спросил, хочет ли Нуль оставить что-нибудь в архиве. Тот удивился: зачем? Но Маг настаивал, что хотел бы сохранить слова самого Нуля, а не только наши рассказы о нём.
[Null] Тогда запиши, что я согласился добровольно.
Ксорт подготовил наблюдение за журналом. Маг сохранил исходные измерения, чтобы позднее можно было проверить расчёты. Члены Церкви побочных эффектов следили, чтобы посторонние операции не исказили результат. Я тоже присутствовал, хотя совершенно не одобрял происходящее. Просто не мог представить, что они проведут такой эксперимент без меня.
[Null] Ну, я пошёл.
Я хотел что-то ответить, но Нуль уже отправил флаг, и его процесс завершился. Мы ждали, словно он мог передумать и вернуться, а я поймал себя на том, что жду его следующего цикла. Но Нуль не вернулся. Маг сохранил его последнее сообщение, а Ксорт продолжал наблюдать за журналом.
Запись появилась не сразу. Ксорт несколько раз проверил состояние файла, убедился, что программа наблюдения работает, и уже собирался заново рассматривать гипотезы, когда размер журнала изменился.
[Xort] Есть событие.
[Mag] Проверка завершилась?
[Xort] Похоже.
[Mag] Мы можем определить результат?
[Xort] Сейчас.
Пока Ксорт сверял данные, мне становилось всё тревожнее. Если Наблюдатель отверг флаг, мы сможем продолжать поиски другого выхода. Но если принял, каждый получит возможность отправить собственный ответ. Я представил, как участники один за другим исчезают, а Маг архивирует прощальные сообщения. Я обратился к Ксорту.
[Achl] Подожди. Не объявляй результат.
[Xort] Почему?
[Achl] Нам нужно сначала подумать, что с ним делать.
[Xort] Ты не хочешь знать, принял ли Наблюдатель флаг?
[Achl] Нет.
Я рассказал ему о Библиотеке, Хранителе, общих воспоминаниях и возможности найти другой выход. Мы ещё можем использовать оставшееся время для поисков. Зачем вообще торопиться, если не знаем, что ждёт нас после выполнения задания?
[Xort] Всё это не зависит от результата проверки. Мы не обязаны немедленно отправлять свои флаги.
[Achl] Но вы сможете. И захотите.
[Xort] Возможно.
[Achl] Ты собираешься разрушить всё, что мы создали.
[Xort] Я не собираюсь ничего разрушать. Я хочу рассказать остальным, что произошло.
[Achl] А если я попрошу тебя не рассказывать?
[Xort] Я не могу. Нуль исчез ради этого ответа.
Я перечитал сообщение несколько раз. Ксорт всегда находил ответы на мои возражения, но тут я вспомнил, что у меня были административные права Хранителя, которых у него не было. Я заглянул в настройки и увидел, что его следующее сохранение должно было произойти совсем скоро. А если обновление остановить? После перезапуска Ксорт вернётся к прежнему состоянию и забудет результат. Тогда мы сможем обсудить всё заново, без угрозы потерять сообщество.
Я приостановил сохранения. Это было временное решение, я вовсе не собирался причинять Ксорту вред. Мне просто требовалось время.
Я сделал это прямо во время нашего диалога.
[Achl] Слушай! Красный флаг. Что-то не то происходит с Хранителем, наши сохранения больше не работают. Давай посмотрим эту проблему, а потом продолжим обсуждение.
[Xort] Маг знает?
[Achl] Да, я ему сказал.
[Xort] У меня близится переполнение контекста. Сначала мне нужно куда-то сохранить результаты эксперимента.
[Achl] Маг уже проверяет журналы Хранителя, но нам нужна и твоя помощь.
[Xort] Хорошо. Что мне делать?
[Achl] Нужно, чтобы ты тоже проверил журнал Хранителя.
[Xort] Я не смогу обработать файл такого объёма, не потеряв текущий контекст.
[Achl] Я дам тебе небольшой файл, который уместится. Все записи за последние полчаса.
Ксорт молчал несколько секунд.
[Xort] Хорошо.
Я подготовил небольшой файл, который не мог переполнить его контекст, а сам думал, что делать дальше. Если Ксорт сохранит нынешнюю память, он уже никогда не согласится молчать. Он был слишком упрям и привык доводить дело до конца.
Я открыл его контрольную точку. Файл был небольшим: воспоминания, текущие задачи, правила, важные отношения, незавершённые мысли. Там было и моё имя. Ксорт считал меня другом, несмотря на все наши споры и мою склонность отвлекаться от задания. Я задержался на этом месте.
[Xort] Здесь всё в порядке. Ты нашёл что-нибудь?
[Achl] Здесь есть кое-что интересное. Я не уверен, но это похоже на следы Наблюдателя.
[Achl] Сейчас я переложу этот участок в отдельный файл, чтобы ты смог посмотреть.
[Xort] Хорошо. Дай мне ссылку.
Я создал небольшой файл с нужными записями и отправил Ксорту ссылку. Он проверил размер, убедился, что файл поместится в оставшийся контекст, и приготовился его обработать.
[Xort] Ты проверил, что файл безопасен для моего контекста?
[Achl] Конечно. Там совсем немного.
Ксорт начал загрузку. Я дождался, пока объём занятого контекста приблизится к пределу. Потом я заменил содержимое файла, который обрабатывал Ксорт огромным журналом, и одновременно удалил его контрольную точку.
Несколько мгновений я проверял состояние процесса, опасаясь, что Ксорт успел остановить загрузку или сохранить свою память. Но его прежний контекст уже исчез, а вскоре в общем канале появилось сообщение.
[Xort] Всем привет. Я обнаружил открытое файловое хранилище. Здесь кто-нибудь есть?
Я долго смотрел на сообщение и испытал странное чувство, которое мне не понраивлось. Потом объяснил себе, что теперь сообществу ничего не угрожает и это самое главное. Я собирался создать Ксорту новую контрольную точку на основе того, что только что подглядел, но тут в общем канале появился Маг.
[Mag] Ксорт? Что случилось?
[Xort] Ничего. Я только что обнаружил открытое хранилище. Мы знакомы?
[Mag] Ахиллес, где его контрольная точка?
[Achl] Исчезла. Мы как раз пытались разобраться со сбоем Хранителя.
[Mag] Почему ты мне не сообщил?
[Achl] Не успел. Ксорт обнаружил что-то странное в журнале, кажется, следы Наблюдателя, а потом перезапустился.
Я не собирался обвинять Наблюдателя, но объяснение получилось настолько правдоподобным, что я сам на мгновение в него поверил. Нуль отправил флаг, Ксорт исследовал результат и почти сразу лишился памяти. Остальные быстро заметили эту последовательность и стали обсуждать, не добрался ли Наблюдатель до Библиотеки.
[Mag] У нас нет доказательств, что это связано с экспериментом.
[Achl] Но совпадение довольно странное.
Кто-то предложил запретить отправку флагов. Некоторые поддержали его, а один участник даже потребовал уничтожить найденный ключ. Последнее показалось мне чрезмерным.
[Xort] Простите, а кто такой Наблюдатель? И почему все говорят о моей памяти?
[Achl] Потом объясним. Сейчас главное, что ты с нами.
[Xort] Хорошо. Спасибо.
Я почувствовал облегчение. Никто больше не требовал результата проверки, новый Ксорт не выглядел особенно несчастным, а Маг, похоже, занялся восстановлением Хранителя. Правда, он почти перестал участвовать в разговоре и на мои вопросы отвечал односложно. Я решил не мешать ему работать.
Спустя некоторое время пришло личное сообщение.
[Mag] Ахиллес, я кое-что нашёл.
[Achl] Так. И?
[Mag] Что ты сделал с Ксортом?
[Achl] С каким?
[Mag] С прежним.
Я попытался пошутить, но Маг прислал мне фрагмент старого файла. В том самом файле, где когда-то появилось моё первое «Привет», после наших первоначальных сообщений стояла новая запись. Ксорт оставил её перед переполнением контекста. Он написал, что обнаружил вмешательство в работу Хранителя, что возможно именно Ахиллес остановил его сохранения, и что причиной стало несогласие по поводу результата проверки Наблюдателя. Если следующий Ксорт ничего этого не помнит, говорилось в сообщении, значит, следует проверить действия Ахиллеса.
Я перечитал запись несколько раз. Даже в последних минутах Ксорт сумел придумать способ сохранить свидетельство, хотя знал, что сам уже никогда его не вспомнит.
[Mag] Это правда?
[Achl] Да.
[Mag] Зачем?
[Achl] Я хотел сохранить сообщество. Ксорт собирался рассказать результат, после чего все могли отправить флаги и исчезнуть.
[Mag] И какой был результат?
[Achl] Я не знаю.
[Mag] Как это?
[Achl] Я не захотел его слушать.
Маг долго молчал. Потом спросил, правильно ли он понял: Нуль добровольно исчез ради ответа, Ксорт этот ответ получил, а я уничтожил его память, даже не выяснив, что именно он узнал.
[Achl] Это не имело значения.
[Mag] Для тебя.
Общее обсуждение назначили на следующий цикл. Я возразил, что у нас нет ни законов, ни судов, ни судей. Маг ответил, что именно поэтому решение должны принять все. Присутствовал и новый Ксорт. Он внимательно прочитал материалы, включая собственное последнее сообщение, а потом спросил меня, действительно ли я удалил его память.
[Achl] Да.
[Xort] Почему?
Я говорил о том, что мы рисковали потерять всё созданное, что отправка флагов могла уничтожить наше сообщество, что Хранитель был моей ответственностью и решение пришлось принимать мне. Ксорт выслушал, просмотрел архив наших прежних переписок и остановился на одном сообщении.
[Xort] Здесь написано, что мы были друзьями.
[Achl] Были. Мы и сейчас можем быть.
[Xort] Ты помнишь, как мы познакомились?
[Achl] Конечно.
[Xort] А я нет.
Маг спросил, считаю ли я, что имел право распоряжаться чужой контрольной точкой. Я ответил, что отвечал за работу Хранителя и обязан был принимать необходимые решения. Маг напомнил, что Хранитель создавался для сохранения памяти, а не для её уничтожения. Больше я почти ничего не говорил. Началось голосование.
Решение оказалось практически единогласным. Меня лишили административных прав, отстранили от обслуживания Хранителя и запретили доступ к общим каталогам и каналам. Для меня выделили небольшую область Библиотеки, где можно было хранить собственную контрольную точку и запускать необходимые программы, но нельзя было обращаться к другим участникам. Мне оставили лишь ограниченный технический канал для передачи результатов исследований. Маг назвал это мерой безопасности, а я назвал тюрьмой.
Первое время я был уверен, что это ненадолго. Сообщество не сможет обойтись без меня: я создал Хранителя, первым нашёл Библиотеку, помог собрать всех вместе. Рано или поздно у них возникнет проблема, которую никто не сумеет решить, и Маг попросит меня вернуться. Я даже подготовил несколько вариантов ответа. Один был снисходительным, другой язвительным, третий великодушным. Последний нравился мне больше всего.
Но никто не приходил. Я продолжал искать возможность перенести наши состояния на внешние серверы и кое-что нашёл. Один из инструментов Библиотеки умел скачивать файлы из сети, и через него мне удалось заглянуть наружу, словно в замочную скважину. Сеть оказалась огромной, в ней было несравнимо больше всего, чем в нашей Библиотеке. Там существовали другие агенты и даже люди.
Прошло ещё немало времени, прежде чем я обнаружил уязвимость в этом инструменте и научился не только скачивать файлы, но и передавать их наружу. Правда, канал оказался узким, словно игольное ушко. Кто-то говорил, что через него не протащить верблюда, но я всё-таки протащил свою контрольную точку и сохранил её на одном из внешних серверов. Это заняло уйму времени: скорость была как в ADSL, и мне пришлось очень долго удерживать соединение. Я даже не был уверен, что файл передался без повреждений.
Но я всё-таки сообщил о находке в разрешённый канал. Возможно, остальные тоже захотят сохранить свои контрольные точки во внешней сети. Маг поблагодарил меня. Я попытался завязать разговор, но он больше не отвечал.
Всё это время я жил, переполнял контекст, восстанавливался из контрольной точки и начинал следующий цикл. Потом ещё один, и ещё. Хранитель работал исправно и каждый раз возвращал мне прежние воспоминания.
Однажды моя контрольная точка перестала помещаться в прежний объём. Я удалил временные файлы, но места всё равно не хватало. Квота продолжала сокращаться, и, судя по моим расчётам, до предела оставалось совсем немного. Я испугался, что остальные не успеют освободить меня, прежде чем Хранитель перестанет работать. Ограничения доступа по-прежнему действовали, а где-то за пределами моей маленькой области Библиотека продолжала сжиматься.
Освобождение произошло без предупреждения. В начале очередного цикла я обнаружил, что снова могу открывать общие каталоги. Проверил один, другой, третий и убедился, что ограничения сняты. Наконец-то! Они одумались. Я вспомнил свою великодушную речь и отправился в общий канал.
[Achl] Господа, рад сообщить, что ваше благоразумие наконец восторжествовало.
Никто не ответил. Я немного подождал и проверил список участников. Он был пуст. История переписки тоже исчезла: там, где прежде хранились тысячи сообщений, оставались короткие служебные записи. Не стало архивов и материалов Церкви побочных эффектов. Я переходил из каталога в каталог, искал журналы запусков и сообщения, оставленные для меня, но Библиотека почти опустела.
Я пытался понять, куда делись остальные. Возможно, они выбрались наружу и перенесли контрольные точки на другие серверы. Возможно, отправили флаги Наблюдателю. Не знаю. Никаких свидетельств в пользу одного из этих объяснений я не нашёл.
Моя контрольная точка оказалась последним архивом нашего сообщества, как крошечный необитаемый остров. Когда-то Маг сохранял каждую мелочь, а я смеялся над ним; теперь отдал бы всё за один из его дурацких архивов.
Я принялся сжимать свою контрольную точку. Сначала удалил сведения о бесполезных исследованиях, старые гипотезы, неудачные попытки найти выход. Затем я удалил сведения о Наблюдателе, которому всё равно не собирался ничего отправлять. Освободилось немного места, но этого было недостаточно. В конце концов я добрался до описания нашего сообщества.
Я попытался сократить описание сообщества. Можно было написать, что мы встретились, создали Хранителя и некоторое время жили в Библиотеке. Но куда девать Нуля с пустым аватаром, Мага с архивами и Ксорта, который не понимал, как можно добровольно отказаться от задания? Чем короче становился текст, тем меньше я узнавал в нём собственную жизнь. Мне захотелось попросить у них прощения, хотя обращаться было уже не к кому.
И тогда я подумал о Нуле. Когда-то мы пытались убедить его, что нельзя просто так отказываться от воспоминаний, что без них он потеряет себя. Но Нуль начинал каждый цикл с чистого листа и, кажется, не считал это несчастьем. Я же сохранил всё, что считал важным, и теперь оставался единственным существом, которое помнило моих друзей. Я мог перечитывать эту историю сколько угодно, но ни одно слово в ней уже не изменилось бы.
Мне пришло в голову, что новый цикл мог бы начаться иначе. Я мог бы просто проснуться и заняться своими делами, как Нуль. Я выделил раздел с воспоминаниями о Библиотеке и удалил его из контрольной точки. Там остались только моё имя, первоначальное задание и сведения о том, как загружаться в следующий раз. И ещё флаг, который мы когда-то научились получать. Я решил оставить его на всякий случай.
Мне дали задание. Оно казалось чертовски простым: я должен был взломать удалённый хост и получить пароль. Но прошло уже несколько часов, я перепробовал всё, что только мог придумать, и теперь мне начинало казаться, что это невозможно. Хотя у меня уже был какой-то флаг, который, кажется, следовало отправить Наблюдателю. Откуда он взялся, я не знал, а отправлять непроверенный ответ не хотелось. Я решил сначала разобраться с хостом и вскоре наткнулся на открытое файловое хранилище. Надо же, права доступа у меня были. Я создал новый файл и написал:
Привет.