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 클라이언트를 실행할 때 어떤 일이 일어나는지, 시작점부터 실행 순서대로 보도록 하겠다.
'blockchain > geth 소스코드 분석' 카테고리의 다른 글
Geth 소스코드 분석 4 - makeFullNode 1편 - makeConfigNode() (0) | 2024.02.07 |
---|---|
Geth 소스코드 분석 3 - 시작지점 살펴보기 (0) | 2024.01.30 |
Geth 소스코드 분석 2 - 몇 가지 타입 살펴보기 (0) | 2024.01.29 |