1 pontos por GN⁺ 2025-06-15 | 1 comentários | Compartilhar no WhatsApp
  • Go-Torrent é uma implementação de cliente BitTorrent feita em Go, que implementa as funcionalidades centrais para baixar arquivos usando o protocolo BitTorrent
  • O escopo da implementação inclui parsing de arquivos .torrent, descoberta de peers, comunicação entre peers e download de arquivos, lidando tanto com torrents de arquivo único quanto com torrents multifile
  • O Bencode oferece suporte aos tipos string, inteiro, lista e dicionário, e inclui tratamento de erros e validação
  • A funcionalidade de download fornece gerenciamento de pieces e blocos, downloads simultâneos, rastreamento de progresso e gerenciamento de armazenamento em nível de bloco
  • O projeto ainda está em desenvolvimento ativo, com suporte futuro planejado para Magnet link, metadata exchange protocol e DHT

Funcionalidades implementadas pelo Go-Torrent

  • Go-Torrent é uma implementação de cliente BitTorrent escrita em Go
  • Implementa as funcionalidades centrais para permitir o download de arquivos usando o protocolo BitTorrent
  • O principal escopo da implementação é o seguinte
    • parsing de arquivos torrent
    • descoberta de peers
    • download de arquivos

Bencode e processamento de arquivos torrent

  • Codificação/decodificação Bencode oferece suporte a todos os tipos de Bencode
    • string
    • inteiro
    • lista
    • dicionário
  • Inclui tratamento de erros e validação
  • O processamento de arquivos torrent oferece suporte ao parsing de arquivos .torrent
    • torrents de arquivo único
    • torrents multifile
  • Oferece suporte ao cálculo do info hash e à extração do piece hash
  • Oferece suporte aos campos padrão de arquivos torrent

Descoberta e comunicação com peers

  • Oferece suporte à descoberta de peers por meio de HTTP tracker
  • Implementa o protocolo de handshake entre peers
  • Inclui o protocolo completo de mensagens do BitTorrent
  • Fornece gerenciamento de conexões entre peers

Download e gerenciamento de armazenamento

  • A funcionalidade de download inclui gerenciamento de pieces e blocos
  • É possível executar vários downloads simultaneamente
  • Rastreia o progresso do download
  • Oferece suporte à montagem de arquivos tanto para torrents de arquivo único quanto para torrents multifile
  • O gerenciamento de armazenamento funciona com granularidade em nível de bloco

Estrutura, requisitos e estado de desenvolvimento

  • A estrutura do projeto é dividida nos seguintes pacotes
    • cmd/: interface de linha de comando e aplicação principal
    • internal/bencode/: codificação/decodificação Bencode
    • internal/torrent/: processamento de arquivos torrent
    • internal/tracker/: implementação do protocolo de tracker
    • internal/peer/: comunicação entre peers
    • internal/download/: gerenciamento de download
    • pkg/: pacotes públicos
  • O requisito é Go 1.21 ou superior
  • A instalação é feita clonando o repositório e executando go mod download
  • A documentação de uso será adicionada quando o projeto estiver mais maduro
  • O estado atual da implementação pode ser consultado em checkpoint.md
  • Os recursos planejados são os seguintes
    • suporte a Magnet link
    • Metadata exchange protocol
    • suporte a DHT(Distributed Hash Table)
  • Os materiais de referência são BitTorrent Protocol Specification e Bencode Specification

