blockchain/geth 소스코드 분석

Geth 소스코드 분석 1 - 시작하기 및 전체 구조

uzzam 2024. 1. 27. 01:49

Geth 소스코드 분석을 해볼까 한다.

Geth 소스코드를 분석한 한글 자료가 있긴 하지만 오래된 자료들이 많다.

게다가 대부분의 자료가 중요한 업데이트 중 하나인 '더 머지' 업데이트 전 자료기 때문에 바뀐 점이 꽤나 많을 것 같다.

이더리움은 계속해서 업데이트 되기 때문에 그런 자료들을 참고해서 나도 한 번 코드를 살펴보려고 한다.

아마 최신 자료가 별로 없는 건, 블록체인 업계에 신규 유입되는 개발자들이 많지 않고 또 과거에 비해 다양한 체인들이 많아져서 골고루 분포하기 때문이지 않을까 생각해본다..

 

 

좋은 자료 및 참고 자료

https://github.com/NAKsir-melody/go-ethereum-korean

https://docs.google.com/presentation/d/1kKwMyiuH_i4-2q1AihoRCxO3gfwMLIEL1E8tt5BjxnM/edit?usp=sharing

가장 큰 도움이 된 두 자료.

dsrv 김지윤 대표님이 작성하셨다.

Geth를 이해하는데 가장 큰 도움이 되는 자료이고 제일 많이 참고할 예정이다.

 

 

https://steemit.com/kr/@woojin.joe/go-ethereum-geth-day-01

https://www.youtube.com/watch?v=4SOSY0gNy2g

스팀잇 글과 유튜브가 한 세트라고 보면 된다.

스팀잇 글은 '자바 개발자의 go-ethereum(geth) 소스 분석기 시리즈로' 무려 6년 전 자료이다.

유튜브는 어쩌다가 찾게 되었는데 라인개발자 조우진님이 네이버? 라인?에서 강연하시는 영상이다. 

Naver D2 채널에 올라와있다. 글과 같이 보면 더 이해가 쉽다.

Golang에 대한 부분도 알 수 있어서 좋았다.

 

 

https://github.com/scalalang2/go-ethereum-code-analysis

비교적 최신 글로 (2년전)
https://github.com/agiletechvn/go-ethereum-code-analysis

영문 버전의 자료 (6년전)를 한국어로 재해석했다고 되어 있다.

 

 


개요

전체적인 폴더 구조를 살펴보며 전체적인 느낌을 잡고 geth를 실행하면 어떤 일이 일어나는지 순차적으로 보며 자세한 코드를 볼 예정이다.

 

 

코드를 보기 앞서 무슨 버전의 코드를 봐야 하나 싶었다.

최신 버전은 2일 전에 올라온 1.13.11인데 너무 최신이라 괜찮은가 싶어서 무슨 버전의 geth를 많이 사용하는지 보았다.

https://www.ethernodes.org/client/geth

위 주소에서 확인했는데 다들 비교적 최신 버전을 사용하고 있고, 1.13.11도 4%가 되기 때문에 1.13.11을 보기로 했다.

 

그럼 아래 명령어를 통해 1.13.11로 들어가서 보자

git clone https://github.com/ethereum/go-ethereum.git
git checkout tags/v1.13.11

 


폴더 구조

전체적인 구조를 한 번 보면 도움이 될듯 말듯하다 ㅎㅎ (너무 방대하다)

// Package accounts implements high level Ethereum account management.
package accounts

무슨 패키지인지 보통 이런식으로 주석이 달려있는 편인 것 같다.

 

// https://github.com/scalalang2/go-ethereum-code-analysis/blob/master/go-ethereum-code-analysis.md
// 에서 작성한 부분을 현재 geth v1.13.11 코드에 맞게 수정했다.
// contracts, les, light, mobile 삭제
// beacon, docs, internal, params, signer, swarm 추가
// cmd 하위 패키지 수정

accounts		이더리움 계정의 추상화된 코드를 제공함
beacon			beacon 체인과 관련 코드
build			스크립트(sh) 파일과 빌드에 관한 설정 파일들이 저장된 곳
cmd			다양한 CLI 명령어 도구
	/abidump	컨트랙트의 calldata 를 파싱해서 원본을 추출하는 도구
	/abigen		Solidity 소스 코드로부터 ABI파일을 만드는 명령어
    /bootnode	네트워크 디스커버리만을 위한 노드 실행
	/clef		노드의 운영과 개인키의 관리를 분리시키기 위해 사용되는 명령어
	/devp2p		devp2p(노드가 서로를 찾고 통신하는 방법을 정확하게 정의하는 이더리움 네트워크 프로토콜) 사양 구현
    /ethkey	ethkey is a simple command-line tool for working with Ethereum keyfiles.
	/evm		설정 가능하고 독립적으로 디버깅이 가능한 환경을 제공하는 이더리움 가상 머신 개발 도구
	/geth		이더리움 클라이언트 
	/p2psim		Http API를 시뮬레이션 하기 위한 명령어
	/rlpdump 	RLP 데이터의 형식화된 출력을 도와준다.
	/utils		유틸성 패키지
common			공통 도구를 제공한다.
consensus		ethash나 clique, ibft 같은 합의 엔진을 제공함
console			이더리움 콘솔 패키지
core			이더리움의 코어 데이터 구조체 혹은 알고리즘이 저장됨. (가상머신, 상태, 블록체인, 블룸필터 등)
crypto			암호화 & 해시 알고리즘
docs			audit 보고서랑, 버그 분석이 있음
eth				이더리움의 합의 구현체
ethclient		이더리움 RPC 클라이언트 코드
ethdb			이더리움 데이터베이스 (실제 저장소인 level-db와 테스트 용도인 in-memory 데이터베이스가 구현되어 있다.)
ethstats		네트워크 상태에 대한 정보를 제공한다.
event			실시간 이벤트 관리
graphql			GraphQL을 제공하는 도구
internal		내부적으로 쓰이는 것들?? 
log				로깅 패키지
metrics			그라파나 연동을 위한 메트릭을 제공한다.
miner			블록 생성 및 마이닝 기능을 제공한다.
node			다양한 타입의 이더리움 노드
p2p				p2p 네트워크 프로토콜
params			사전 정의된 상수 혹은 변수들이 있음
rlp				recursive length prefix의 약자로 이더리움에서 사용되는 직렬화 알고리즘
rpc				API와 서비스에서 사용되는 원격 함수 호출
signer			트랜잭션과 데이터의 서명 처리 관련
swarm			ethswarm.org 링크와 설명으로 이루어진 README.md 파일
tests			테스트 목적
trie			머클 패트리샤 트리의 구현체

 

아마 자세한 코드를 확인 후 다시 전체 구조를 바라보면 다른 느낌이 들 것 같다.

다음 글에서는 geth 클라이언트를 실행할 때 어떤 일이 일어나는지, 시작점부터 실행 순서대로 보도록 하겠다.