Dev log #24 Hardening the p2p stack: From flaky tests to WebSocket fixes
개발 로그 #24: P2P 스택 강화 — 불안정한 테스트부터 WebSocket 수정까지
Rust 기반 minip2p에서 시간에 의존하던 테스트를 상태 변화 기준으로 바꾸고, 프로토콜 프레이밍을 정리했습니다. Python libp2p에서는 WebSocket 오류 보고와 소켓 누수를 수정하고 WSS 인증서 검증을 강화했으며, .NET 구현 관련 PR도 검토했습니다.
- 주제
AI 요약
이번 주에는 P2P 네트워크 라이브러리 세 가지를 손봤습니다. 총 22개 커밋과 15건의 코드 리뷰를 진행했고, PR 5건을 열어 모두 병합했습니다. 주요 작업은 Rust 기반 minip2p의 테스트 안정화와 프로토콜 처리 개선, Python libp2p의 WebSocket 오류 수정, 그리고 .NET libp2p 변경 사항 검토입니다.
시간 대신 진행 상태를 확인하는 테스트
minip2p에서는 CI 실행 환경이 바쁠 때 TCP 테스트가 실패하는 문제가 있었습니다. 기존 테스트는 패킷이 200ms 안에 도착하리라 가정했지만, 실행 환경의 부하에 따라 이 시간이 부족해졌습니다. PR #284에서는 임의의 대기 시간 대신 소켓 버퍼가 실제로 채워지고 비워지는 상태를 확인하도록 테스트를 고쳤습니다. 릴레이 예약 테스트와 타이머에 의존하는 테스트는 nextest에서 격리해 서로 자원을 두고 경쟁하지 않게 했습니다.
PR #260에서는 프레임 단위 교환 처리를 정리했습니다. AutoNAT와 Identify 프로토콜이 공통 프레이밍 로직을 사용하며, 상대가 선언한 길이 안에서만 데이터를 처리하도록 제한했습니다. 핸드셰이크 중 상대 피어가 끝없이 데이터를 보내는 상황을 막기 위한 방어적 네트워크 처리입니다.
Python libp2p의 WebSocket 오류와 인증서 검증
Python 구현에서는 WebSocket 연결이 시작된 뒤 발생한 여러 오류가 모두 ‘핸드셰이크 시간 초과’로 보고됐습니다. 실제 다이얼 실패 원인을 가려 디버깅을 어렵게 했고, 실패 과정에서 TCP 소켓도 닫히지 않았습니다. PR #1556은 실제 실패 내용을 보고하고 소켓을 닫도록 수정해 파일 디스크립터가 누적되는 문제를 막았습니다.
이어진 PR #1555에서는 wss:// 연결에서 서버 인증서를 검증하도록 했습니다. 글에서는 P2P 환경에서도 보안 검증을 생략하지 않아야 한다고 설명합니다.
인덱서와 .NET 구현 검토
Rust 프로젝트 Trak에서는 인덱서가 테스트 픽스처 안의 선언까지 실제 코드로 읽는 문제를 수정했습니다. PR #1은 소스 코드에서 선언을 읽고 테스트 픽스처 디렉터리는 제외하도록 범위를 좁혔습니다. 변경 규모는 추가 532줄, 삭제 12줄입니다.
.NET libp2p 저장소에서는 15건의 PR을 검토했습니다. Windows QUIC 전송 지원, 대용량 gossip 메시지에서 대역폭을 아끼기 위한 IDONTWANT 처리, 부분 메시지 대응 등을 살폈습니다. TLS용 임시 키를 P-256으로 바꾸는 변경과 애플리케이션 훅에 전달하기 전 gossip 서명을 검증하는 변경도 승인했습니다. Yamux 응답 보존과 분할 쓰기 처리 개선도 검토 대상이었습니다.
이번 주 변경량은 추가 2,503줄, 삭제 357줄입니다. 작성자는 다음 주 minip2p 전송 계층에 집중하고, 안정화한 테스트를 바탕으로 성능 벤치마크를 진행할 계획입니다.
원문: dev.to / 번역·요약: Trawling