Tự xây dựng BitTorrent của riêng bạn
(app.codecrafters.io)- Thử thách BitTorrent của CodeCrafters hướng dẫn bạn tự triển khai giao thức chia sẻ tệp P2P và tải xuống các tệp được công khai sử dụng
- Lộ trình học bắt đầu từ giải mã bencode, rồi tiếp tục với phân tích tệp
.torrent, tính toán info hash, tìm peer, handshake và tải từng mảnh - Nội dung gồm tổng cộng 19 bước, kết hợp 11 bước BitTorrent cơ bản và 8 bước Magnet Links
- Có thể xem miễn phí cấu trúc các bước và hướng dẫn, nhưng gửi mã và xem lời giải thì cần CodeCrafters Membership
- Nếu muốn trải nghiệm miễn phí trước, bạn có thể chọn thử thách miễn phí của tháng này là Build your own Shell
Mục tiêu triển khai BitTorrent client
- Build your own BitTorrent là một thử thách của CodeCrafters, xem BitTorrent như một giao thức chia sẻ tệp P2P để phân phối dữ liệu quy mô lớn và yêu cầu bạn tự triển khai nó
- Mục tiêu cuối cùng là tạo ra một BitTorrent client có thể tải xuống các tệp được công khai sử dụng thông qua giao thức BitTorrent
- Trong quá trình đó, bạn cũng sẽ học cách giao thức BitTorrent và tệp .torrent hoạt động
Cấu trúc các bước và độ khó
-
Các bước BitTorrent cơ bản
- Triển khai tuần tự từ giải mã bencode, xử lý tệp torrent, kết nối peer đến tải tệp
- 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
-
Các bước Magnet Links
- Bắt đầu từ phân tích magnet link, rồi đi qua extension handshake, trao đổi metadata, tải mảnh và tải toàn bộ tệp
- 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
Điều kiện sử dụng
- Thử thách này yêu cầu CodeCrafters Membership
- Có thể học miễn phí toàn bộ cấu trúc thử thách và hướng dẫn từng bước
- Cần membership để gửi mã và xem lời giải
- Nếu muốn một thử thách miễn phí, bạn có thể thử Build your own Shell, hiện đang được cung cấp miễn phí trong tháng này
1 bình luận
Ý kiến trên Hacker News
Xin chào! Tôi là Sarp, người tạo ra thử thách Build your own BitTorrent của Codecrafters
Kể một chút về bối cảnh: sau khi bị sa thải khỏi công việc ở FAANG, tôi gần như không còn động lực quay lại, và bắt đầu tìm một dự án lập trình thú vị để khơi lại hứng thú coding
Trong thời gian sống kiểu digital nomad, tôi phát hiện Codecrafters trên Nomadlist, và thích cách đẩy code lên Git để vượt qua các bài test theo từng bước. Cách tiến triển được game hóa giúp tôi tập trung, và tôi có thể đào sâu hơn vào những phần mềm mình vẫn dùng như SQLite, Git, Redis. Tôi cũng học Go từ đầu để làm các thử thách
Khi đã hoàn thành mọi thử thách trên site và không còn việc gì để làm, tôi quyết định xây dựng client BitTorrent, một trong những ý tưởng được bình chọn nhiều
Khi làm client BitTorrent, tôi đã học được rất nhiều thứ như giao thức BitTorrent, cấu trúc file torrent, các vấn đề về encoding, pipelining các request mạng, URL encoding cho giá trị nhị phân, cách dùng channel trong Go, v.v.
Tôi muốn nhận feedback về thử thách này, và sẵn sàng trả lời mọi câu hỏi
Thấy thứ này được đăng lên khá thú vị, và có thể sẽ giúp tôi tiến triển
Cargo.tomlTôi muốn thử giải một phần thử thách bencode bằng nom; có thể đó là lựa chọn hơi quá tay, nhưng tôi định làm cho vui, còn hiện tại thì không thể
Nếu lo ngại tải hoặc thời gian chạy của remote builder, sẽ rất tốt nếu có cách chạy test case ở local để tránh vấn đề này
Jon Gjengset[1] hiện đang live coding bằng Rust cùng thử thách này trên kênh YT của anh ấy[2]
[1]: https://thesquareplanet.com/
[2]: https://www.youtube.com/watch?v=jSTkEPPiULs
Link tốt hơn là https://www.youtube.com/watch?v=jf_ddGnum_4, có đánh dấu chương và đã cắt bỏ đoạn mất điện ở giữa :p
[0] https://www.twitch.tv/videos/1954769913
Tôi không hiểu vì sao lại cần đăng nhập. Đây là tutorial trả phí à?
Tutorial miễn phí thì có ở đây
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
Rốt cuộc vì sao họ lại yêu cầu quyền truy cập tài khoản GitHub của tôi mà không giải thích gì cả?
Dù vậy họ vẫn nên giải thích vì sao cần
Lạ là phần upload lại bị thiếu. Nếu là peer thì đó là các bên tham gia ngang hàng, nên dữ liệu phải chảy hai chiều. Nếu không thì BitTorrent sẽ không hoạt động
Chúng tôi dự định thêm chức năng upload như một phần mở rộng của thử thách, và đây là một trong những ý tưởng mở rộng được cộng đồng bình chọn nhiều
Hiện vẫn chưa được hỗ trợ nhưng sẽ sớm có, và các phần mở rộng mới đang được thêm dựa trên bình chọn của người dùng
Nếu bạn dùng JavaScript thì có WebTorrent do Feross tạo ra, đưa giao thức này vào ngay trong một tab trình duyệt
Codebase của nó thật sự rất dễ đọc. Nhiều lập trình viên giỏi viết code hơn là đọc code, nhưng nếu muốn rèn luyện kỹ năng đọc code thì tôi chưa thấy nhiều nơi nào tốt để bắt đầu hơn codebase WebTorrent. Về độ thú vị khi đọc, tôi xếp nó ngang tầm redis
https://github.com/webtorrent/webtorrent
Tôi thật sự rất thích ý tưởng này! Trước đây tôi muốn học Erlang còn bạn tôi muốn học Crystal, nên chúng tôi đã rủ nhau thử làm các client hoàn toàn tùy chỉnh để có thể chia sẻ file với nhau
Khi đã gửi nhận file được bằng giao thức cơ bản và vài phần mở rộng, cảm giác rất vui. Gọi những phần mở rộng đó là BEP có đúng không nhỉ?
Đây có lẽ là cách học ngôn ngữ mới mà tôi thích nhất, vì nó đủ đơn giản để hiểu và triển khai
Càng qua từng năm, những ý tưởng dự án nhỏ khiến tôi háo hức càng ít đi, và đây là một trong số đó
Đây là lần đầu tôi nghe về CodeCrafters, nhưng tôi thích các ý tưởng thử thách mang tính học thuật như xây dựng cơ sở dữ liệu. Sẽ rất hay nếu có cả xây dựng compiler
https://twitter.com/codecraftersio/status/168850373608654028...
Tôi nhớ đến bài viết về việc tạo BitTorrent client bằng Go: https://blog.jse.li/posts/torrent/
Vài năm trước ở công ty cũ, chúng tôi đã tạo và hỗ trợ một Linux live OS tùy chỉnh để nhân viên dùng trên các netbook giá rẻ
Để phân phối bản cập nhật, chúng tôi tự xây một máy chủ torrent nội bộ từ đầu và dùng nó để phát hành các bản cập nhật image
Đó là một trong những trải nghiệm đầu tiên của tôi khi xây dựng phần mềm theo chuẩn và làm cho nó hoạt động với các client mặc định, nên là một quá trình học hỏi rất tốt