สร้าง BitTorrent ของคุณเอง
(app.codecrafters.io)- ชาเลนจ์ BitTorrent ของ CodeCrafters ครอบคลุมกระบวนการลงมือสร้าง โปรโตคอลแชร์ไฟล์แบบ P2P เพื่อดาวน์โหลดไฟล์ที่เปิดให้ใช้งานสาธารณะ
- ลำดับการเรียนรู้เริ่มจาก การถอดรหัส bencode ต่อด้วยการพาร์สไฟล์ .torrent, การคำนวณ info hash, การค้นหา peer, handshake และการดาวน์โหลดชิ้นส่วนไฟล์
- ประกอบด้วยทั้งหมด 19 ขั้นตอน โดยรวม 11 ขั้นตอน BitTorrent พื้นฐาน และ 8 ขั้นตอนของ Magnet Links
- สามารถดูโครงสร้างขั้นตอนและคำแนะนำได้ฟรี แต่ต้องมี CodeCrafters Membership สำหรับ การส่งโค้ด และการดูโซลูชัน
- หากต้องการทดลองฟรีก่อน สามารถเลือกชาเลนจ์ฟรีประจำเดือนนี้คือ Build your own Shell ได้
เป้าหมายของการสร้างไคลเอนต์ BitTorrent
- Build your own BitTorrent เป็นชาเลนจ์ของ CodeCrafters ที่มอง BitTorrent เป็น โปรโตคอลแชร์ไฟล์แบบ P2P สำหรับกระจายข้อมูลปริมาณมาก และให้ลงมือสร้างด้วยตัวเอง
- เป้าหมายสุดท้ายคือการสร้าง ไคลเอนต์ BitTorrent ที่สามารถดาวน์โหลดไฟล์ที่เปิดให้ใช้งานสาธารณะผ่านโปรโตคอล BitTorrent ได้
- ระหว่างทางจะได้เรียนรู้ทั้งโปรโตคอล BitTorrent และวิธีการทำงานของ ไฟล์ .torrent
โครงสร้างขั้นตอนและระดับความยาก
-
ขั้นตอน BitTorrent พื้นฐาน
- สร้างตามลำดับตั้งแต่การถอดรหัส bencode ไปจนถึงการจัดการไฟล์ torrent, การเชื่อมต่อกับ peer และการดาวน์โหลดไฟล์
- Decode bencoded strings: ง่ายมาก
- Decode bencoded integers: ง่าย
- Decode bencoded lists: ง่าย
- Decode bencoded dictionaries: ง่าย
- Parse torrent file: ง่าย
- Calculate info hash: ปานกลาง
- Piece hashes: ง่าย
- Discover peers: ปานกลาง
- Peer handshake: ปานกลาง
- Download a piece: ยาก
- Download the whole file: ยาก
-
ขั้นตอน Magnet Links
- ครอบคลุมตั้งแต่การพาร์ส magnet link ไปจนถึง extension handshake, การแลกเปลี่ยน metadata และการดาวน์โหลดชิ้นส่วนไฟล์รวมถึงไฟล์ทั้งหมด
- Parse magnet link: ง่าย
- Announce extension support: ง่าย
- Send extension handshake: ง่าย
- Receive extension handshake: ง่าย
- Request metadata: ง่าย
- Receive metadata: ง่าย
- Download a piece: ยาก
- Download the whole file: ยาก
เงื่อนไขการใช้งาน
- ชาเลนจ์นี้ต้องใช้ CodeCrafters Membership
- สามารถเรียนรู้โครงสร้างชาเลนจ์ทั้งหมดและคำแนะนำในแต่ละขั้นตอนได้ฟรี
- ต้องมีสมาชิกภาพสำหรับการส่งโค้ดและการดูโซลูชัน
- หากต้องการชาเลนจ์ฟรี สามารถลอง Build your own Shell ซึ่งเปิดให้ใช้ฟรีในเดือนนี้ได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
สวัสดีครับ! ผมชื่อ Sarp เป็นคนสร้างชาเลนจ์ Build your own BitTorrent ของ Codecrafters
ขอเล่าที่มาสักหน่อย หลังจากถูกเลิกจ้างจากงานที่ FAANG ผมแทบไม่มีแรงจูงใจอยากกลับไปทำงานแบบนั้นอีก และเริ่มมองหาโปรเจกต์เขียนโปรแกรมสนุก ๆ ที่จะช่วยปลุกความสนใจในการโค้ดดิ้งกลับมา
ระหว่างใช้ชีวิตแบบดิจิทัลโนแมด ผมเจอ Codecrafters บน Nomadlist และชอบรูปแบบที่ให้ push โค้ดขึ้น Git เพื่อผ่านการทดสอบทีละขั้น วิธีดำเนินความคืบหน้าแบบ gamification ช่วยให้มีสมาธิ และทำให้ได้เจาะลึกซอฟต์แวร์ที่เคยใช้อยู่แล้วอย่าง SQLite, Git, Redis มากขึ้น ผมยังเรียน Go ใหม่เพื่อทำชาเลนจ์ด้วย
พอทำชาเลนจ์ทั้งหมดบนไซต์เสร็จจนไม่มีอะไรให้ทำแล้ว ผมจึงตัดสินใจสร้าง ไคลเอนต์ BitTorrent ซึ่งเป็นหนึ่งในไอเดียที่มีคนโหวตเยอะ
ระหว่างสร้างไคลเอนต์ BitTorrent ผมได้เรียนรู้อะไรมากมาย ทั้งโปรโตคอล BitTorrent, โครงสร้างไฟล์ทอร์เรนต์, ปัญหาเรื่อง encoding, การทำ pipelining ของ network request, การ URL encode ค่าบายินารี, การใช้ channel ใน Go ฯลฯ
อยากได้ฟีดแบ็กเกี่ยวกับชาเลนจ์ และยินดีตอบคำถามครับ
น่าสนใจที่มีสิ่งนี้โผล่มา และอาจช่วยให้เดินหน้าต่อได้
Cargo.tomlไม่ได้ผมอยากลองแก้บางส่วนของชาเลนจ์ bencode ด้วย nom ซึ่งอาจจะเกินจำเป็น แต่ตั้งใจลองเล่นสนุก ๆ และตอนนี้ทำไม่ได้
ถ้ากังวลเรื่องโหลดของ remote builder หรือเวลาในการรัน ก็น่าจะมีวิธีให้ รัน test case ในเครื่อง local เพื่อหลีกเลี่ยงปัญหานี้ได้
Jon Gjengset[1] กำลัง ไลฟ์โค้ดชาเลนจ์เดียวกันด้วย Rust บนช่อง YT[2] ของเขาอยู่
[1]: https://thesquareplanet.com/
[2]: https://www.youtube.com/watch?v=jSTkEPPiULs
ลิงก์ที่ดีกว่าคือ https://www.youtube.com/watch?v=jf_ddGnum_4 มีการใส่ chapter และตัดช่วงไฟดับตรงกลางออกแล้ว :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 ของผมโดยไม่มีคำอธิบายอะไร
ถึงอย่างนั้นก็ควรอธิบายว่าทำไมถึงจำเป็น
น่าแปลกที่ส่วนอัปโหลดหายไป ถ้าเป็น peer ก็หมายถึงผู้เข้าร่วมที่เท่าเทียมกัน ดังนั้นข้อมูลควรไหลได้ทั้งสองทาง ไม่อย่างนั้น BitTorrent ก็คงทำงานไม่ได้
มีแผนจะเพิ่ม ฟีเจอร์อัปโหลด เป็นส่วนขยายของชาเลนจ์ และเป็นหนึ่งในไอเดียส่วนขยายที่ชุมชนโหวตกันมาก
ตอนนี้ยังไม่รองรับ แต่จะเปิดให้ใช้เร็ว ๆ นี้ และส่วนขยายใหม่ ๆ จะเพิ่มตามผลโหวตของผู้ใช้
ถ้าใช้ JavaScript ก็มี WebTorrent ที่ Feross สร้างไว้ ซึ่งนำโปรโตคอลนี้เข้าไปทำงานในแท็บเบราว์เซอร์ได้
โค้ดเบสอ่านได้ดีมาก นักพัฒนาหลายคนเขียนโค้ดเก่งกว่าอ่านโค้ด ถ้าอยากฝึกทักษะการอ่านโค้ด ผมไม่ค่อยเห็นที่ไหนเหมาะสำหรับเริ่มต้นเท่าโค้ดเบสของ WebTorrent ในแง่ความสนุกในการอ่าน ผมจัดให้อยู่ระดับเดียวกับ redis
https://github.com/webtorrent/webtorrent
ชอบไอเดียนี้มาก! เมื่อก่อนผมอยากเรียน Erlang และเพื่อนอยากเรียน Crystal เลยคุยกันว่าจะลองทำให้แชร์ไฟล์กันได้ด้วยไคลเอนต์ที่คัสตอมเองทั้งหมด
ตอนที่ทำให้รับส่งไฟล์กันได้ด้วยโปรโตคอลพื้นฐานและส่วนขยายบางอย่าง สนุกมาก ส่วนขยายพวกนั้นเรียกว่า BEP ใช่ไหม?
น่าจะเป็นวิธีเรียนภาษาใหม่ที่ผมชอบที่สุด เพราะมันเรียบง่ายพอให้เข้าใจและนำไป implement ได้
ยิ่งเวลาผ่านไป ไอเดียโปรเจกต์เล็ก ๆ ที่ทำให้ตื่นเต้นก็ยิ่งน้อยลง แต่ไอเดียนี้เป็นหนึ่งในนั้น
เพิ่งเคยได้ยิน CodeCrafters เป็นครั้งแรก แต่ชอบ ไอเดียชาเลนจ์เชิงวิชาการ อย่างการสร้างฐานข้อมูลเอง ถ้ามีสร้างคอมไพเลอร์ด้วยก็น่าจะดี
https://twitter.com/codecraftersio/status/168850373608654028...
นึกถึงบทความที่สร้าง BitTorrent client ด้วย Go: https://blog.jse.li/posts/torrent/
หลายปีก่อนที่บริษัทเก่า ผมเคยสร้างและดูแล Linux live OS แบบคัสตอมให้พนักงานใช้บนเน็ตบุ๊กราคาถูก
เพื่อแจกจ่ายอัปเดต เราสร้างเซิร์ฟเวอร์ทอร์เรนต์ภายในขึ้นมาเองตั้งแต่ศูนย์ และใช้มันแจกจ่ายอัปเดตอิมเมจ
เป็นหนึ่งในประสบการณ์แรก ๆ ที่ได้ทำซอฟต์แวร์ให้เป็นไปตามมาตรฐานและใช้งานร่วมกับไคลเอนต์พื้นฐานได้ จึงเป็นกระบวนการเรียนรู้ที่ดี