1 poin oleh GN⁺ 2025-06-15 | 1 komentar | Bagikan ke WhatsApp
  • Proyek open source ini adalah klien BitTorrent yang diimplementasikan dengan bahasa Go, dengan logika dasar pengunduhan file yang dibangun sendiri
  • Menangani encoding/decoding Bencode secara langsung dan mencakup fitur validasi error yang kuat
  • Mendukung secara komprehensif fitur inti seperti parsing file .torrent, perhitungan info hash, dan komunikasi antar-peer
  • Mencakup fitur yang meningkatkan kegunaan nyata seperti pengunduhan paralel, perakitan file, dan manajemen penyimpanan per blok
  • Dibandingkan open source BitTorrent yang sudah ada, proyek ini unggul dalam kesederhanaan bahasa Go, kejelasan struktur kode, dan modularisasi

Ikhtisar

Proyek ini mengimplementasikan klien BitTorrent secara langsung dengan bahasa Go
Menyediakan kemampuan mengunduh file menggunakan protokol BitTorrent dalam bentuk pengembangan mandiri
Secara utama, proyek ini menangani parsing file torrent, penemuan peer, dan pengunduhan file

Fitur utama

  • Encoding/decoding Bencode

    • Mendukung semua tipe Bencode seperti string, integer, list, dan dictionary
    • Menerapkan penanganan error yang kuat serta validasi data
  • Pemrosesan file torrent

    • Dapat mem-parsing torrent file tunggal maupun multi-file
    • Mendukung semua field standar, termasuk ekstraksi info hash dan hash tiap piece
  • Penemuan dan komunikasi peer

    • Mendukung tracker HTTP
    • Mengimplementasikan protokol handshake antar-peer
    • Menjalankan protokol pesan BitTorrent dan manajemen koneksi peer
  • Fitur pengunduhan

    • Manajemen berbasis piece dan blok
    • Pemrosesan pengunduhan paralel
    • Pelacakan progres unduhan dan perakitan file
    • Menyediakan efisiensi melalui manajemen penyimpanan per blok

Struktur proyek

  • cmd/ : antarmuka baris perintah dan file eksekusi
  • internal/
    • bencode/ : fungsi encoding dan decoding Bencode
    • torrent/ : parsing dan pemrosesan file torrent
    • tracker/ : implementasi protokol tracker
    • peer/ : fungsi komunikasi antar-peer
    • download/ : fungsi manajemen unduhan
  • pkg/ : kumpulan package yang dapat diekspos ke luar

Persyaratan

  • Memerlukan Go 1.21 atau lebih baru

Cara penggunaan

  • Saat ini proyek masih dalam tahap awal pengembangan, panduan penggunaan akan ditambahkan kemudian

Status dan rencana pengembangan

  • Pengembangan saat ini berlangsung aktif
  • Tahap pengembangan yang lebih rinci dicatat dalam file checkpoint.md
  • Rencana ke depan:
    • Dukungan Magnet link
    • Protokol pertukaran metadata
    • Dukungan DHT (Distributed Hash Table)

Dokumen referensi

  • Spesifikasi protokol BitTorrent
  • Spesifikasi Bencode

Pentingnya proyek dan keunggulan

  • Proyek ini memanfaatkan sintaks sederhana dan konkurensi khas bahasa Go untuk mengimplementasikan elemen kompleks klien BitTorrent dengan modularisasi yang jelas
  • Strukturnya jelas sehingga unggul dalam skalabilitas dan kemudahan pemeliharaan, memberi manfaat baik untuk pembelajaran maupun penerapan nyata
  • Meskipun masih berada pada tahap yang relatif awal, proyek ini telah dengan cepat mewujudkan fitur inti protokol BitTorrent

