4 pontos por GN⁺ 2023-10-20 | 1 comentários | Compartilhar no WhatsApp
  • O desafio de BitTorrent da CodeCrafters aborda a implementação direta de um protocolo de compartilhamento de arquivos P2P para baixar arquivos disponíveis publicamente
  • O fluxo de aprendizado começa com a decodificação de bencode e segue por parsing de arquivos .torrent, cálculo de info hash, descoberta de peers, handshake e download de partes
  • Ele é composto por um total de 19 etapas, somando as 11 etapas básicas de BitTorrent e as 8 etapas de Magnet Links
  • A estrutura das etapas e as instruções podem ser vistas gratuitamente, mas o envio de código e a visualização das soluções exigem a CodeCrafters Membership
  • Para experimentar gratuitamente primeiro, é possível escolher o desafio gratuito deste mês, Build your own Shell

Objetivo da implementação do cliente BitTorrent

  • Build your own BitTorrent é um desafio da CodeCrafters que trata o BitTorrent como um protocolo de compartilhamento de arquivos P2P para distribuição de grandes volumes de dados e propõe implementá-lo na prática
  • O objetivo final é criar um cliente BitTorrent capaz de baixar arquivos disponíveis publicamente usando o protocolo BitTorrent
  • Durante o processo, você também aprende como funcionam o protocolo BitTorrent e os arquivos .torrent

Estrutura das etapas e nível de dificuldade

Condições de uso

  • Este desafio exige a CodeCrafters Membership
    • Toda a estrutura do desafio e as instruções das etapas podem ser estudadas gratuitamente
    • O envio de código e a visualização das soluções exigem membership
  • Se quiser um desafio gratuito, você pode experimentar Build your own Shell, oferecido gratuitamente neste mês

