4 points par GN⁺ 2023-10-20 | 1 commentaires | Partager sur WhatsApp
  • Le défi BitTorrent de CodeCrafters consiste à implémenter soi-même un protocole de partage de fichiers P2P et à télécharger des fichiers accessibles publiquement
  • Le parcours d’apprentissage commence par le décodage bencode, puis enchaîne avec l’analyse de fichiers .torrent, le calcul de l’info hash, la découverte de pairs, le handshake et le téléchargement de morceaux
  • Il comprend 19 étapes au total, en combinant les 11 étapes de base de BitTorrent et les 8 étapes consacrées aux Magnet Links
  • La structure des étapes et les consignes sont consultables gratuitement, mais la soumission de code et l’accès aux solutions nécessitent un CodeCrafters Membership
  • Pour essayer gratuitement d’abord, vous pouvez choisir le défi gratuit du mois, Build your own Shell

Objectif de l’implémentation d’un client BitTorrent

  • Build your own BitTorrent est un défi CodeCrafters qui considère BitTorrent comme un protocole de partage de fichiers P2P pour la distribution de données à grande échelle, et propose de l’implémenter soi-même
  • L’objectif final est de créer un client BitTorrent capable de télécharger des fichiers accessibles publiquement via le protocole BitTorrent
  • Au fil du parcours, vous apprenez également le fonctionnement du protocole BitTorrent et des fichiers .torrent

Structure des étapes et difficulté

Conditions d’utilisation

  • Ce défi nécessite un CodeCrafters Membership
    • La structure complète du défi et les consignes des étapes peuvent être consultées gratuitement
    • La soumission de code et l’accès aux solutions nécessitent un abonnement
  • Si vous cherchez un défi gratuit, vous pouvez essayer Build your own Shell, proposé gratuitement ce mois-ci

