이더리움의 p2p패키지

in #ethereum7 years ago

안녕하세요 이더리움 주석을 한글로 번역하고 있는 sigmoid 입니다.
p2p 패키지의 주석을 번역하다 보니, 어느 정도 큰그림을 잡고 분석해지 않으면 코드보다가 산으로 갈것 같다는 느낌이 들어서 간단하게 정리를 해보게 되었습니다.

나타나는 단어들만 정리해봐도 이 정도거든요.

네트워크 프로토콜: TCP/UDP/NAT/SNTP
p2p: kademlia like node table
discovery 프로토콜: base, discv5
네트워크 인코딩: RLPx
암호화: keccak256, sha3, ecda

크립토로서, 언젠가는 하나하나 중점적으로 분석하는 시간을 가져야겠지만, 우선 연결들을 어떻게 관리하고 동작하는지만 중점으로 분석을 해보았습니다

P2P의 시작은 StartNode시 p2p.Server.Start 함수를 호출하면서 시작 됩니다.

  1. 가장먼저 하는 일은 2개의 수신자 loop를 만드는 일입니다.
    디스커버리용 udp 와 peer 통신용 tcp인데요. 이 수신자들의 행동을 머릿속에 넣어두고 있으면 다음 동작들을 읽어야 이해가 가기 때문에 짧게 정리하고 가겠습니다.
  • udp 수신자는 ping일 경우 pong을 리턴하고, findnode일경우 나와 가까운 이웃들(버켓)의 정보를 전송합니다.
  • tcp수신자는 패킷을 수신하면 keccak256 해시를 풀고 관련된 메시지에 대한 응답을 처리합니다. 프로토콜 쿼리가 오면 내가 지원하는 서브프로토콜과 현재 동작중인 프로토콜의 정보를 반환해 줍니다
  1. 수신자를 만든후에는 디스커버리 프로토콜들 (discovery, discv5)를 실행하기 위한 udp 연결을 각각 만듭니다.
    udp연결을 만들때, 노드 테이블을 함께 생성하는데, 이 테이블이 앞으로 나와 연결된 노드들의 정보를 저장할 테이블입니다
  • 처음 실행할때는 테이블에 부트 스트랩 노드 정보만을 추가합니다
  • find node를 메시지를 테이블 상의 노드들에게 전송하여 상대 노드의 이웃정보를 받아오게 됩니다.
  • 이 이웃정보를 바탕으로 연결을 시도하게 되고, 연결이 성공한다면 테이블에 추가합니다. (1번에 언급했던 것처럼 부트스트랩 노드의 udp 리스너 루프에서 findnode를 받아서 자신의 이웃정보를 줬겠죠?)
  • 테이블을 타이머를 통해 주기적으로 갱신합니다. 이때 kademlia like라는 표현이 여기서 나오는데요 p2p 토폴로지를 관리할때 거리별로 버켓에 담아두고, n개의 가까운 노드들과 연결을 유지할때 버켓의 내용을 사용하기 때문으로 보입니다. 거리를 계산할때 sha3를 사용하여 구하는것도 인상적이고요. 30초에 한번씩 버켓상의 노드 활성화 여부를 검색(ping)하고 피어의 상태를 관리합니다. 30분에 한번씩 갱신해서 테이블상의 가장 가까운 노드 n개로 재구성합니다.
  1. 이제 테이블이 완성되었으니 TCP 다이얼러를 생성하여 테이블 상의 피어들에게 연결요청을 합니다. 요청이 수락되면 피어와 2번의 핸드쉐이크를 하게 됩니다. 첫번째는 RLPx 핸드쉐이크이고 두번째는 프로토콜 핸드쉐이크 입니다. 과정이 복잡해서 단순히 나열만 해보고자 합니다.
  • 나(서버)의 ecdsa 개인키로 인증 메시지를 만든다
  • ECIES로 서명하여 패킷을 피어로 전송
  • 피어의 수신자 루프에서 응답이 오면 핸드쉐이크 메시지를 읽고 퍼블릭키를 발라낸다
  • 보내고 받은 메시지를 이용하여 keccak256으로 공유된 비밀을 유도한후 MAC를 위한 sha3인스턴스 설정
  • 공유된 비밀정보의 MAC와 AES를 이용해 인디코딩할 rlpx frame Read/Writer 준비
  • RLPx 핸드 쉐이크가 끝났으므로 프로토콜 핸드쉐이크를 위한 handShake 메시지 전송
  • 응답을 읽은후, add/run peer 진행(피어의 서브프로토콜들을 실행시킴)

제가 우선 분석한것은 이정도 입니다.
혹시 분석하시는 분들 계시면 도움이 되었으면 좋겠네요.

저는 여전히 꾸준히 이더리움 소스코드의 주석을 한글화 하고 있습니다.
https://github.com/NAKsir-melody/go-ethereum

Coin Marketplace

STEEM 0.09
TRX 0.31
JST 0.031
BTC 106601.18
ETH 3832.91
USDT 1.00
SBD 0.58