1 komentar

 
GN⁺ 2025-06-15
Komentar Hacker News
  • Ada saran agar ukuran alokasi memori dinamis di decoder bencode dibatasi. Karena nilai input yang masuk dari file torrent atau announce tidak bisa dipercaya, input berbahaya bisa meminta alokasi yang sangat besar dan memicu penolakan layanan (DoS). Untuk parsing string, batas atas yang tepat bisa ditetapkan ke panjang input yang tersisa, karena torrent yang valid tidak mungkin memiliki string yang lebih panjang daripada sisa panjang file

    • Masukan ini sudah ditambahkan ke daftar tugas
  • Proyeknya terlihat rapi dan simpel, jadi enak dilihat. Akan bagus kalau ada contoh penggunaan satu baris di README. Misalnya menambahkan kalimat yang menunjukkan cara pakai seperti ./go-torrent My-Linux-Distro-Wink-ISO.torrent. Akan lebih mantap lagi kalau fitur torrent.ParseFromUrl juga ditambahkan. Pengalaman seperti ini layak dicoba semua orang sebagai “perjalanan spiritual” masing-masing

    • Terima kasih atas sarannya
  • Memperkenalkan challenge serupa yang disediakan codecrafters. Dalam proses ini mereka membantu alur pengerjaan dan pengujian, dan saya pernah mencobanya gratis selama sebulan, cukup menyenangkan
    https://app.codecrafters.io/courses/bittorrent/overview

  • Dari sudut pandang orang yang bukan developer Go, saya penasaran kenapa menggunakan versi lama Go 1.21. Apakah ada alasan khusus untuk tetap memakai versi lawas? Setelah dicek, dukungannya ternyata sudah dihentikan 10 bulan lalu

  • Proyek yang benar-benar keren. Waktu kuliah saya pernah mengerjakan ini sebagai tugas akhir di kelas jaringan Georgia Tech. Kodenya memang sudah hilang, tapi pelajarannya membekas seumur hidup. Proyek seperti ini memang cara yang sangat bagus untuk mempelajari bahasa baru

  • Ada yang bertanya apakah magnet link didukung.
    Edit: ternyata itu fitur yang akan ditambahkan nanti

    • Belum didukung, tapi akan segera ditambahkan
  • Saya penasaran bagaimana ini dibuat. Apakah melihat spesifikasi protokol secara langsung, atau mengacu ke implementasi lain? Saya selalu penasaran bagaimana orang mengimplementasikan hal seperti ini dari nol

    • Menariknya, saya baru-baru ini juga mulai membuat klien Bittorrent sendiri dengan Go. Secara pribadi saya tidak suka memakai AI/LLM untuk coding, karena tujuannya memang ingin benar-benar belajar sendiri. Hal pertama yang saya lakukan adalah mencari spesifikasi resmi protokol Bittorrent. Sebenarnya spesifikasinya lebih sederhana dari yang dibayangkan, tapi agak minim
      https://www.bittorrent.org/beps/bep_0003.html
      Ekstensi tambahannya ada di
      https://www.bittorrent.org/beps/bep_0000.html
      Penting untuk memecah pekerjaan menjadi unit yang sangat kecil dan memeriksa hasilnya sendiri satu per satu. Misalnya saya mulai dari parsing file .torrent, yang berarti harus mengimplementasikan bencoding sendiri. Setelah mengunduh .torrent untuk Arch Linux, ternyata formatnya tidak valid dan muncul key tak terduga seperti url-list. Setelah saya telusuri, ternyata itu terkait bep_0019. Pada akhirnya saya berhasil mem-parsing file .torrent Debian Linux
      Setelah itu saya juga mengimplementasikan request HTTP announce tracker dan protokol peer. Protokol peer cukup sulit, dan pendekatan eksperimental sangat membantu. Saya menghapus announce URL dari torrent Debian agar benar-benar tidak ada peers, lalu menambahkan klien saya sendiri secara manual ke KTorrent untuk mengamati pesan yang dipertukarkan, kemudian menyesuaikan kode saya berdasarkan hasil itu. Ada sangat banyak trial and error serta proses debugging
      Beberapa detail protokol memang sulit ditemukan di dokumen resmi, jadi sesekali saya bertanya ke ChatGPT, dan implementasi antar-klien juga sedikit berbeda sehingga algoritme detailnya tidak terlalu jelas. Misalnya blok mana yang harus diambil, peer mana yang dipilih untuk koneksi, dan bagaimana choke/unchoke bekerja, semua itu tidak terdokumentasi rapi. Pencarian web sangat membantu
      Selain itu, situs https://wiki.theory.org/Main_Page juga punya informasi yang berguna
      Saat ini sudah sampai tahap bisa melakukan download/upload penuh dengan KTorrent. Berikutnya yang masih perlu dibuat adalah algoritme untuk mendapatkan peer dari tracker, memilih blok yang akan diunduh, dan menyimpannya ke file
      Kalau ingin tahu proses yang lebih detail, silakan tanya kapan saja
  • Bertanya seberapa sulit menambahkan GUI. Jarang melihat contoh implementasi GUI di Go

  • Saya tertarik dengan proyek seperti ini dan sempat berpikir untuk mencobanya. Saya penasaran seberapa sulit, seberapa matang hasilnya, dan apakah fitur kompleks seperti DHT, Magnet, NAT traversal sudah diimplementasikan. Saya bahkan tidak terlalu tahu daftar fitur minimum yang wajib ada untuk bisa mencakup hampir semua torrent yang beredar. Protokol terkait torrent juga sangat banyak, jadi saya bahkan tidak tahu daftar lengkapnya maupun fungsi masing-masing protokol

    • Tingkat kesulitannya sangat bergantung pada pengalaman, penguasaan bahasa, dan sikap eksperimental. Sebagai contoh, saya sendiri baru mulai membuat klien Bittorrent dengan Go minggu lalu, dan dalam seminggu sudah mencapai sekitar 80% dari proyek yang dibagikan di sini. Karena saya sudah cukup paham Go, protokol, dan jaringan, serta terbiasa bereksperimen, progresnya jadi cepat
      Spesifikasi resmi Bittorrent sendiri sangat singkat, jadi bisa dibaca dan dipahami dalam sekitar satu jam https://www.bittorrent.org/beps/bep_0003.html
      Tetapi di sekelilingnya ada sangat banyak protokol ekstensi, dan dukungan tiap klien pun berbeda-beda. Misalnya, banyak yang pertama-tama mencoba enkripsi protokol, yang sebenarnya lebih mirip obfuscation, lalu kalau gagal baru memakai protokol biasa
      Kalau tujuan Anda hanya mengunduh dari file .torrent resmi seperti distro Linux, tingkat kesulitannya jelas lebih rendah. Biasanya hanya satu file, ada tracker, dan kebanyakan peer memakai protokol standar, jadi bahkan di lingkungan NAT pun tetap bisa bekerja tanpa harus membuka port internal
      Tentu saja, kalau ingin menangani torrent umum, terutama yang lebih “abu-abu”, Anda perlu menambahkan parsing magnet link, DHT untuk penemuan peer, dan UPnP untuk pemetaan port otomatis. Namun semua itu tetap bisa diimplementasikan bertahap per fitur. Makin banyak fitur, makin banyak peer yang bisa ditemukan dan ditukar datanya dengan sukses

    • Cukup menantang, dan saya butuh hampir sebulan untuk memahami protokol dan cara kerja bencoding, membentuk gambaran arsitektur keseluruhan di kepala, lalu menulis kodenya. Magnet dan DHT masih belum didukung

  • Ada yang bertanya apakah v2 dan mutable torrents sudah diimplementasikan. Mereka juga menyampaikan harapan agar mutable torrents benar-benar didukung