4P by GN⁺ | ★ favorite | 댓글 1개
  • CodeCrafters의 BitTorrent 챌린지는 P2P 파일 공유 프로토콜을 직접 구현해 공개적으로 사용 가능한 파일을 다운로드하는 과정을 다룸
  • 학습 흐름은 bencode 디코딩에서 시작해.torrent 파일 파싱, info hash 계산, 피어 발견, 핸드셰이크, 조각 다운로드로 이어짐
  • 기본 BitTorrent 11단계와 Magnet Links 8단계를 합쳐 총 19개 단계로 구성됨
  • 단계 구조와 지침은 무료로 볼 수 있지만, 코드 제출과 솔루션 열람에는 CodeCrafters Membership이 필요함
  • 무료로 먼저 체험하려면 이번 달 무료 챌린지인 Build your own Shell을 선택할 수 있음

BitTorrent 클라이언트 구현 목표

  • Build your own BitTorrent는 BitTorrent를 대량 데이터 배포용 P2P 파일 공유 프로토콜로 보고, 이를 직접 구현하는 CodeCrafters 챌린지임
  • 최종 목표는 BitTorrent 프로토콜로 공개적으로 사용 가능한 파일을 다운로드할 수 있는 BitTorrent 클라이언트를 만드는 것임
  • 과정 중에 BitTorrent 프로토콜과 .torrent 파일의 동작 방식을 함께 학습함

단계 구성과 난이도

이용 조건

  • 이 챌린지는 CodeCrafters Membership이 필요함
    • 전체 챌린지 구조와 단계 지침은 무료로 학습 가능함
    • 코드 제출과 솔루션 열람에는 멤버십이 필요함
  • 무료 챌린지를 원하면 이번 달 무료로 제공되는 Build your own Shell을 시도할 수 있음

댓글과 토론

