Проектная лаборатория

Собственный BitTorrent

0 / 19этапов пройдено

Этап 13 · Magnet-ссылки

Объявление поддержки расширений

Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.

На этом этапе вы измените сообщение рукопожатия, чтобы сообщать о поддержке расширений вашим клиентом.

Рукопожатие расширений

Обмен метаданными торрента между пирами изначально не входил в стандартный протокол BitTorrent и был добавлен как расширение. Оно использует протокол расширений BitTorrent, позволяющий добавлять возможности без нарушения обратной совместимости.

На этапе «Рукопожатие с пиром» сообщение содержало восемь зарезервированных байтов (64 бита), равных нулю. Чтобы сообщить о поддержке расширений, клиент должен установить в 1 бит с номером 20 справа (нумерация с 0) в этих байтах.

В шестнадцатеричном виде зарезервированные байты после установки бита 20 справа в 1 будут выглядеть так:

00 00 00 00 00 10 00 00

(10 в шестнадцатеричной системе — это 16 в десятичной и 00010000 в двоичной.)

Если показать отдельные биты, получится следующее (левая часть опущена):

.... 00010000 00000000 00000000
        ^ 20th bit from the right, counting starts at 0

Все остальные зарезервированные биты остаются нулевыми.

Команда magnet_handshake

Для проверки программы на этом этапе вводится новая команда magnet_handshake. Она работает так:

$ ./your_program.sh magnet_handshake <magnet-link>
Peer ID: 0102030405060708090a0b0c0d0e0f1011121314

Программа должна:

  • Разобрать magnet-ссылку и получить URL трекера.
  • Выполнить GET-запрос трекеру и получить список пиров.
  • Установить TCP-соединение с пиром и выполнить рукопожатие.
    • В рукопожатии установить нужный зарезервированный бит, сообщающий о поддержке расширений.
  • Вывести идентификатор пира, полученный при рукопожатии.

Тесты

Тестирующая система запустит вашу программу следующим образом:

$ ./your_program.sh magnet_handshake <magnet-link>

Ожидаемый вывод:

Peer ID: 0102030405060708090a0b0c0d0e0f1011121314

Тестирующая система также проверит, что в зарезервированных байтах сообщения рукопожатия установлен правильный бит.

Примечания

  • Для локальной проверки можно использовать эти magnet-ссылки. Возможно, потребуется заключить ссылки в двойные кавычки, чтобы экранировать специальные символы в терминале.

Проверка в вашей IDE

Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.

Настройка проекта и IDE

1. Создайте проект один раз

node '/opt/graphlms/tools/project-lab/cli.mjs' init bittorrent ./my-bittorrent --language go

2. Откройте папку в IDE

cd ./my-bittorrent

Реализуйте требования этапа в созданном проекте.

Запустите из папки проекта

node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage pk2

Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.

Результат проверки

go / ЛОКАЛЬНО

Подключение к локальной проверке…

Здесь появится результат

Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.

GraphLMS — инженерная лаборатория роста