> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stablenet.network/llms.txt
> Use this file to discover all available pages before exploring further.

# 발견 메커니즘

## 목적 및 범위

이 페이지는 StableNet의 P2P 네트워킹 레이어에서 사용되는 피어 발견 메커니즘을 설명합니다.\
피어 발견은 노드가 네트워크 내의 다른 노드를 식별하고 연결 후보로 확보하는 과정이며, 이후 P2P 서버의 연결 관리 로직으로 전달됩니다.\
본 문서는 Discovery V4 및 Discovery V5 프로토콜, Ethereum Node Record(ENR), 부트스트랩 노드, DNS 기반 발견 방식을 다룹니다.

발견 이후의 연결 관리 동작은 [P2P 서버 및 피어 관리](/ko/networking/7.1-p2p-server-and-peer-management)을 참조하세요.\
발견된 피어와의 데이터 교환 및 동기화 방식은 [체인 동기화](/ko/networking/7.3-chain-synchronization)을 참조하세요.

## 발견 아키텍처 개요

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()`에서 시작됩니다.

**초기화 프로세스:**

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 항목:**

| 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 구성

* 구성 파일을 통한 정적 지정
* 명령줄 플래그를 통한 지정
  * `--bootnodes` V4 부트스트랩 노드
  * `--bootnodesv5` V5 부트스트랩 노드

**요구사항:**

* 공개적으로 접근 가능한 엔드포인트
* 높은 가용성
* 일반적으로 네트워크 운영자가 관리

## DNS Discovery

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

### DNS Discovery 트리 구조

DNS 기반 발견은 Merkle 트리 형태로 구성됩니다.

| Record Type | Description    |
| ----------- | -------------- |
| 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`를 통해 결합되어, 다이얼 스케줄러에 지속적으로 균형 잡힌 피어 후보를 공급합니다.
