메인 콘텐츠로 건너뛰기

목적 및 범위

이 페이지는 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 프로토콜 작업

OperationPacket TypePurpose
PING0x01노드 생존 여부 확인 및 엔드포인트 교환
PONG0x02PING 응답 및 엔드포인트 확인
FINDNODE0x03대상 ID 근처 노드 요청
NEIGHBORS0x04최대 16개의 노드 정보 응답
ENRREQUEST0x05최신 ENR 요청(EIP-868)
ENRRESPONSE0x06ENR 응답

V4 구성 및 설정

Discovery V4 서비스는 p2p.Config를 통해 설정되며, 서버 초기화 단계의 setupDiscovery()에서 시작됩니다. 초기화 프로세스:
  1. UDP 소켓을 생성합니다
  2. 개인 키, 네트워크 제한, 부트스트랩 노드를 포함한 discover.Config를 구성합니다
  3. discover.ListenV4()를 호출하여 V4 서비스를 시작합니다
  4. 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-Value 항목:
KeyTypeDescription
idstring식별 스킴(보통 v4)
secp256k1bytes압축된 공개 키
ipbytesIPv4 주소
ip6bytesIPv6 주소
tcpuint16RLPx TCP 포트
udpuint16발견용 UDP 포트
eth[chainID, forkHash, forkNext]체인 정보
enode.LocalNode는 로컬 노드의 ENR을 관리하며, 네트워크 상태 변화 시 ENR을 자동으로 갱신합니다.

Bootstrap Nodes

Bootstrap 노드는 네트워크 참여 초기 단계에서 피어 탐색을 시작하기 위한 시드 노드입니다.
로컬 노드가 다른 피어에 대한 정보가 없을 때 최초의 발견 진입점을 제공합니다.

Bootstrap 구성

  • 구성 파일을 통한 정적 지정
  • 명령줄 플래그를 통한 지정
    • --bootnodes V4 부트스트랩 노드
    • --bootnodesv5 V5 부트스트랩 노드
요구사항:
  • 공개적으로 접근 가능한 엔드포인트
  • 높은 가용성
  • 일반적으로 네트워크 운영자가 관리

DNS Discovery

DNS Discovery는 DNS TXT 레코드에 ENR 정보를 인코딩하여 배포하는 방식입니다.
노드 소프트웨어 변경 없이 동적으로 부트스트랩 목록을 갱신할 수 있습니다.

DNS Discovery 트리 구조

DNS 기반 발견은 Merkle 트리 형태로 구성됩니다.
Record TypeDescription
Root트리 진입점 및 서명 정보
Branch하위 노드에 대한 링크
ENR실제 노드 레코드
Link외부 트리에 대한 참조
DNS 클라이언트는 트리를 순회하며 ENR 레코드를 추출하고, 이를 발견 믹서에 전달합니다.

P2P 서버와의 발견 통합

모든 발견 메커니즘은 setupDiscovery()에서 초기화되어 enode.FairMix로 통합됩니다.
발견된 노드 후보는 다이얼 스케줄러로 전달되어 실제 연결 시도가 이루어집니다.

공정 혼합 알고리즘

FairMix는 다음 규칙을 따릅니다:
  1. 활성 소스를 라운드 로빈으로 순회
  2. 소스별 최대 대기 시간 적용
  3. 응답 없는 소스는 건너뛰고 다음 소스로 이동
  4. 실패한 소스는 주기적으로 재시도

발견 메트릭

발견 서브시스템은 다음 상태를 유지합니다:
  • Discovery V4 라우팅 테이블
  • Discovery V5 서비스 상태
  • 발견 믹서 상태
  • 로컬 ENR
  • 영구 노드 데이터베이스
발견 결과는 다이얼 스케줄러로 전달되어 연결 시도 수를 제한하고, 실패 기록을 추적하여 재시도 폭주를 방지합니다.

요약

StableNet의 피어 발견 시스템은 다층 구조로 설계되어 네트워크 변화에 강인합니다.
  1. Discovery V4는 안정적인 DHT 기반 랜덤 발견을 제공합니다
  2. Discovery V5는 토픽 기반 탐색과 향상된 보안을 제공합니다
  3. ENR은 확장 가능하고 서명된 노드 정보 교환을 지원합니다
  4. Bootstrap Nodes는 네트워크 진입 지점을 제공합니다
  5. DNS Discovery는 동적이고 유연한 부트스트랩을 가능하게 합니다
이 모든 메커니즘은 FairMix를 통해 결합되어, 다이얼 스케줄러에 지속적으로 균형 잡힌 피어 후보를 공급합니다.