1 commentaires

 
GN⁺ 2023-10-20
Avis sur Hacker News
  • Bonjour ! Je suis Sarp, le créateur du challenge Build your own BitTorrent de Codecrafters.
    Pour donner un peu de contexte, après avoir été licencié de mon poste chez FAANG, je n’avais quasiment aucune envie d’y retourner, et j’ai commencé à chercher des projets de programmation amusants qui pourraient raviver mon intérêt pour le code.
    Pendant ma vie de nomade numérique, j’ai découvert Codecrafters sur Nomadlist, et j’ai aimé le principe consistant à pousser son code sur Git pour passer des tests étape par étape. La progression gamifiée m’a aidé à rester concentré, et j’ai pu explorer plus en profondeur des logiciels que j’utilisais déjà, comme SQLite, Git et Redis. J’ai aussi appris Go à partir de zéro pour faire les challenges.
    Une fois tous les challenges du site terminés et n’ayant plus rien à faire, j’ai décidé de créer l’une des idées les plus votées : un client BitTorrent.
    En construisant un client BitTorrent, j’ai appris beaucoup de choses : le protocole BitTorrent, la structure des fichiers torrent, les problèmes d’encodage, le pipelining des requêtes réseau, l’encodage URL de valeurs binaires, l’utilisation des channels en Go, etc.
    J’aimerais recevoir des retours sur le challenge, et je répondrai volontiers aux questions.

    • Il est fréquent que les trackers sur invitation uniquement soient assez stricts sur les clients torrent autorisés ou non sur leur tracker privé. Je me demande comment cet obstacle pourrait être franchi pour une adoption plus large.
    • Je me demande comment tu as appris à créer un client BitTorrent. J’aime l’idée de Codecrafters ou des livres qui te guident pour construire quelque chose toi-même, mais j’ai toujours eu du mal quand je ne trouvais pas de point de départ.
    • Justement, je viens de commencer un projet lié à BitTorrent. Je ne pense pas implémenter le client moi-même, mais je le ferai peut-être, et au minimum je dois implémenter la création de fichiers .torrent et de liens magnet, donc je suis en train d’apprendre un peu le protocole.
      C’est intéressant de voir ça apparaître, et ça pourrait peut-être m’aider à avancer.
    • En lisant « Une fois tous les challenges du site terminés et n’ayant plus rien à faire, j’ai décidé de créer l’une des idées les plus votées : un client BitTorrent », je me demande si tu es désormais employé par Codecrafters.
    • Je ne sais pas si c’est un retour sur le challenge lui-même, mais j’ai été un peu déçu de ne pas pouvoir ajouter de dépendances dans Cargo.toml.
      Je voulais essayer de résoudre une partie du challenge bencode avec nom ; c’était peut-être excessif, mais je voulais le faire pour le plaisir, et ce n’est pas possible pour l’instant.
      Si le problème est la charge ou le temps d’exécution du builder distant, ce serait bien d’avoir un moyen d’exécuter les cas de test en local pour contourner cette difficulté.
  • Jon Gjengset[1] est en train de coder en live le même challenge en Rust sur sa chaîne YT[2].
    [1]: https://thesquareplanet.com/
    [2]: https://www.youtube.com/watch?v=jSTkEPPiULs

    • Ah, c’est moi !
      Un meilleur lien est https://www.youtube.com/watch?v=jf_ddGnum_4 ; il contient des chapitres et la coupure de courant au milieu a été supprimée :p
    • Pour les personnes chez qui YouTube est bloqué, il y a aussi une copie du livestream sur Twitch.
      [0] https://www.twitch.tv/videos/1954769913
    • Le regarder coder est impressionnant. Je me demande s’il existe aussi des experts qui codent en Python, en dehors de Rust.
  • Je ne comprends pas pourquoi il faut se connecter. Est-ce un tutoriel payant ?
    Des tutoriels gratuits sont disponibles ici :
    JS - https://allenkim67.github.io/programming/2016/05/04/how-to-m...
    GO - https://blog.jse.li/posts/torrent/
    Python - https://markuseliasson.se/article/bittorrent-in-python/

  • Je ne comprends vraiment pas pourquoi il demande l’accès à mon compte GitHub sans aucune explication.

    • Pour être juste, il est indiqué qu’il ne demande que l’autorisation de lire l’e-mail, mais moi non plus je ne suis pas allé plus loin que cette étape.
    • L’une des raisons semble être que Codecrafters est un site d’apprentissage et qu’il ne fait pas héberger directement le code des utilisateurs chez lui, mais le stocke sur GitHub. Cet article porte sur un projet de Codecrafters.
      Cela dit, ils devraient expliquer pourquoi c’est nécessaire.
    • Ils ne proposent pas d’alternative comme une inscription classique par e-mail, et semblent utiliser GitHub uniquement comme fournisseur d’authentification. En général, ce genre de sites propose plusieurs options.
    • C’est nécessaire pour l’authentification. Le lien original mène vers app.codecrafters.io, tandis que codecrafters.io est la page marketing :)
    • Le principe est que quand tu publies le code du challenge sur ton Git, quelques tests sont exécutés sur cette implémentation.
  • Curieusement, la partie upload manque. Si l’on parle de pairs, ce sont des participants égaux, donc les données devraient circuler dans les deux sens. Sinon, BitTorrent ne fonctionnerait pas.

    • Exact. Nous l’avons exclue au départ pour réduire le périmètre du défi, car il compte déjà 11 étapes et est donc assez long.
      Nous prévoyons d’ajouter la fonction d’upload comme extension du défi, et c’est l’une des idées d’extension qui a reçu beaucoup de votes de la communauté.
    • Exact, « Seeding files » est une extension : https://app.codecrafters.io/vote/challenge-extension-ideas?c...
      Elle n’est pas encore prise en charge, mais elle le sera bientôt, et nous ajoutons les nouvelles extensions en fonction des votes des utilisateurs.
  • Si vous utilisez JavaScript, il y a WebTorrent, créé par Feross, qui a amené le protocole directement dans un onglet de navigateur.
    La base de code est vraiment agréable à lire. Beaucoup de développeurs sont meilleurs pour écrire du code que pour en lire ; si vous voulez entraîner votre capacité à lire du code, j’ai rarement vu un meilleur point de départ que la base de code de WebTorrent. Pour le plaisir de lecture, je la mets au même niveau que redis.
    https://github.com/webtorrent/webtorrent

  • J’adore vraiment cette idée ! Il y a quelque temps, je voulais apprendre Erlang et un ami voulait apprendre Crystal, alors on s’était dit qu’on allait créer chacun un client entièrement personnalisé pour pouvoir partager des fichiers entre nous.
    C’était vraiment amusant quand on a réussi à s’échanger des fichiers avec le protocole de base et quelques extensions. C’est bien comme ça qu’on appelle ces extensions, des BEP ?
    C’est probablement ma manière préférée d’apprendre un nouveau langage : c’est suffisamment simple pour être compris et implémenté.

    • CodeCrafters prend aussi en charge Crystal. On peut y faire « Build your own Redis ».
  • Avec les années, il y a de moins en moins de petites idées de projet qui me donnent envie, mais celle-ci en fait partie.
    Je n’avais jamais entendu parler de CodeCrafters, mais j’aime bien ces idées de défis académiques, comme créer une base de données. Ce serait bien qu’il y ait aussi la création d’un compilateur.

  • Cela me rappelle un article sur la création d’un client BitTorrent en Go : https://blog.jse.li/posts/torrent/

  • Il y a quelques années, dans mon ancien poste, nous avions créé et maintenu un OS Linux live personnalisé que les employés pouvaient utiliser sur des netbooks bon marché.
    Pour distribuer les mises à jour, nous avions créé de zéro un serveur torrent interne, que nous utilisions pour diffuser les mises à jour des images.
    C’était l’une de mes premières expériences de développement d’un logiciel conforme à un standard et capable de fonctionner avec des clients classiques ; ce fut un très bon apprentissage.