Construire son propre BitTorrent
(app.codecrafters.io)- 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é
-
Étapes BitTorrent de base
- Implémentation progressive, du décodage bencode au téléchargement de fichiers, en passant par le traitement des fichiers torrent et la connexion aux pairs
- Decode bencoded strings : Very easy
- Decode bencoded integers : Easy
- Decode bencoded lists : Easy
- Decode bencoded dictionaries : Easy
- Parse torrent file : Easy
- Calculate info hash : Medium
- Piece hashes : Easy
- Discover peers : Medium
- Peer handshake : Medium
- Download a piece : Hard
- Download the whole file : Hard
-
Étapes Magnet Links
- Couvre l’analyse d’un magnet link, puis le handshake d’extension, l’échange de métadonnées, et le téléchargement de morceaux puis du fichier complet
- Parse magnet link : Easy
- Announce extension support : Easy
- Send extension handshake : Easy
- Receive extension handshake : Easy
- Request metadata : Easy
- Receive metadata : Easy
- Download a piece : Hard
- Download the whole file : Hard
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
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.
C’est intéressant de voir ça apparaître, et ça pourrait peut-être m’aider à avancer.
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
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
[0] https://www.twitch.tv/videos/1954769913
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/
https://github.com/codecrafters-io/build-your-own-x
Je ne comprends vraiment pas pourquoi il demande l’accès à mon compte GitHub sans aucune explication.
Cela dit, ils devraient expliquer pourquoi c’est nécessaire.
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.
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é.
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é.
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.
https://twitter.com/codecraftersio/status/168850373608654028...
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.