4 puntos por GN⁺ 2023-10-20 | 1 comentarios | Compartir por WhatsApp
  • 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

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

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

    • Es común que los trackers solo por invitación sean bastante estrictos sobre qué clientes torrent se pueden usar o no en sus trackers privados. Me pregunto cómo podrían superar esta barrera para lograr una adopción más amplia.
    • Me da curiosidad cómo aprendiste a crear un cliente BitTorrent. Me gusta la idea de Codecrafters o de libros que te guían para construir algo por tu cuenta, pero siempre me ha costado cuando no puedo encontrar el punto de partida.
    • Justo acabo de empezar un proyecto relacionado con BitTorrent. No creo que vaya a implementar el cliente yo mismo, aunque tal vez sí; como mínimo tengo que implementar la generación de archivos .torrent y magnet links, así que estoy aprendiendo un poco del protocolo.
      Me parece interesante que hayan publicado esto, y quizá me ayude a avanzar.
    • Por la parte que dice “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”, me pregunto si ahora estás contratado por Codecrafters.
    • No sé si esto cuenta como feedback sobre el desafío en sí, pero me dio un poco de pena no poder agregar dependencias en 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

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

  • No entiendo por qué demonios pide acceso a mi cuenta de GitHub sin ninguna explicación.

    • Para ser justos, dice que solo solicita permiso para leer el email, pero yo tampoco seguí más allá de ese paso.
    • Creo que una de las razones es que Codecrafters es un sitio de aprendizaje y, en lugar de alojar directamente el código de los usuarios, lo guarda en GitHub. Este artículo trata sobre uno de los proyectos en Codecrafters.
      Aun así, deberían explicar por qué es necesario.
    • Parece que usan GitHub solo como proveedor de autenticación, sin ofrecer alternativas como registro normal con email. Normalmente estos sitios ofrecen varias opciones.
    • Es necesario para la autenticación. El enlace original va a app.codecrafters.io, y codecrafters.io es la página de marketing :)
    • La estructura es que subes el código del desafío a tu Git, y luego se ejecutan algunas pruebas sobre esa implementación.
  • 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.

    • Sí. La excluimos al principio para reducir el alcance del desafío, porque ya tiene 11 etapas y es bastante largo.
      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.
    • Sí, “Seeding files” es una extensión: https://app.codecrafters.io/vote/challenge-extension-ideas?c...
      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.

    • CodeCrafters también tiene soporte para Crystal. Se puede hacer Build your own Redis.
  • 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.

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