나의 이더리움 분석기 - 중간정리 - 1

in ethereum •  6 years ago 

그동안 듬성듬성 분석해둔 부분을 일련의 그림으로 정리하여
이더리움 노드의 동작 맵을 그려보고자 합니다.

1 먼저 geth가 실행되면 풀노드로 동작하기 위해 노드를 하나 생성하는데,
이 과정에서 어카운트 매니져와 키스토어를 함께 생성합니다.
지난번에도 언급했지만, 이더리움 소스코드에서 노드라는 개념은
다양한 종류의 서비스를 등록하는 컨테이너 입니다.

2 이더리움 관련 설정값을 초기화 합니다. 이더베이스를 지정하고, 가스오라클이나 트렌젝션 풀에서 사용할 파라미터들을 초기화 합니다.(동기화 주기나, 동작을 위한 queue등을 설정). 메신져 서비스인 shh와 모니터링 서비스인 dashboard관련 설정도 진행합니다.

3 이더리움 서비스를 노드에 등록합니다. 이더리움 서비스의 내용은 다음그림에서 확인하겠지만, 이더리움 네트워크 동작에 사용될 DB, 합의 엔진, 인덱서, 체인, 트렌젝션 풀, 마이닝, 프로토콜 매니져, 가스 오라클까지 우리가 알고 있는 이더리움 그자 체라고 생각하시면 됩니다.

4 shh와 Stat서비스를 등록합니다. (크게 관심없어서 넘기겠습니다)

5 노드를 시작합니다. 이때 아까 등록했던 이더리움 서비스를 실제로 생성하게 됩니다.

5-1 이더리움의 모든 정보를 저장하는 DB를 생성합니다.

5-2 제네시스 블록을 설정합니다. 여기에 어떤 값을 설정하느냐에 따라 노드가 메인넷 체인기반으로 동작할지, 테스트넷 체인 기반으로 동작할지가 결정됩니다.

5-3 합의 엔진을 초기화 합니다. (합의 관련해서도 추가 분석진행중입니다.)

5-4 체인을 검색하여 블록을 관리할수있는 인덱서를 생성합니다.

5-5 블록체인을 생성시, 헤더체인을 생성하고, 초기 동기화용 루프를 동작시킵니다.

5-6 트렌젝션 풀을 생성해두고, 동기화용 루프를 동작시킵니다.

5-7 마이닝을 생성합니다. (5-3, 5-7에 해당하는 마이닝 관련 이전 글도 도식화 중에 있습니다.)

5-8 가스 오라클을 생성합니다.

6 노드를 시작합니다.

6-1 P2P 서비스를 시작합니다.리스닝 루프에서는 피어의 접속을 수락하기 위한 Aceept함수가, RunLoop에서는 피어에 접속하기 위한 dial함수가 동작합니다. 시간적 순서에 따라 누군가는 dial을 누군가는 accept를 하게 되고 어디서 많이 들어본 discovery v5 protocol이라던지, Devp2p의 handshake라던지 이런동작을 통해 연결이 확정되면 각 피어의 해당 루프에서는 handleMsg함수가 호출되게 됩니다. (저 아래그림에서 insertChain함수를 호출하도록 만드는 메시지가 여기서 처리됩니다. 핑크색으로 연결해두었습니다)

6-2 인덱서를 시작합니다. (추가분석이 필요합니다)

6-3 프로토콜 매니져를 시작하고 강조드렸던 4개의 루프가 동작하게 됩니다.
그중 이 글에서는 초록색으로 표현된 syncer만 정리합니다.

7 이전 글에서 다루었듯이 이더리움 프로토콜 매니져가 시작하면 싱커합수가 호출되고, 초록색 루프가 동작합니다.
이 루프 안에는 p2p레이어로 부터 전달된 블록을 노드가 관리하는 체인에 추가합니다.

8 그리고 체인에 추가하는 과정에서 블록 내부에 존재하는 트렌젝션들의 실행을 통해 어카운트의 잔고를 업데이트하는 것을 보실수 있습니다.

중간정리 -2 에서는
이전에 글로만 다루었던 마이닝과 블록의 브로드 캐스팅, 트렌젝션의 공유등에 대해
호출 맵을 작성하여 업데이트 할 예정입니다.

트렌젝션 공유

마이닝의 시작과 블록이벤트 그리고 블록의 전파
https://steemit.com/ethereum/@sigmoid/3flwa

지극히 개인적으로 이더리움 주석 한글화 프로젝트를 진행하고 있습니다.
https://github.com/NAKsir-melody/go-ethereum

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!