Проектная лаборатория
Собственный BitTorrent
Этап 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 go2. Откройте папку в IDE
cd ./my-bittorrentРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage pk2Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.