EIP-868 노드 디스커버리 v4 ENR 확장 (Node Discovery v4 ENR Extension)
최종 확정 · 네트워크·노드 · 원문 상태 Final · 2018-02-02 작성
이더리움 노드가 서로를 찾는 데 쓰는 노드 디스커버리 프로토콜 v4에 패킷 두 개를 추가해 다른 노드의 최신 노드 레코드(ENR)를 직접 요청해서 받을 수 있게 합니다.
왜 필요한가
이더리움 노드는 네트워크에 참여하려면 먼저 다른 노드를 찾아야 하고 이때 노드 디스커버리 프로토콜을 씁니다. EIP-778은 노드의 접속 정보를 담아 노드 자신이 서명하는 노드 레코드(ENR, Ethereum Node Record)라는 형식을 정의했지만 기존 디스커버리 v4에는 특정 노드에게 그 레코드의 최신 버전을 달라고 요청하는 방법이 없었습니다. 지금의 디스커버리 네트워크와 앞으로 나올 디스커버리 네트워크를 잇고 DNS처럼 레코드를 다른 경로로 전달하는 방식을 구현하려면 가장 최신 레코드를 받아올 수단이 필요합니다. 이 EIP는 새 프로토콜을 만들지 않고 이미 쓰고 있는 디스커버리 프로토콜 위에 요청과 응답 패킷을 더해 이 문제를 풉니다.
무엇이 바뀌나
지금
- 디스커버리 v4에는 다른 노드의 노드 레코드(ENR)를 요청하는 패킷이 없습니다
- 상대 노드의 레코드가 갱신됐는지 알 방법이 없습니다
- DNS 같은 다른 경로로 레코드를 전달하는 방식을 뒷받침할 조회 수단이 없습니다
EIP-868 이후
- ENRRequest와 ENRResponse 패킷으로 최신 레코드를 직접 받아옵니다
- ping과 pong 패킷에 레코드의 시퀀스 번호가 실려, 상대 레코드가 바뀌었는지 바로 알 수 있습니다
- 공개키만 알면 Kademlia 조회와 ENRRequest를 거쳐 그 노드의 현재 레코드를 얻을 수 있습니다
누구에게 영향이 있나
- 클라이언트 팀: 디스커버리 v4 구현에 새 패킷 두 종류(ENRRequest, ENRResponse)를 지원하고 ping·pong에 enr-seq 필드를 추가해야 합니다.
- 노드 운영자: 노드가 자신의 최신 접속 정보를 담은 서명된 레코드를 네트워크에 직접 알릴 수 있게 됩니다.
- 디스커버리 인프라 개발자: DNS 등 다른 경로로 ENR을 전달하는 구현의 기반이 됩니다.
심층 설명
ping·pong 패킷에 enr-seq 필드 추가
기존 Ping 패킷(0x01)의 데이터는 [version, from, to, expiration, enr-seq]로, Pong 패킷(0x02)의 데이터는 [to, ping-hash, expiration, enr-seq]로 확장됩니다. enr-seq는 보내는 노드가 가진 자기 레코드의 현재 시퀀스 번호입니다. 나머지 필드의 의미는 기존과 같습니다. 평소 주고받는 ping·pong에 시퀀스 번호가 실리므로, 상대 레코드가 내가 아는 버전보다 새로워졌는지 추가 패킷 없이 알 수 있습니다.
ENRRequest 패킷(0x05)과 증폭 공격 방어
ENRRequest의 패킷 데이터는 [expiration] 하나입니다. 이 패킷을 받은 노드는 자기 레코드의 현재 버전을 담은 ENRResponse로 답해야 합니다. 증폭 공격(amplification attack)을 막기 위해 ENRRequest를 보내는 쪽은 FindNode와 마찬가지로 최근에 ping 패킷에 응답한 적이 있어야 합니다. expiration 필드는 UNIX 타임스탬프이며 기존 패킷들과 같은 방식으로 처리합니다. 즉 과거 시각을 가리키면 응답하지 않습니다.
ENRResponse 패킷(0x06)과 서명 검증
ENRResponse의 패킷 데이터는 [request-hash, ENR]입니다. request-hash는 응답 대상이 된 ENRRequest 패킷 전체의 해시이고 ENR은 노드 레코드 자체입니다. 패킷을 받은 쪽은 그 레코드에 ENRResponse를 보낸 노드가 서명했는지 검증해야 합니다. 이 검증 덕분에 중간에서 레코드를 바꿔치기할 수 없고 레코드 해석이 권위 있는(authoritative) 결과가 됩니다.
공개키로 레코드를 해석하는 절차
어떤 노드 공개키의 현재 레코드를 해석하려면, 먼저 FindNode와 Neighbors 패킷으로 Kademlia 방식의 재귀 조회를 수행합니다. 대상 노드를 찾으면 그 노드에 ENRRequest를 보내고 응답에서 레코드를 꺼내 반환합니다. 기존 디스커버리의 노드 탐색 경로를 그대로 쓰고 마지막에 레코드 요청 한 번만 더하는 구조입니다.
제안 배경과 표준 상태
이 EIP의 목적은 현재와 미래의 디스커버리 네트워크를 잇고 DNS 같은 다른 ENR 전달 방식의 구현을 돕기 위해 레코드의 최신 버전을 요청할 수단을 제공하는 것입니다. EIP-8과 EIP-778을 필요로 하며(requires) 2018년 2월 2일에 작성됐고 상태는 Final입니다. 즉 명세가 확정된 네트워킹 표준입니다.