4 Punkte von GN⁺ 2023-10-20 | 1 Kommentare | Auf WhatsApp teilen
  • 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

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

 
GN⁺ 2023-10-20
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.

    • Tracker mit Einladungspflicht legen bei ihren eigenen privaten Trackern häufig ziemlich streng fest, welche Torrent-Clients verwendet werden dürfen und welche nicht. Ich frage mich, wie man diese Hürde überwinden könnte, damit eine breitere Nutzung möglich wird.
    • Ich frage mich, wie du gelernt hast, einen BitTorrent-Client zu bauen. Ich mag die Idee von Codecrafters oder von Büchern, die einen dabei anleiten, etwas selbst zu bauen, aber wenn ich keinen Einstiegspunkt finde, fällt es mir immer schwer.
    • Zufällig habe ich gerade ein BitTorrent-bezogenes Projekt gestartet. Ich glaube nicht, dass ich den Client selbst implementieren werde, aber vielleicht doch; zumindest muss ich die Erstellung von .torrent-Dateien und Magnet-Links implementieren, deshalb lerne ich gerade ein wenig über das Protokoll.
      Interessant, dass so etwas gerade auftaucht; vielleicht hilft es mir beim Vorankommen.
    • Bei der Stelle „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“ frage ich mich, ob du inzwischen bei Codecrafters angestellt bist.
    • Ich weiß nicht, ob das Feedback zur Challenge selbst ist, aber ich fand es etwas schade, dass man keine Abhängigkeiten zu Cargo.toml hinzufü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

    • Ah, das bin ich!
      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
    • Für Leute, bei denen YouTube blockiert ist, gibt es auch eine Kopie des Livestreams auf Twitch.
      [0] https://www.twitch.tv/videos/1954769913
    • Ihm beim Coden zuzusehen ist erstaunlich. Ich frage mich, ob es noch andere Experten gibt, die in Python coden, statt in Rust.
  • 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/

  • Warum zum Teufel verlangt es ohne jede Erklärung Zugriff auf meinen GitHub-Account?

    • Fairerweise steht dort, dass nur die Berechtigung zum Lesen der E-Mail-Adresse angefordert wird, aber ich bin nach diesem Schritt auch nicht weitergegangen.
    • Ein Grund scheint zu sein, dass Codecrafters eine Lernsite ist und Nutzercode nicht selbst hostet, sondern auf GitHub speichert. Dieser Beitrag handelt von einem Projekt auf Codecrafters.
      Trotzdem sollten sie erklären, warum das nötig ist.
    • Es sieht so aus, als würden sie GitHub nur als Authentifizierungsanbieter verwenden, ohne Alternativen wie eine normale Registrierung per E-Mail anzubieten. Normalerweise bieten solche Seiten mehrere Optionen an.
    • Das wird für die Authentifizierung benötigt. Der Originallink führt zu app.codecrafters.io, und codecrafters.io ist die Marketingseite. :)
    • Die Struktur ist so, dass man den Challenge-Code in sein eigenes Git hochlädt und dann einige Tests gegen diese Implementierung ausgeführt werden.
  • 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.

    • Stimmt. Wir haben ihn anfangs weggelassen, um den Umfang der Challenge zu begrenzen, weil sie mit 11 Schritten schon ziemlich lang ist.
      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.
    • Stimmt, „Seeding files“ ist eine Erweiterung: https://app.codecrafters.io/vote/challenge-extension-ideas?c...
      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.

    • CodeCrafters unterstützt auch Crystal. Man kann „Build your own Redis“ machen.
  • 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.

  • 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.