4주차 스터디 이더리움 p2p는 어떻게 연결하는걸까?
조사한 이유는 node를 만들고 p2p로 연결되는지 궁금해하여 조사하였습니다.
기존 연결
P2P의 종류
a. Hybrid
구동되는 node들은 먼저 index서버에 연결할수있는 node리스트를 받아 연결을 시도하는 타입입니다.
인덱스 서버를 공격하면 신규node는 연결이 되지 않습니다.
주로 Private 블록체인에서 많이 사용합니다.
만약 index서버가 해킹당하면 어떻게 되는걸까?
b. pure
노드 탐색 등의 기능도 노드가 수행하는 순수 P2P입니다.
주로 public 블록체인에서 사용합니다.
이더리움의 P2P프로토콜
이더리움은 순수P2P로 분류되며 프로토콜 devP2P라는 암호화된 피어간 네트워크 프로토콜을 사용합니다.
이더리움은 완전 분산 네트워크를 위한 DHT(Distributed Hash Table) 프로토콜 중 하나인 Kademlia의 일부를 수정해서 사용합니다.
Kademlia는 노드 간의 거리를 XOR distance로 측정합니다. (공개키를 노드 ID로 하는 오버레이 네트워크를 정의하고 두 노드 ID의 XOR연산한 값을 사용 한다네요.)
각 노드는 자신이 알고 있는 노드 중에서 자신과 가까운 노드들과 우선 통신하면
적은 연결 수로도 큰 네트워크를 구성할 수 있다는 장점이 있습니다.(효율적이기도 합니다.)
대략 노드의 개수를 N이라고 할 때 각 노드는 O(log(N))개의 연결만 유지하면 연결됩니다.
이더리움은 받은 메시지의 시간이 현재 시각과 20초 이상 차이가 나면
replay-attack으로 받은 메시지로 가정하고 무시하기 때문에 가까운 노드들이랑만 통신 되어야 합니다.
또한 네트워크에 너무 많은 리소스를 사용하지 않기 위해 통신할 최대 연결 수(25개)를 정해놓고 있습니다.
https://blog.seulgi.kim/2018/03/ethereum-eclipse-attack.html
Kademlia
Kademlia 는 2002 년 Petar Maymounkov와 David Mazières가 설계 한 분산 형 피어 - 투 - 피어 컴퓨터 네트워크 를 위한 분산 해시 테이블 입니다 .
노드 조회를 통한 네트워크 구조와 정보 교환을 지정 합니다.
Kademlia 노드는 UDP를 사용하여 자체적으로 통신 합니다.
가상 또는 오버레이 네트워크 는 참가자 노드에 의해 형성됩니다.
각 노드는 번호 또는 노드 ID로 식별됩니다 . 노드 ID가 아니라 식별로서 기능하지만 Kademlia 알고리즘이 사용하는 노드 ID를 (보통 파일 값을 찾기 위해 해시 또는 키워드) 노드 ID 는 파일 해시에 대한 직접 Map을 제공하며 해당 노드는 파일 또는 리소스를 가져올 위치에 대한 정보를 저장합니다.
일부 값을 검색 할 때 연관된 키를 알아야하며 몇 단계로 네트워크를 탐색합니다. 각 단계는 접촉 된 노드가 값을 반환하거나 더 가까운 노드가 발견 될 때까지 키에 더 가까운 노드를 찾습니다. 이것은 매우 효율적입니다
특히 서비스 거부 공격 에 대한 저항력을 높이는 분산 형 구조에서 더 많은 이점이 있습니다.
스스로 회복하기 때문에 노드 세트가 해킹된 경우에도 네트워크 가용성에 미치는 영향은 제한적입니다.
예상되는 구현방법
노드간의 핸드셰이킹(RLPx의 핸드셰이크 4way handshaking)
ping pong시간을 체크하여 node들의 점수 정합니다.
데이터를 정확하게 전달한 피어들의 점수를 플러스 해줍니다.
- 정확하게 전달되었다는걸 파악하기 위해서 전달하기 전에 데이터 앞쪽에 데이터 해쉬값을 넣어줍니다.
- 받은 데이터를 해쉬를 돌려보고 앞쪽 데이터 해쉬값과 비교해 일치하면 정확하게 받았다고 판단합니다.
잘못된 데이터를 전달한 피어의 점수를 마이너스 해줍니다.
1~25위 까지 피어에 데이터를 전파합니다.
P2P의 구현의 예상되는 문제점
- 주고받는 데이터가 유효한지 알수 없습니다.
- 성능이 모두 다른 node
- 특정구간의 네트워크상태에 따라 연결이 빈번하게 끈김
- 특정노드가 해커에게 점령당해 다수의 노드를 악의적으로 잘못된 데이터 전파
- 거의 모든 node가 내부 IP를 사용중이라 외부IP를 알수 없음
- Routing table 공격(모든 25개 연결을 악의적 노드로 연결)