1 comentários

 
GN⁺ 2023-10-20
Opiniões no Hacker News
  • Olá! Sou Sarp, criador do desafio Build your own BitTorrent, da Codecrafters
    Contando um pouco do contexto: depois de ser demitido do meu emprego em uma FAANG, eu tinha pouquíssima vontade de voltar para lá e comecei a procurar projetos de programação divertidos que reacendessem meu interesse por codar
    Enquanto vivia como nômade digital, descobri a Codecrafters no Nomadlist e gostei do formato de enviar o código para o Git para passar em testes passo a passo. A progressão gamificada ajudava na concentração, e eu pude me aprofundar em softwares que já usava, como SQLite, Git e Redis. Também aprendi Go do zero para fazer os desafios
    Quando terminei todos os desafios do site e fiquei sem ter o que fazer, decidi criar uma das ideias mais votadas: um cliente BitTorrent
    Ao criar um cliente BitTorrent, aprendi muita coisa: o protocolo BitTorrent, a estrutura de arquivos torrent, problemas de encoding, pipelining de requisições de rede, URL encoding de valores binários, uso de channels em Go etc.
    Gostaria de receber feedback sobre o desafio e terei prazer em responder a perguntas

    • Trackers somente por convite costumam ser bem rígidos sobre quais clientes torrent podem ou não ser usados em seus trackers privados. Fico curioso sobre como seria possível superar essa barreira para uma adoção mais ampla
    • Fico curioso sobre como você aprendeu a criar um cliente BitTorrent. Gosto da ideia da Codecrafters ou de livros que guiam a pessoa a construir algo por conta própria, mas sempre tive dificuldade quando não consigo encontrar um ponto de partida
    • Por coincidência, acabei de começar um projeto relacionado a BitTorrent. Acho que não vou implementar um cliente do zero, mas talvez acabe fazendo isso; no mínimo, preciso implementar a criação de arquivos .torrent e links magnet, então estou aprendendo um pouco do protocolo
      É interessante ver isso publicado, e talvez ajude no andamento
    • Ao ver a parte “quando terminei todos os desafios do site e fiquei sem ter o que fazer, decidi criar uma das ideias mais votadas: um cliente BitTorrent”, fico me perguntando se agora você está empregado na Codecrafters
    • Não sei se isso é feedback sobre o desafio em si, mas fiquei um pouco decepcionado por não poder adicionar dependências ao Cargo.toml
      Eu queria tentar resolver parte do desafio de bencode com nom; talvez fosse uma escolha exagerada, mas era algo que eu queria fazer por diversão, e agora não é possível
      Se a preocupação for a carga do builder remoto ou o tempo de execução, seria bom ter uma forma de rodar os casos de teste localmente para evitar esse problema
  • Jon Gjengset[1] está fazendo live coding em Rust do mesmo desafio agora no canal dele no YT[2]
    [1]: https://thesquareplanet.com/
    [2]: https://www.youtube.com/watch?v=jSTkEPPiULs

    • Ah, esse sou eu!
      Um link melhor é https://www.youtube.com/watch?v=jf_ddGnum_4, que tem marcações de capítulos e também removeu o trecho da queda de energia no meio :p
    • Para quem está com o YouTube bloqueado, também há uma cópia da livestream no Twitch
      [0] https://www.twitch.tv/videos/1954769913
    • É incrível vê-lo programar. Fico curioso se há também especialistas programando em Python em vez de Rust
  • Não entendo por que é preciso fazer login. Isso é um tutorial pago?
    Há tutoriais gratuitos aqui
    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/

  • Não entendo por que diabos ele pede permissão de acesso à minha conta do GitHub sem nenhuma explicação

    • Para ser justo, diz que só pede permissão para ler o e-mail, mas eu também não avancei depois dessa etapa
    • Acho que um dos motivos é que a Codecrafters é um site de aprendizado e, em vez de hospedar diretamente o código dos usuários, ele o armazena no GitHub. Este post é sobre um projeto dentro da Codecrafters
      Ainda assim, deveriam explicar por que isso é necessário
    • Parece que eles usam o GitHub apenas como provedor de autenticação, sem oferecer uma alternativa como cadastro comum por e-mail. Normalmente esses sites oferecem várias opções
    • É necessário para autenticação. O link original vai para app.codecrafters.io, e codecrafters.io é a página de marketing :)
    • A estrutura é: você sobe o código do desafio no seu Git, e alguns testes são executados sobre essa implementação
  • Curiosamente, a parte de upload ficou de fora. Se é um peer, é um participante em pé de igualdade, então os dados deveriam fluir nos dois sentidos. Caso contrário, o BitTorrent não funcionaria

    • Sim. Foi deixado de fora inicialmente para reduzir o escopo do desafio, já que ele já é bem longo, com 11 etapas
      O recurso de upload está planejado como uma expansão do desafio e é uma das ideias de extensão mais votadas pela comunidade
    • Sim, “Seeding files” é um recurso de extensão: https://app.codecrafters.io/vote/challenge-extension-ideas?c...
      Ainda não é suportado, mas deve ser disponibilizado em breve, e novas extensões estão sendo adicionadas de acordo com a votação dos usuários
  • Para quem usa JavaScript, existe o WebTorrent, criado por Feross, que levou o protocolo para dentro de uma aba do navegador
    A base de código é realmente muito boa de ler. Muitos desenvolvedores são melhores em escrever código do que em lê-lo; se você quer treinar a habilidade de leitura de código, não vi muitos lugares melhores para começar do que a base de código do WebTorrent. Em termos de prazer de leitura, eu a colocaria no mesmo nível do redis
    https://github.com/webtorrent/webtorrent

  • Gostei muito dessa ideia! Antigamente eu queria aprender Erlang e um amigo queria aprender Crystal, então decidimos tentar criar clientes totalmente customizados para compartilhar arquivos entre nós
    Foi muito divertido quando conseguimos enviar e receber arquivos com o protocolo básico e algumas extensões. É correto chamar essas extensões de BEP?
    Provavelmente é uma das minhas formas favoritas de aprender uma nova linguagem, porque é simples o suficiente para entender e implementar

    • O CodeCrafters também tem suporte a Crystal. Dá para fazer o Build your own Redis
  • Com o passar dos anos, há cada vez menos ideias de pequenos projetos que me empolgam, e esta é uma delas
    Nunca tinha ouvido falar do CodeCrafters, mas gostei das ideias de desafios acadêmicos, como criar um banco de dados. Seria legal se também incluíssem criar um compilador

  • Isso me lembrou um texto sobre criar um cliente BitTorrent em Go: https://blog.jse.li/posts/torrent/

  • Alguns anos atrás, no meu emprego anterior, criamos e mantivemos um Linux live OS customizado que os funcionários podiam usar em netbooks baratos
    Para distribuir atualizações, criamos do zero um servidor de torrent interno e o usamos para distribuir atualizações de imagem
    Foi uma das minhas primeiras experiências criando software de acordo com um padrão e fazendo-o funcionar com clientes básicos, então foi um bom processo de aprendizado