Eigenes BitTorrent bauen
(app.codecrafters.io)- Die BitTorrent-Challenge von CodeCrafters behandelt die eigene Implementierung des P2P-Dateifreigabeprotokolls, um öffentlich verfügbare Dateien herunterzuladen
- Der Lernpfad beginnt mit dem Dekodieren von bencode und führt weiter über das Parsen von .torrent-Dateien, die Berechnung des Info-Hashs, Peer Discovery, Handshake und das Herunterladen von Pieces
- Sie besteht aus insgesamt 19 Stufen: 11 grundlegende BitTorrent-Stufen und 8 Stufen zu Magnet Links
- Die Stufenstruktur und Anleitungen sind kostenlos einsehbar, für Code-Einreichungen und den Zugriff auf Lösungen ist jedoch eine CodeCrafters Membership erforderlich
- Wer zuerst kostenlos ausprobieren möchte, kann die kostenlose Challenge dieses Monats wählen: Build your own Shell
Ziel: Implementierung eines BitTorrent-Clients
- Build your own BitTorrent ist eine CodeCrafters-Challenge, die BitTorrent als P2P-Dateifreigabeprotokoll für die Verteilung großer Datenmengen betrachtet und dessen eigene Implementierung zum Ziel hat
- Das Endziel ist es, einen BitTorrent-Client zu bauen, der mit dem BitTorrent-Protokoll öffentlich verfügbare Dateien herunterladen kann
- Im Verlauf lernt man zugleich, wie das BitTorrent-Protokoll und .torrent-Dateien funktionieren
Aufbau der Stufen und Schwierigkeitsgrad
-
Grundlegende BitTorrent-Stufen
- Implementiert wird der Reihe nach vom Dekodieren von bencode über die Verarbeitung von Torrent-Dateien und Peer-Verbindungen bis zum Datei-Download
- 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
-
Magnet-Links-Stufen
- Behandelt wird alles vom Parsen eines Magnet Links über erweiterten Handshake und Metadatenaustausch bis zum Herunterladen einzelner Pieces und der gesamten Datei
- 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
Nutzungsbedingungen
- Diese Challenge erfordert eine CodeCrafters Membership
- Die gesamte Challenge-Struktur und die Anleitungen zu den Stufen können kostenlos gelernt bzw. eingesehen werden
- Für Code-Einreichungen und den Zugriff auf Lösungen ist eine Mitgliedschaft erforderlich
- Wer eine kostenlose Challenge sucht, kann Build your own Shell ausprobieren, das diesen Monat kostenlos angeboten wird
1 Kommentare
Meinungen auf Hacker News
Hallo! Ich bin Sarp, der den „Build your own BitTorrent“-Challenge von Codecrafters erstellt hat.
Ein bisschen Hintergrund: Nachdem ich bei einem FAANG-Arbeitgeber entlassen worden war, hatte ich kaum Motivation, dorthin zurückzukehren, und begann nach einem spannenden Programmierprojekt zu suchen, das meine Freude am Coden wiederbeleben könnte.
Während meines Lebens als digitaler Nomade entdeckte ich Codecrafters auf Nomadlist, und mir gefiel der Ansatz, Code nach Git zu pushen und damit schrittweise Tests zu bestehen. Die gamifizierte Progression half mir, fokussiert zu bleiben, und ich konnte Software, die ich ohnehin nutzte, wie SQLite, Git und Redis, tiefergehend erkunden. Für die Challenges habe ich auch Go neu gelernt.
Nachdem ich alle Challenges auf der Website abgeschlossen hatte und nichts mehr zu tun hatte, beschloss ich, eine der Ideen mit vielen Stimmen umzusetzen: einen BitTorrent-Client.
Beim Bau eines BitTorrent-Clients habe ich viel gelernt: über das BitTorrent-Protokoll, die Struktur von Torrent-Dateien, Encoding-Probleme, Pipelining von Netzwerkanfragen, URL-Encoding binärer Werte, die Nutzung von Channels in Go und mehr.
Ich würde mich über Feedback zur Challenge freuen und beantworte auch gern Fragen.
Interessant, dass so etwas gerade auftaucht; vielleicht hilft es mir beim Vorankommen.
Cargo.tomlhinzufügen konnte.Ich wollte einen Teil der bencode-Challenge mit nom lösen; vielleicht wäre das übertrieben gewesen, aber ich wollte es zum Spaß ausprobieren, und derzeit ist das nicht möglich.
Falls die Sorge die Last oder Laufzeit des Remote-Builders ist, wäre es schön, wenn es eine Möglichkeit gäbe, die Testfälle lokal auszuführen, um dieses Problem zu umgehen.
Jon Gjengset[1] codet gerade dieselbe Challenge in Rust live auf seinem YT-Kanal[2].
[1]: https://thesquareplanet.com/
[2]: https://www.youtube.com/watch?v=jSTkEPPiULs
Der bessere Link ist https://www.youtube.com/watch?v=jf_ddGnum_4; dort gibt es Kapitelmarken, und der Stromausfall in der Mitte wurde herausgeschnitten :p
[0] https://www.twitch.tv/videos/1954769913
Ich verstehe nicht, warum ein Login nötig ist. Ist das ein bezahltes Tutorial?
Kostenlose Tutorials gibt es hier:
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
Warum zum Teufel verlangt es ohne jede Erklärung Zugriff auf meinen GitHub-Account?
Trotzdem sollten sie erklären, warum das nötig ist.
Seltsamerweise fehlt der Upload-Teil. Als Peer ist man ein gleichberechtigter Teilnehmer, also sollten Daten in beide Richtungen fließen. Andernfalls würde BitTorrent nicht funktionieren.
Die Upload-Funktion wollen wir als Erweiterung der Challenge hinzufügen; sie ist eine der Erweiterungsideen, für die die Community viele Stimmen abgegeben hat.
Sie wird noch nicht unterstützt, soll aber bald kommen; neue Erweiterungen fügen wir anhand der Nutzerabstimmungen hinzu.
Wenn man JavaScript verwendet, gibt es WebTorrent von Feross, das das Protokoll in den Browser-Tab gebracht hat.
Die Codebasis ist wirklich gut zu lesen. Viele Entwickler sind besser darin, Code zu schreiben, als ihn zu lesen; wenn man seine Fähigkeit zum Code-Lesen trainieren möchte, habe ich kaum einen besseren Einstieg gesehen als die WebTorrent-Codebasis. Vom Lesespaß her würde ich sie in eine ähnliche Liga wie redis einordnen.
https://github.com/webtorrent/webtorrent
Diese Idee gefällt mir wirklich! Früher wollte ich Erlang lernen, und ein Freund wollte Crystal lernen, also haben wir uns vorgenommen, komplett eigene Clients zu bauen, mit denen wir untereinander Dateien teilen können.
Es hat richtig Spaß gemacht, als wir mit dem Basisprotokoll und ein paar Erweiterungen Dateien hin- und herschicken konnten. Nennt man diese Erweiterungen eigentlich BEP?
Das ist vermutlich meine liebste Art, eine neue Sprache zu lernen, weil es einfach genug ist, um es zu verstehen und umzusetzen.
Mit jedem Jahr gibt es weniger kleine Projektideen, die mich begeistern, aber das hier ist eine davon.
Von CodeCrafters habe ich zum ersten Mal gehört, aber mir gefallen diese akademischen Challenge-Ideen wie der Bau einer Datenbank. Ein Compiler-Bau wäre auch schön.
https://twitter.com/codecraftersio/status/168850373608654028...
Das erinnert mich an einen Beitrag darüber, wie jemand einen BitTorrent-Client in Go gebaut hat: https://blog.jse.li/posts/torrent/
Vor ein paar Jahren habe ich bei meinem früheren Arbeitgeber ein eigenes Linux-Live-OS gebaut und betreut, das Mitarbeiter auf günstigen Netbooks nutzen konnten.
Für die Verteilung von Updates habe ich von Grund auf einen internen Torrent-Server gebaut und ihn genutzt, um Image-Updates auszurollen.
Es war eine meiner ersten Erfahrungen damit, Software standardkonform zu entwickeln und sie mit den Standard-Clients zum Laufen zu bringen; das war ein guter Lernprozess.