- 개인적으로 이더리움 한글주석 프로젝트를 진행하고 있습니다.
https://github.com/NAKsir-melody/go-ethereum *
새롭게 노드가 생성되었을때 어떻게 블록체인데이터를 동기화 하는지 소스코드를 분석해 보면,
노드 생성시 geth -> MakeFullNode -> regiseterEthService에서 (이더리움 서비스 생성 중간 부분)
CreateDB로 체인DB를 초기화 한후, 메인넷의 제네시스 블록을 DB에 저장한다.
이상태로 새로운 퓨쳐블록을 처리하기 위한 5초짜리 티커를 설정하여 새로운 블록에 대한 처리를 시작한다
즉 이때 이 노드의 블록체인에는 제네시스 블록이 달랑 하나 존재하는 상태로 체인으로서의 동작을 시작하는 것이다.
이후 이더리움 서비스 생성과정의 마지막 부분인 서브프로토콜 생성에서
syncer라는 go 루틴이 동작하게 되는데
이 루틴에서 새로운 피어가 연결되었다는 메시지를 받거나
10초 티커가 발생할 경우(피어가 충분하지 않은 상황에서 이따금씩 동기화 하는 이벤트)
상대 피어의 TD를 체크하여 나보다 크면 싱크를 시작한다
TD는 토탈 디피컬티로 해당 노드의 디피컬티가 크다는 것은 나보다 더 긴 캐노니컬 체인을 가지고 있다는 뜻으로 해석 가능하므로 대부분의 경우 제네시스 블록에서 시작한 새로운 노드보다는 TD가 크다
downloader의 synchronise -> syncwithpeer -> spawnSync함수를 호춣하면
등록된 헤더패쳐, 바디패쳐, 영수증 페쳐, 헤더 프로세서가 동시에 실행되면서
현재 내가 소유한 다음 블록부터 상대방의 체인을 읽어서
체인 DB에 저장하기 시작한다