Construa seu próprio BitTorrent
(app.codecrafters.io)- 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
-
Etapas básicas de BitTorrent
- A implementação segue em ordem, da decodificação de bencode ao processamento de arquivos torrent, conexão com peers e download de arquivos
- Decode bencoded strings: Muito 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: Médio
- Piece hashes: Fácil
- Discover peers: Médio
- Peer handshake: Médio
- Download a piece: Difícil
- Download the whole file: Difícil
-
Etapas de Magnet Links
- Começa com o parsing de magnet links e cobre handshake estendido, troca de metadados, download de partes e do arquivo 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
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
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
É interessante ver isso publicado, e talvez ajude no andamento
Cargo.tomlEu 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
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
[0] https://www.twitch.tv/videos/1954769913
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/
https://github.com/codecrafters-io/build-your-own-x
Não entendo por que diabos ele pede permissão de acesso à minha conta do GitHub sem nenhuma explicação
Ainda assim, deveriam explicar por que isso é necessário
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
O recurso de upload está planejado como uma expansão do desafio e é uma das ideias de extensão mais votadas pela comunidade
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
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
https://twitter.com/codecraftersio/status/168850373608654028...
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