自分だけのBitTorrentを構築する
(app.codecrafters.io)- CodeCraftersのBitTorrentチャレンジは、P2Pファイル共有プロトコルを自分で実装し、公開されているファイルをダウンロードする過程を扱う
- 学習の流れはbencodeのデコードから始まり、.torrentファイルの解析、info hashの計算、ピアの発見、ハンドシェイク、ピースのダウンロードへと進む
- 基本BitTorrentの11ステップとMagnet Linksの8ステップを合わせ、全19ステップで構成されている
- ステップ構成と手順は無料で閲覧できるが、コード提出とソリューションの閲覧にはCodeCrafters Membershipが必要
- 無料でまず試したい場合は、今月の無料チャレンジであるBuild your own Shellを選べる
BitTorrentクライアントの実装目標
- Build your own BitTorrentは、BitTorrentを大規模データ配信用のP2Pファイル共有プロトコルとして捉え、それを自分で実装するCodeCraftersのチャレンジ
- 最終目標は、BitTorrentプロトコルで公開されているファイルをダウンロードできるBitTorrentクライアントを作ること
- 過程の中で、BitTorrentプロトコルと**.torrentファイル**の仕組みもあわせて学ぶ
ステップ構成と難易度
-
基本BitTorrentステップ
- bencodeのデコードからtorrentファイル処理、ピア接続、ファイルダウンロードまで順番に実装する
- 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ステップ
- magnet linkの解析から始まり、拡張ハンドシェイク、メタデータ交換、ピースおよびファイル全体のダウンロードまで扱う
- 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
利用条件
- このチャレンジにはCodeCrafters Membershipが必要
- チャレンジ全体の構成と各ステップの手順は無料で学習可能
- コード提出とソリューション閲覧にはメンバーシップが必要
- 無料チャレンジを希望する場合は、今月無料で提供されているBuild your own Shellを試せる
1件のコメント
Hacker News のコメント
こんにちは!Codecrafters の Build your own BitTorrent チャレンジを作った Sarp です
少し背景を話すと、FAANG の職場を解雇されたあと、戻りたいという意欲がほとんどなくなり、コーディングへの興味を取り戻せるような面白いプログラミングプロジェクトを探し始めました
デジタルノマド生活の中で Nomadlist で Codecrafters を見つけ、コードを Git に push して段階ごとのテストを通過していく方式が気に入りました。ゲーム化された進行方式が集中する助けになり、SQLite、Git、Redis のように普段使っていたソフトウェアをより深く掘り下げることができました。チャレンジのために Go も新しく学びました
サイト上のすべてのチャレンジを終えてやることがなくなったとき、投票の多かったアイデアの一つである BitTorrent クライアントを作ることにしました
BitTorrent クライアントを作る中で、BitTorrent プロトコル、トレントファイルの構造、エンコーディングの問題、ネットワークリクエストのパイプライニング、バイナリ値の URL エンコード、Go のチャネルの使い方など、多くのことを学びました
チャレンジへのフィードバックをもらいたいですし、質問にも喜んで答えます
こういうものが投稿されていて興味深いですし、進めるうえで役に立つかもしれません
Cargo.tomlに依存関係を追加できないのが少し残念でしたbencode チャレンジの一部を nom で解いてみたかったのですが、やりすぎな選択かもしれないものの、楽しみで試そうとしていたことで、現状では不可能です
リモートビルダーの負荷や実行時間が心配なのであれば、この問題を避けられるようにテストケースをローカルで実行する方法があるとよいと思います
Jon Gjengset[1] が今、自分の YT チャンネル[2]で同じチャレンジを Rust でライブコーディングしています
[1]: https://thesquareplanet.com/
[2]: https://www.youtube.com/watch?v=jSTkEPPiULs
よりよいリンクは https://www.youtube.com/watch?v=jf_ddGnum_4 で、チャプター表示があり、途中の停電部分もカットしてあります :p
[0] https://www.twitch.tv/videos/1954769913
なぜログインが必要なのか分かりません。これは有料チュートリアルですか?
無料チュートリアルならここにあります
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
いったいなぜ何の説明もなく私の GitHub アカウントへのアクセス権を要求するのか分かりません
それでも、なぜ必要なのかは説明すべきです
奇妙なことに、アップロード部分が抜けている。ピアであるなら対等な参加者なので、データは双方向に流れるべき。そうでなければ BitTorrent は動作しないはず
アップロード機能はチャレンジの拡張として追加する予定で、コミュニティで多くの票を集めている拡張アイデアの一つ
まだサポートされていないが、近いうちに提供予定で、新しい拡張はユーザー投票に応じて追加している
JavaScript を使う人なら、Feross が作った WebTorrent があり、これはプロトコルをブラウザタブの中に持ち込んだもの
コードベースは本当に読みやすい。多くの開発者はコードを読むより書くほうが得意だが、コードを読む力を鍛えたいなら、WebTorrent のコードベースほど始めるのに良い場所はあまり見たことがない。読む楽しさでは redis と同じくらいのレベルだと思う
https://github.com/webtorrent/webtorrent
このアイデアは本当に気に入った! 以前、Erlang を学びたくて、友人は Crystal を学びたがっていたので、完全にカスタムのクライアントで互いにファイルを共有できるようにしてみようと話した
基本プロトコルといくつかの拡張でファイルをやり取りできるようになったときは本当に楽しかった。その拡張は BEP と呼ぶので合っているのかな?
新しい言語を学ぶ方法としては、おそらく一番好きなやり方。理解して実装するのに十分シンプルだから
年を追うごとにワクワクさせてくれる小さなプロジェクトアイデアはどんどん減っているが、これはその一つ
CodeCrafters は初めて聞いたが、データベースを作るような学術的なチャレンジアイデアが気に入った。コンパイラ作りも入るといい
https://twitter.com/codecraftersio/status/168850373608654028...
Go で BitTorrent クライアントを作っていた記事を思い出す: https://blog.jse.li/posts/torrent/
数年前、以前の職場で、社員が安価なネットブックで使えるカスタムの Linux ライブ OS を作成してサポートしていた
アップデート配布のために社内用のトレントサーバーをゼロから自作し、イメージ更新の配布に使っていた
標準に準拠したソフトウェアを作り、既存のクライアント群と動作させた最初の経験の一つで、良い学習過程だった