GN⁺: 배시(Bash)를 이용해 처음부터 만든 마인크래프트 서버 (2022)
(sdomi.pl)Bash로 작성한 마인크래프트 서버에 대한 생각
- Bash로 마인크래프트 서버를 작성하는 것에 대한 고찰.
- 이전에 2009년 클래식 프로토콜로 시도했으나 Bash에서 이진 데이터 파싱에 한계를 느낌.
-
read
와xxd
를 사용하여 데이터를 읽고 16진수 덤프를 출력하는 방법을 고안함. - Bash는 널바이트를 무시하고 감지할 방법이 없어 데이터가 손상될 수 있음.
Bash에서 널바이트 읽기
-
dd
와xxd
를 사용하여 널바이트를 포함한 이진 데이터를 처리하는 방법을 발견함. - 이 방법을 통해 패턴 매칭, 데이터 추출 등을 수행할 수 있음.
-
ncat
을 사용하여 마인크래프트 기본 TCP 포트에서 수신 대기하고 연결이 들어오면 메인 쉘 스크립트(mc.sh
)를 실행함.
프로토콜은 사실 그리 좋지 않음
- 마인크래프트 서버가 기능하기 위해 구현해야 할 첫 번째 것은 서버 목록 핑 패킷임.
- VarInts와 VarLongs 같은 데이터 타입 구현에 대한 어려움을 설명함.
- LEB128 인코딩 방식을 사용하여 VarInt/VarLong 숫자를 구현함.
- IEEE754 부동 소수점 숫자 구현에 어려움을 겪었으며,
awk
를 사용하여 해결함.
"Position" 데이터 타입
- Mojang이 만든 Position 데이터 타입은 64비트 Long 값에 X, Y, Z 좌표를 저장함.
- 이 데이터 타입은 Bash에서 쉽게 구현 가능함.
Named Binary Tag
- NBT는 Mojang이 만든 이진 데이터를 위한 JSON과 같은 형식임.
- NBT 파서 구현을 거의 완성했으나, 프로젝트 디렉토리를 tmpfs로 사용하고 시스템 충돌로 인해 코드가 손실됨.
실제 서버 작성
- 수학적인 부분을 넘어 실제 서버를 만드는 재미있는 부분에 도달함.
- 클라이언트가 서버에 참여하기 위해 핸드셰이크 과정을 완료하고 몇 가지 패킷을 보내야 함.
- Join Game 패킷과 Chunk 패킷 내의 데이터 구조가 가장 큰 장애물임.
"플러그인" 시스템
- 단순한 청크를 넘어 서버가 더 많은 것을 할 수 있도록 하기 위해 오버라이드 가능한 함수인
후크
와 서버가 사용자 코드를 로드할 수 있는 옵션을 만듦. - 이를 통해 세계의 모습을 변경하는 것부터 마우스를 움직일 때 플레이어가 틱 소리를 내는 것까지 다양한 기능을 구현할 수 있음.
Witchcraft의 특이점들
- Bash는 소수점 숫자를 다루는 데 제한이 있음.
- 멀티플레이어는 완전히 작동하지 않음.
- Witchcraft는 멀티스레드 서버이지만 스레드 간 통신을 위해 해킹을 사용함.
- 데이터 교환 속도가 느림.
- 최신 BusyBox(1.35.0)가 설치된 경우에만 실행됨.
FAQ
- 블록 ID는 어디서 오는가, "WitchCraft"라는 이름의 유래 등에 대한 질문과 답변.
리소스
- Witchcraft 저장소, wiki.vg 프로토콜 문서 등의 리소스 링크 제공.
GN⁺의 의견
- 이 프로젝트는 Bash의 한계를 극복하고자 하는 개발자의 창의성과 문제 해결 능력을 보여줌.
- Bash로 마인크래프트 서버를 구현하는 것은 매우 비효율적일 수 있으나, 이러한 실험적 접근은 새로운 해결책을 찾는 데 도움이 될 수 있음.
- 이 기술을 실제 게임 서버에 적용하는 것은 권장되지 않지만, 스크립팅 언어의 한계를 이해하고 이를 극복하는 방법을 배우는 데 유용할 수 있음.
- 비슷한 기능을 제공하는 더 효율적인 서버 구현체로는 Java나 C++로 작성된 마인크래프트 서버가 있음.
- 이 프로젝트는 Bash를 사용하여 복잡한 네트워크 프로토콜을 다루는 방법을 이해하는 데 유용한 교육 자료가 될 수 있음.
Hacker News 의견
-
스크립트 가능한 마인크래프트 서버에 대한 경험
자바와 베드락(ScraM)을 위한 스크립트 가능한 마인크래프트 서버 작업 경험이 많은 한 사용자는 이를 인상적이라 평가함. "duckduckgoing"이라는 단어를 문장에 사용한 것에 대해 별점을 주고 싶어함. 해당 토론은 92개의 댓글이 있음.
-
음의 지수에 대한 이해
음의 지수, 즉 2^(-n)이 1/(2^n)과 같다는 것을 언급하며, 저자가 자신의 2^-1 = 0.5 예시를 기억하지 못하고 awk에 도움을 요청한 것에 대해 놀라움을 표함. ctypes.sh 라이브러리를 사용했다면 bash에서 libm, poll(), select() 등에 접근할 수 있었을 것이라고 제안함.
-
진정한 해커 사이트에 대한 칭찬
이것이 진정한 해커 사이트라며, 매우 훌륭하다고 칭찬함.
-
bash에 대한 애정
bash를 좋아하며, vim과 lua만큼이나 좋아함을 밝힘. 2MB 미만의 단일 바이너리로, 많은 사람들이 생각하는 것보다 훨씬 더 유능함을 강조함. shellcheck과 좋은 습관을 사용하면 bash도 읽기 쉽고 안전할 수 있음을 언급함. 추가적인 기능이 필요할 경우, FFI 등 복잡한 방법을 사용하지 않고도 C/C++을 사용해 유틸리티를 추가할 수 있으며, pip/npm 등을 사용해 불명확한 수많은 의존성을 불러오지 않아도 됨을 설명함.
-
bash 프로그래밍에 대한 놀라움
bash 프로그래밍에 능숙하지 않지만, 실제로 얼마나 유능한지에 대해 놀라움을 표현함.
-
커스텀 서버 작성에 대한 궁금증
상업적 게임을 위한 커스텀 서버 작성이 여전히 유행하는지 궁금해함.
-
마인크래프트에 대한 찬사
마인크래프트를 퀘이크 이후 가장 위대한 게임 중 하나로 평가함.
-
마인크래프트 구현에 대한 감탄
마인크래프트가 구현된 방식에 대해 많은 기사를 읽었지만, 이것은 정말 놀라운 것이라며, 아마도 읽은 것 중 가장 훌륭한 기술 설명 중 하나라고 감탄함. 최고 수준이라고 칭찬함.