Exclamate EOS! : EOS Source Tree Overview

Jeeyong Um
GameXCoin
Published in
6 min readAug 9, 2018

# commit-id: 4f4e5c225

본 시리즈는 개발자를 대상으로 하고 있으므로 친절하지 않을 수 있습니다.
소스 코드는 변경될 수 있으므로 매 글 상단에 분석 시점 기준 마지막 commit-id를 기록합니다.

EOS

EOS 소스 코드는 아래와 같은 디렉토리 구조를 갖고 있다.

eos
├── CMakeModules
├── Docker
├── contracts
├── debian
├── docs
├── externals
├── images
├── libraries
├── plugins
├── programs
├── scripts
├── tests
├── tools
├── tutorials
└── unittests

빌드를 위한 스크립트나 문서 생성에 사용하는 이미지 등을 제외하면 EOS의 핵심 기능과 관련된 주요 코드는 프로그램(programs), 플러그인(plugins), 라이브러리(libraries) 세 곳에 나뉘어 있다. (+ 스마트 컨트랙트 코드를 포함한 contracts)

nodeoskeosd 는 구조가 매우 비슷한데, 주요 기능은 라이브러리에서 구현하고, 모듈화 된 플러그인이 라이브러리를 호출하여 기능을 수행하며, 각 프로그램은 자신에게 필요한 플러그인을 선택하여 조합하는 식이다.

예를 들어 nodeos 의 경우,

  1. eosio::chain (libraries/chain): EOS 블록체인 구현체
  2. eosio::chain_plugin (plugins/chain_plugin): eosio::chain 라이브러리 호출하여 블록체인 구동
  3. nodoes (programs/nodeos): 실행할 때 eosio::chain_plugin 로딩

nodoes가 제공하는 기능이 상당히 많은데 정작 programs/nodoes 경로에는 main.cpp(153 lines) 파일 하나 밖에 없다. 나머지 코드는 라이브러리와 플러그인 안에 존재한다.

Libraries

libraries/
├── abi_generator
├── appbase
├── builtins
├── chain
├── chainbase
├── fc
├── softfloat
├── testing
├── utilities
└── wasm-jit

EOS 주요 기능의 구현체가 위치한 곳이다. 별도의 git repo를 서브 모듈로 추가한 것이 많은데 대부분 메인 개발자인 Dan Larimer의 개인 repo를 fork 하여 만들어졌다.

Steem 청서에서 말하는 AppBase나 ChainBase가 EOS에도 존재하는데, 소스 코드를 비교해보면 같은 코드를 기반으로 필요에 따라 각자 수정한 것을 알 수 있다.

AppBase

nodeos, keosd 등 EOS 프로그램의 뼈대를 이루고 있는 라이브러리이다. 앞서 소개한 플러그인 조합 방식의 프로그램을 작성할 수 있도록 만들어졌고, 블록체인 의존성이 있는 것이 아니므로 다른 일반 프로그램 작성시에도 사용 가능하다.

ChainBase

빠른 속도의 데이터 입출력을 필요로 하는 블록체인의 요구사항을 만족하기 위해 작성된 메모리 맵 파일 데이터베이스이다. Boost 라이브러리의 multi_index_container 기반이며 AppBase와 마찬가지로 블록체인이 아닌 다른 용도로 사용하는 것도 가능하다.

Chain

EOS 블록체인 기능이 구현된 핵심 라이브러리이다. nodeos 에서 실제 노드 작동을 담당하는 chain_pluginproducer_plugin 이 사용하는 대부분의 기능은 Chain 라이브러리 안에 구현되어 있다.

FC

유틸리티 라이브러리로 Mutex, Asynchronous I/O, Hashing algorithm, Boost library wrapper 등 다양한 기능을 제공하면서도 컴파일 속도를 높이기 위해 작성되었다. FC는 Fast C++ compilation의 준말이다.

Plugins

plugins/
├── account_history_api_plugin
├── account_history_plugin
├── bnet_plugin
├── chain_api_plugin
├── chain_interface
├── chain_plugin
├── db_size_api_plugin
├── faucet_testnet_plugin
├── history_api_plugin
├── history_plugin
├── http_client_plugin
├── http_plugin
├── login_plugin
├── mongo_db_plugin
├── net_api_plugin
├── net_plugin
├── producer_api_plugin
├── producer_plugin
├── sql_db_plugin
├── template_plugin
├── txn_test_gen_plugin
├── wallet_api_plugin
└── wallet_plugin

EOS 프로그램의 기능은 실행 시점에 어떤 플러그인을 로드하는가에 따라 결정된다. 가장 기본적인 기능조차 전부 플러그인으로 분리되어 있으며, 사용자는 자동 로딩되는 기본 플러그인 외에 --plugin 옵션이나 config.ini 파일에 플러그인 항목을 추가하여 기능을 확장할 수 있다. 각 플러그인에 대한 설명은 개발자 문서에서 확인할 수 있다.

Programs

programs/
├── cleos
├── eosio-abigen
├── eosio-launcher
├── keosd
└── nodeos

EOS에서 제공하는 프로그램의 소스 코드가 포함된 경로이다. nodeos , keosd 의 경우 실제 기능은 플러그인으로 구현되어 있으므로 기술된 내용이 많지 않다.

Tools

EOS에서 사용하는 도구들이 포함되어 있다. ctest , gcov 등 테스트용 도구를 제외하면 사용자가 살펴볼만한 파일은 스마트 컨트랙트 컴파일에 사용하는 eosiocpp 이다. 실제 디렉토리 안에는 eosiocpp 의 원본 파일인 eosiocpp.in 이 있다. 빌드 중에 파일 내 환경 변수를 수정하여 eosiocpp 를 생성한다.

Contracts

블록체인 상에서 동작하는 스마트 컨트랙트의 코드를 모아 놓은 곳이다. 개별 컨트랙트에 대해서는 별도의 글에서 다룰 예정이다.

이번 글에서는 프로젝트의 개괄적인 구조를 살펴보았다. 다음 글부터는 코드 레벨에서 EOS의 작동 원리를 파헤쳐 보자.

--

--