목적 및 범위
이 페이지는 StableNet의 P2P 네트워킹 레이어에서 사용되는 피어 발견 메커니즘을 설명합니다.피어 발견은 노드가 네트워크 내의 다른 노드를 식별하고 연결 후보로 확보하는 과정이며, 이후 P2P 서버의 연결 관리 로직으로 전달됩니다.
본 문서는 Discovery V4 및 Discovery V5 프로토콜, Ethereum Node Record(ENR), 부트스트랩 노드, DNS 기반 발견 방식을 다룹니다. 발견 이후의 연결 관리 동작은 P2P 서버 및 피어 관리을 참조하세요.
발견된 피어와의 데이터 교환 및 동기화 방식은 체인 동기화을 참조하세요.
발견 아키텍처 개요
StableNet은 단일 방식에 의존하지 않고 여러 발견 메커니즘을 병렬로 사용하여 피어 후보 풀을 구성합니다. 발견 메커니즘:- Discovery V4: Kademlia 기반 DHT를 이용한 기본 피어 발견
- Discovery V5: 토픽 광고 및 향상된 암호화를 포함한 확장 프로토콜
- DNS Discovery: DNS TXT 레코드를 이용한 트리 기반 발견
- Bootstrap Nodes: 초기 접속을 위한 정적 시드 노드
- 프로토콜별 소스: 특정 프로토콜에서 제공하는 커스텀 반복자
enode.FairMix는 여러 발견 소스로부터 수집되는 노드 후보를 공정하게 혼합합니다.단일 소스가 후보 풀을 독점하지 않도록 라운드 로빈 방식으로 각 소스를 순회하며, 소스별 타임아웃을 적용합니다.
Discovery V4 프로토콜
Discovery V4는 UDP 기반 Kademlia DHT 프로토콜로, XOR 거리 메트릭을 사용해 노드 라우팅 테이블을 유지합니다.노드는 반복적인 쿼리를 통해 네트워크 내 임의의 노드를 탐색합니다.
V4 프로토콜 작업
| Operation | Packet Type | Purpose |
|---|---|---|
| PING | 0x01 | 노드 생존 여부 확인 및 엔드포인트 교환 |
| PONG | 0x02 | PING 응답 및 엔드포인트 확인 |
| FINDNODE | 0x03 | 대상 ID 근처 노드 요청 |
| NEIGHBORS | 0x04 | 최대 16개의 노드 정보 응답 |
| ENRREQUEST | 0x05 | 최신 ENR 요청(EIP-868) |
| ENRRESPONSE | 0x06 | ENR 응답 |
V4 구성 및 설정
Discovery V4 서비스는p2p.Config를 통해 설정되며, 서버 초기화 단계의 setupDiscovery()에서 시작됩니다.
초기화 프로세스:
- UDP 소켓을 생성합니다
- 개인 키, 네트워크 제한, 부트스트랩 노드를 포함한
discover.Config를 구성합니다 discover.ListenV4()를 호출하여 V4 서비스를 시작합니다ntab.RandomNodes()반복자를 발견 믹서에 등록합니다
Discovery V5 프로토콜
Discovery V5는 V4를 확장한 프로토콜로, 토픽 기반 탐색과 강화된 암호화를 제공합니다.랜덤 노드 탐색과 특정 토픽에 관심 있는 피어 검색을 모두 지원합니다.
V5 향상사항
- 토픽 광고: 노드가 관심 토픽을 광고하고 검색 가능
- 세션 키: 반복 통신 시 핸드셰이크 비용 감소
- ENR 업데이트: 효율적인 ENR 갱신 메커니즘
- 향상된 NAT 처리: 외부 엔드포인트 추정 개선
- 패킷 암호화: 모든 패킷에 인증된 암호화 적용
V5 구성
Discovery V5는 별도의 부트스트랩 노드 목록을 사용하며, V4와 동시에 활성화될 수 있습니다. 공유 UDP 연결: V4와 V5가 동시에 활성화된 경우 동일한 UDP 포트를 공유합니다.V4로 처리되지 않은 패킷은 V5로 전달되어 충돌을 방지합니다.
Ethereum Node Records (ENR)
ENR은 노드의 신원과 연결 정보를 담은 서명된 데이터 구조입니다.Discovery V4와 V5 모두 ENR을 사용하여 노드 정보를 교환합니다.
ENR 구조
핵심 필드:- Node ID: 공개 키에서 파생된 노드 식별자
- Sequence Number: ENR 갱신 시 증가
- Signature: 레코드 소유권 검증
- Key-Value Pairs: 확장 가능한 속성 집합
| Key | Type | Description |
|---|---|---|
id | string | 식별 스킴(보통 v4) |
secp256k1 | bytes | 압축된 공개 키 |
ip | bytes | IPv4 주소 |
ip6 | bytes | IPv6 주소 |
tcp | uint16 | RLPx TCP 포트 |
udp | uint16 | 발견용 UDP 포트 |
eth | [chainID, forkHash, forkNext] | 체인 정보 |
enode.LocalNode는 로컬 노드의 ENR을 관리하며, 네트워크 상태 변화 시 ENR을 자동으로 갱신합니다.
Bootstrap Nodes
Bootstrap 노드는 네트워크 참여 초기 단계에서 피어 탐색을 시작하기 위한 시드 노드입니다.로컬 노드가 다른 피어에 대한 정보가 없을 때 최초의 발견 진입점을 제공합니다.
Bootstrap 구성
- 구성 파일을 통한 정적 지정
- 명령줄 플래그를 통한 지정
--bootnodesV4 부트스트랩 노드--bootnodesv5V5 부트스트랩 노드
- 공개적으로 접근 가능한 엔드포인트
- 높은 가용성
- 일반적으로 네트워크 운영자가 관리
DNS Discovery
DNS Discovery는 DNS TXT 레코드에 ENR 정보를 인코딩하여 배포하는 방식입니다.노드 소프트웨어 변경 없이 동적으로 부트스트랩 목록을 갱신할 수 있습니다.
DNS Discovery 트리 구조
DNS 기반 발견은 Merkle 트리 형태로 구성됩니다.| Record Type | Description |
|---|---|
| Root | 트리 진입점 및 서명 정보 |
| Branch | 하위 노드에 대한 링크 |
| ENR | 실제 노드 레코드 |
| Link | 외부 트리에 대한 참조 |
P2P 서버와의 발견 통합
모든 발견 메커니즘은setupDiscovery()에서 초기화되어 enode.FairMix로 통합됩니다.발견된 노드 후보는 다이얼 스케줄러로 전달되어 실제 연결 시도가 이루어집니다.
공정 혼합 알고리즘
FairMix는 다음 규칙을 따릅니다:
- 활성 소스를 라운드 로빈으로 순회
- 소스별 최대 대기 시간 적용
- 응답 없는 소스는 건너뛰고 다음 소스로 이동
- 실패한 소스는 주기적으로 재시도
발견 메트릭
발견 서브시스템은 다음 상태를 유지합니다:- Discovery V4 라우팅 테이블
- Discovery V5 서비스 상태
- 발견 믹서 상태
- 로컬 ENR
- 영구 노드 데이터베이스
요약
StableNet의 피어 발견 시스템은 다층 구조로 설계되어 네트워크 변화에 강인합니다.- Discovery V4는 안정적인 DHT 기반 랜덤 발견을 제공합니다
- Discovery V5는 토픽 기반 탐색과 향상된 보안을 제공합니다
- ENR은 확장 가능하고 서명된 노드 정보 교환을 지원합니다
- Bootstrap Nodes는 네트워크 진입 지점을 제공합니다
- DNS Discovery는 동적이고 유연한 부트스트랩을 가능하게 합니다
FairMix를 통해 결합되어, 다이얼 스케줄러에 지속적으로 균형 잡힌 피어 후보를 공급합니다.
