Construye tu propio BitTorrent
(app.codecrafters.io)- El desafío de BitTorrent de CodeCrafters trata de implementar tú mismo un protocolo P2P para compartir archivos y descargar archivos disponibles públicamente
- El flujo de aprendizaje comienza con la decodificación de bencode y continúa con el parseo de archivos
.torrent, el cálculo del info hash, el descubrimiento de peers, el handshake y la descarga de piezas - Está compuesto por un total de 19 etapas, combinando 11 etapas básicas de BitTorrent y 8 etapas de Magnet Links
- La estructura de las etapas y las instrucciones pueden verse gratis, pero para enviar código y consultar las soluciones se necesita CodeCrafters Membership
- Si quieres probar gratis primero, puedes elegir el desafío gratuito de este mes: Build your own Shell
Objetivo de implementar un cliente de BitTorrent
- Build your own BitTorrent es un desafío de CodeCrafters que presenta BitTorrent como un protocolo P2P para distribuir grandes volúmenes de datos y te guía para implementarlo por tu cuenta
- El objetivo final es crear un cliente de BitTorrent capaz de descargar archivos disponibles públicamente usando el protocolo BitTorrent
- Durante el proceso también aprenderás cómo funcionan el protocolo BitTorrent y los archivos .torrent
Estructura de etapas y dificultad
-
Etapas básicas de BitTorrent
- Se implementa paso a paso, desde la decodificación de bencode y el procesamiento de archivos torrent hasta la conexión con peers y la descarga de archivos
- Decode bencoded strings: Muy fácil
- Decode bencoded integers: Fácil
- Decode bencoded lists: Fácil
- Decode bencoded dictionaries: Fácil
- Parse torrent file: Fácil
- Calculate info hash: Medio
- Piece hashes: Fácil
- Discover peers: Medio
- Peer handshake: Medio
- Download a piece: Difícil
- Download the whole file: Difícil
-
Etapas de Magnet Links
- Abarca desde el parseo de magnet links hasta el handshake extendido, el intercambio de metadatos y la descarga de piezas y del archivo completo
- Parse magnet link: Fácil
- Announce extension support: Fácil
- Send extension handshake: Fácil
- Receive extension handshake: Fácil
- Request metadata: Fácil
- Receive metadata: Fácil
- Download a piece: Difícil
- Download the whole file: Difícil
Condiciones de uso
- Este desafío requiere CodeCrafters Membership
- Toda la estructura del desafío y las instrucciones de cada etapa pueden estudiarse gratis
- Para enviar código y consultar las soluciones se necesita la membresía
- Si quieres un desafío gratuito, puedes probar Build your own Shell, disponible gratis este mes
1 comentarios
Opiniones de Hacker News
¡Hola! Soy Sarp, el creador del desafío Build your own BitTorrent de Codecrafters.
Para contar un poco el contexto: después de que me despidieran de mi trabajo en FAANG, tenía muy pocas ganas de volver, y empecé a buscar proyectos de programación interesantes que reavivaran mi interés por codear.
Mientras llevaba una vida de nómada digital, descubrí Codecrafters en Nomadlist, y me gustó el enfoque de hacer push del código a Git para pasar pruebas paso a paso. La progresión gamificada me ayudó a concentrarme, y pude profundizar en software que ya usaba, como SQLite, Git y Redis. También aprendí Go desde cero para hacer los desafíos.
Cuando terminé todos los desafíos del sitio y me quedé sin nada que hacer, decidí crear una de las ideas más votadas: un cliente BitTorrent.
Al crear un cliente BitTorrent aprendí mucho sobre el protocolo BitTorrent, la estructura de los archivos torrent, problemas de codificación, pipelining de solicitudes de red, codificación URL de valores binarios, el uso de canales en Go, etc.
Me gustaría recibir feedback sobre el desafío y con gusto responderé preguntas.
Me parece interesante que hayan publicado esto, y quizá me ayude a avanzar.
Cargo.toml.Quería intentar resolver parte del desafío de bencode con nom; quizás era una elección excesiva, pero quería hacerlo por diversión y ahora no es posible.
Si les preocupa la carga del builder remoto o el tiempo de ejecución, sería bueno tener una forma de ejecutar los casos de prueba localmente para evitar ese problema.
Jon Gjengset[1] está ahora mismo programando en vivo en Rust el mismo desafío en su canal de YT[2].
[1]: https://thesquareplanet.com/
[2]: https://www.youtube.com/watch?v=jSTkEPPiULs
Un mejor enlace es https://www.youtube.com/watch?v=jf_ddGnum_4, tiene capítulos y también recorté el corte de luz del medio :p
[0] https://www.twitch.tv/videos/1954769913
No entiendo por qué hace falta iniciar sesión. ¿Es un tutorial de pago?
Hay tutoriales gratuitos aquí:
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
No entiendo por qué demonios pide acceso a mi cuenta de GitHub sin ninguna explicación.
Aun así, deberían explicar por qué es necesario.
Curiosamente falta la parte de subida. Si es un par, entonces es un participante igualitario, así que los datos deberían fluir en ambas direcciones. De lo contrario, BitTorrent no funcionaría.
Tenemos previsto agregar la función de subida como una extensión del desafío, y es una de las ideas de extensión que más votos recibió de la comunidad.
Todavía no está disponible, pero lo estará pronto, y estamos agregando nuevas extensiones según los votos de los usuarios.
Para quienes usan JavaScript, existe WebTorrent, creado por Feross, que llevó el protocolo dentro de una pestaña del navegador.
Su base de código es realmente agradable de leer. Muchos desarrolladores son mejores escribiendo código que leyéndolo; si quieres entrenar tu habilidad para leer código, no he visto muchos lugares mejores para empezar que la base de código de WebTorrent. En cuanto a lo entretenido de leer, lo pondría a un nivel similar al de redis.
https://github.com/webtorrent/webtorrent
¡Me encanta esta idea! Hace tiempo yo quería aprender Erlang y un amigo quería aprender Crystal, así que nos propusimos crear clientes totalmente personalizados para poder compartir archivos entre nosotros.
Fue muy divertido cuando logramos enviar y recibir archivos con el protocolo básico y algunas extensiones. ¿Es correcto llamar BEP a esas extensiones?
Probablemente sea mi forma favorita de aprender un lenguaje nuevo, porque es lo bastante simple como para entenderlo e implementarlo.
Con los años, cada vez hay menos ideas de proyectos pequeños que me entusiasmen, y esta es una de ellas.
Es la primera vez que oigo hablar de CodeCrafters, pero me gustan las ideas de desafíos académicos como crear una base de datos. También estaría bueno que incluyeran crear un compilador.
https://twitter.com/codecraftersio/status/168850373608654028...
Me recordó a un artículo sobre crear un cliente BitTorrent en Go: https://blog.jse.li/posts/torrent/
Hace unos años, en mi trabajo anterior, creé y mantuve un Linux live OS personalizado que los empleados podían usar en netbooks económicas.
Para distribuir actualizaciones, construí desde cero un servidor torrent interno y lo usamos para distribuir actualizaciones de imagen.
Fue una de mis primeras experiencias creando software conforme a un estándar y haciéndolo funcionar con los clientes básicos, así que fue un muy buen proceso de aprendizaje.