Hacker News 의견들
  • 안녕하세요! Codecrafters의 Build your own BitTorrent 챌린지를 만든 Sarp입니다
    배경을 조금 이야기하자면, FAANG 직장에서 해고된 뒤 다시 돌아가고 싶은 의욕이 거의 없었고, 코딩 흥미를 되살릴 만한 재미있는 프로그래밍 프로젝트를 찾기 시작했음
    디지털 노마드 생활 중 Nomadlist에서 Codecrafters를 발견했고, 코드를 Git에 푸시해서 단계별 테스트를 통과하는 방식이 마음에 들었음. 게임화된 진행 방식이 집중에 도움이 됐고, SQLite, Git, Redis처럼 쓰던 소프트웨어를 더 깊게 파볼 수 있었음. 챌린지를 하려고 Go도 새로 배웠음
    사이트의 모든 챌린지를 끝내고 할 일이 없어졌을 때, 투표가 많던 아이디어 중 하나인 BitTorrent 클라이언트를 만들기로 했음
    BitTorrent 클라이언트를 만들며 BitTorrent 프로토콜, 토렌트 파일 구조, 인코딩 문제, 네트워크 요청 파이프라이닝, 바이너리 값의 URL 인코딩, Go의 채널 사용 등 많은 것을 배웠음
    챌린지에 대한 피드백을 받고 싶고, 질문도 기꺼이 답하겠음

    • 초대 전용 트래커들은 자기 비공개 트래커에서 어떤 토렌트 클라이언트를 쓸 수 있고 없는지 꽤 엄격하게 정하는 경우가 흔함. 더 넓게 채택되려면 이 장벽을 어떻게 넘을 수 있을지 궁금함
    • BitTorrent 클라이언트 만드는 법을 어떻게 배웠는지 궁금함. Codecrafters나 무언가를 직접 만들게 안내하는 책의 아이디어는 좋아하지만, 시작점을 못 잡으면 늘 힘들었음
    • 마침 BitTorrent 관련 프로젝트를 막 시작했음. 클라이언트를 직접 구현하진 않을 것 같지만, 어쩌면 할 수도 있고, 적어도 .torrent 파일magnet 링크 생성은 구현해야 해서 프로토콜을 조금 배우는 중임
      이런 게 올라와서 흥미롭고, 진행하는 데 도움이 될지도 모르겠음
    • “사이트의 모든 챌린지를 끝내고 할 일이 없어졌을 때, 투표가 많던 아이디어 중 하나인 BitTorrent 클라이언트를 만들기로 했다”는 부분을 보면, 지금은 Codecrafters에 고용된 건지 궁금함
    • 챌린지 자체에 대한 피드백인지는 모르겠지만, Cargo.toml에 의존성을 추가할 수 없어서 조금 아쉬웠음
      bencode 챌린지 일부를 nom으로 풀어보고 싶었는데, 어쩌면 과한 선택이지만 재미로 해보려던 것이었고 지금은 불가능함
      원격 빌더의 부하나 실행 시간이 걱정이라면, 이 문제를 피할 수 있도록 테스트 케이스를 로컬에서 실행할 방법이 있으면 좋겠음
  • Jon Gjengset[1]이 지금 자신의 YT 채널[2]에서 같은 챌린지를 Rust로 라이브 코딩하고 있음
    [1]: https://thesquareplanet.com/
    [2]: https://www.youtube.com/watch?v=jSTkEPPiULs

    • 아, 그게 저입니다!
      더 나은 링크는 https://www.youtube.com/watch?v=jf_ddGnum_4이고, 챕터 표시가 있으며 중간의 정전 부분도 잘라냈음 :p
    • YouTube가 막힌 사람들을 위해 Twitch에도 라이브스트림 사본이 있음
      [0] https://www.twitch.tv/videos/1954769913
    • 그가 코딩하는 걸 보는 건 놀라움. Rust 말고 Python으로 코딩하는 전문가들도 또 있는지 궁금함
  • 왜 로그인이 필요한지 모르겠음. 이게 유료 튜토리얼인가?
    무료 튜토리얼은 여기 있음
    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/

  • 대체 왜 아무 설명 없이 내 GitHub 계정 접근 권한을 요구하는지 모르겠음

    • 공정하게 말하면 이메일 읽기 권한만 요청한다고 되어 있긴 하지만, 나도 그 단계 이후로는 진행하지 않았음
    • 이유 중 하나는 Codecrafters가 학습 사이트이고, 사용자 코드를 직접 호스팅하지 않고 GitHub에 저장하기 때문인 것 같음. 이 글은 Codecrafters에 있는 한 프로젝트에 대한 것임
      그래도 왜 필요한지는 설명해야 함
    • 일반적인 이메일 가입 같은 대안을 제공하지 않고, GitHub를 인증 제공자로만 쓰는 것처럼 보임. 보통 이런 사이트들은 여러 선택지를 제공함
    • 인증에 필요함. 원문 링크는 app.codecrafters.io로 가고, codecrafters.io는 마케팅 페이지임 :)
    • 챌린지 코드를 자기 Git에 올리면, 그 구현에 대해 몇 가지 테스트가 실행되는 구조임
  • 이상하게도 업로드 부분이 빠져 있음. 피어라면 동등한 참여자이므로 데이터가 양방향으로 흘러야 함. 그렇지 않으면 BitTorrent는 작동하지 않을 것임

    • 맞음. 챌린지 범위를 줄이려고 처음에는 제외했음. 이미 11단계라 꽤 길기 때문임
      업로드 기능은 챌린지 확장으로 추가할 계획이고, 커뮤니티에서 투표가 많이 나온 확장 아이디어 중 하나임
    • 맞음, “Seeding files”는 확장 기능임: https://app.codecrafters.io/vote/challenge-extension-ideas?c...
      아직 지원되지는 않지만 곧 제공될 예정이고, 새 확장은 사용자 투표에 따라 추가하고 있음
  • JavaScript를 쓰는 사람이라면 Feross가 만든 WebTorrent가 있고, 이건 프로토콜을 브라우저 탭 안으로 가져왔음
    코드베이스가 읽기 정말 좋음. 많은 개발자는 코드를 읽는 것보다 쓰는 데 더 능숙한데, 코드 읽기 능력을 단련하고 싶다면 WebTorrent 코드베이스만큼 시작하기 좋은 곳을 많이 보지 못했음. 읽는 재미로는 redis와 비슷한 급에 둠
    https://github.com/webtorrent/webtorrent

  • 이 아이디어가 정말 마음에 듦! 예전에 Erlang을 배우고 싶었고 친구는 Crystal을 배우고 싶어 해서, 완전히 커스텀 클라이언트로 서로 파일을 공유할 수 있게 만들어보자고 했음
    기본 프로토콜과 몇 가지 확장으로 파일을 주고받을 수 있게 됐을 때 정말 재미있었음. 그 확장들을 BEP라고 부르는 게 맞나?
    새 언어를 배우는 방식 중 아마 제일 좋아하는 방법임. 이해하고 구현하기에 충분히 단순하기 때문임

    • CodeCrafters에도 Crystal 지원이 있음. Build your own Redis를 할 수 있음
  • 해가 갈수록 설레게 하는 작은 프로젝트 아이디어가 점점 줄어드는데, 이건 그런 아이디어 중 하나임
    CodeCrafters는 처음 들었지만, 데이터베이스 만들기 같은 학술적인 챌린지 아이디어가 마음에 듦. 컴파일러 만들기도 들어가면 좋겠음

  • Go로 BitTorrent 클라이언트를 만들던 글이 떠오름: https://blog.jse.li/posts/torrent/

  • 몇 년 전 이전 직장에서, 직원들이 저렴한 넷북에서 쓸 수 있는 커스텀 Linux 라이브 OS를 만들고 지원했음
    업데이트 배포를 위해 내부용 토렌트 서버를 처음부터 직접 만들었고, 이미지 업데이트 배포에 사용했음
    표준에 맞춰 소프트웨어를 만들고 기본 클라이언트들과 동작하게 한 첫 경험 중 하나라 좋은 학습 과정이었음