1 comentários

 
GN⁺ 2025-06-15
Comentários do Hacker News
  • Excelente. Mas, como a entrada não é confiável, seria bom limitar o tamanho das alocações dinâmicas no decodificador bencode
    Uma entrada maliciosa em um arquivo torrent ou em uma resposta announce pode exigir uma alocação enorme durante o parsing de strings e levar o cliente a uma negação de serviço. Um torrent bem-formado não pode conter uma string maior que o tamanho restante da entrada, então usar o tamanho restante da entrada como limite superior parece adequado

  • Gosto porque parece limpo e simples. Seria bom colocar no README uma linha de exemplo de uso que realmente baixe um arquivo .torrent
    Ex.: ./go-torrent My-Linux-Distro-Wink-ISO.torrent
    Além disso, incluir torrent.ParseFromUrl seria ainda melhor; esse tipo de projeto vale a pena todo mundo fazer uma vez como exercício próprio

  • Legal. No codecrafters há um desafio que orienta um pouco esse processo e também fornece testes. Brinquei um pouco durante o mês grátis e foi divertido
    https://app.codecrafters.io/courses/bittorrent/overview

  • Legal. Eu também já pensei em algo assim. Fico curioso para saber quão difícil foi e em que medida dá para dizer que está “completo”. Também queria saber se ele lida com DHT, Magnet e todo tipo de recurso de travessia de NAT
    O ponto em que sempre travo é não saber qual é a lista de recursos necessários para criar um cliente que simplesmente funcione com a maioria dos torrents que circulam por aí. Parece haver dezenas de protocolos relacionados a torrents, e nem sei direito o que cada um faz, quanto mais a lista completa

    • Com certeza foi difícil. Levei quase um mês para entender como o protocolo e o bencoding funcionam, construir um modelo mental e então escrever o código de fato
      Magnet e DHT ainda não foram adicionados

    • A dificuldade depende muito da experiência, da familiaridade com a linguagem de programação usada e da disposição para experimentar. Como referência, eu também comecei na semana passada a criar um cliente Bittorrent em Go e, em uma semana, cheguei a cerca de 80% do projeto publicado
      Mas tenho bastante experiência com Go, um bom conhecimento de protocolos e redes, e experimentar já virou quase uma segunda natureza para mim

      Se tiver interesse, a especificação principal do Bittorrent é, na verdade, bem curta; dá para ler e entender com facilidade em cerca de uma hora: https://www.bittorrent.org/beps/bep_0003.html

      Em torno do Bittorrent há muitas coisas como extensões de protocolo, mas, pelo que vi até agora, o nível de suporte varia de cliente para cliente. Por exemplo, Protocol Encryption é praticamente uma forma de ofuscação: primeiro tenta-se comunicar desse jeito e, se não funcionar, dependendo da configuração, volta-se ao protocolo normal

      Para baixar uma distribuição Linux, por exemplo Debian, a partir de um arquivo .torrent de um site, o caminho é relativamente direto. É um único arquivo, há um tracker, muitos peers usam o protocolo normal e, se você estiver atrás de NAT, ainda é possível em certa medida mesmo sem aceitar conexões de entrada

      Quando você naturalmente entra em conteúdos de zona cinzenta, pode querer parsear links Magnet, encontrar peers via DHT e também implementar UPnP para tentar mapear portas automaticamente no modem. Ainda assim, isso também pode ser construído aos poucos, de forma iterativa. Quanto mais recursos, maior a chance de encontrar mais peers e trocar dados com sucesso

  • Não sou desenvolvedor Go, então pergunto: por que usar o Go 1.21, que é antigo? Há algum motivo para ficar em uma versão antiga?
    Edit: parece que o suporte foi encerrado há 10 meses

  • Muito legal. Me lembra a época da faculdade. Fiz isso como projeto final da disciplina de redes da Georgia Tech
    Perdi o código há muito tempo, mas as lições que aprendi naquela época ficaram. Projetos assim também são uma boa forma de aprender uma linguagem nova

  • É o tipo de projeto bom para tentar. Fiz algo parecido, e ver encoders/decoders bencode feitos por outras pessoas me deixou humilde
    Também é uma boa forma de explorar recursos da linguagem. Claro que tentar alcançar todos os recursos de uma biblioteca grande é uma tarefa bastante inútil, e acho que a compatibilidade entre clientes já é insuficiente

  • Fico curioso para saber se há planos de publicar uma documentação sobre o processo de implementação. Pessoalmente, isso me interessa mais do que o código em si
    Porque não há muito material que aprofunde a abordagem ou o processo de implementar os vários aspectos do protocolo

  • Fico curioso para saber se também fizeram v2 e mutable torrents. Por favor, que alguém implemente mutable torrents

  • Tem suporte a links Magnet?
    Edit: ah, era um recurso planejado

    • Ainda não. Pretendo adicionar em breve