트래커 만들기:Plugin의 역할 / 구조 알기

안녕하세요. eosBLACK 팀입니다.

이번 4번째 개발일지는 eosBLACKK팀에 있어서 조금은 뜻 깊은 내용으로 작성하고자 합니다.

eosBLACK에서 개발한 MySQL 플러그인이 EOSIO개발사인 블록원의 개발소스 공유 페이지 깃허브(Github)에 등록되었습니다. 이로써 eosBLACK은 이오스(EOSIO)의 컨트리뷰터(Contributor)로 참여하게 되었습니다. 참고로 eosBLACK이 개발한 MySQL 플러그인은 eosio에 소개된 플러그인 중 아시아에서는 최초이자 전 세계에서는 5번째로, eosBLACK팀의 개발력을 공식적으로 인정 받은 것으로 생각되며, 그 의미가 남다르다고 생각됩니다..

이번 포스팅은 eosBLACK 개발한 MySQL 플러그인을 활용하여 ‘트래커 만들기’ 라는 주제를 가지고 3부에 걸쳐 연재할 예정입니다. 이번 연재를 통해 EOSIO 소프트웨어의 구조에 대한 이해가 조금 더 넓어지는 계기가 될 수 있지 않을까 기대하며 오늘은 첫 번째로 EOSIO Plugin의 역할은 무엇이며 어떤 구조로 되어 있는지 알아보도록 하겠습니다.

Plugin이란?

개발자분들은 대부분 익숙하고 거부감 없이 쓰는 용어이지만 간단히 설명하고 넘어가도록 하겠습니다. 컴퓨팅에서 플러그인은 기존 기능에 특정 기능을 추가하는 소프트웨어 구성 요소입니다. 우리가 가장 잘 알고 있는 플러그인으로는 웹 브라우저에서 흔히 볼 수 있는 Adobe Flash Player가 있겠네요. 즉, 플러그인은 메인 프로그램에 어떤 특정 기능을 사용할 수 있도록 추가하는 소프트웨어를 말합니다.

EOSIO Plugin의 역할

하지만, EOSIO에서 플러그인은 메인 소프트웨어이자 특정 기능 추가의 역할까지 합니다. EOSIO의 nodeos를 들여다보기 위해서 ‘eosio/programs/nodeos’경로를 보면 ‘main.cpp’파일 한 개만이 들어있을 뿐입니다. 이 파일을 열어 살펴보면 EOSIO의 온갖 플러그인이 나열된 것을 보실 수 있습니다. 즉, 모든 기능을 plugin으로 구조화/모듈화를 한 것이라 볼 수 있습니다. main.cpp의 main() 함수를 훑어보면 무슨 말인지 금방 이해가 갈 것입니다.

위 코드에서 보듯이 main() 함수에서는 플러그인들에 대한 initialize 작업을 합니다. 필수 플러그인으로 알려진 chain_plugin, producer_plugin을 비롯해 http_plugin, net_plugin 등이 기본으로 초기화되는 것을 볼 수 있습니다. 이후 app().startup() 구문이 실행되면, 각 플러그인의 startup()이 실행되면서 node가 동작하기 시작합니다.

EOSIO Plugin 맛보기

플러그인의 개발은 친절하게도 EOSIO가 방법을 제시해 주고 있는데, ‘eos/plugin’ 디렉터리 안에 ‘eosio-make_new_plugin.sh’를 이용하여 플러그인 클래스를 생성할 수 있습니다.

위와 같이 쉘 스크립트를 실행하면 아래와 같은 2개의 파일이 $pluginName 과 같은 이름의 디렉터리와 함께 생성됩니다.

$pluginName/include/eosio/$pluginName/$pluginName.hpp
$pluginName/$pluginName.cpp

이 플러그인 템플릿은 ’eosio/plugins/plugin_template’디렉터리 안에 있는 2개의 파일을 copy 한 것들인데 헤더 파일의 내부를 보면 아래와 같습니다.

main.cpp 파일의 code 에서 본 것처럼 plugin_initialize()는 app().initialize() 함수 실행 시에 plugin_startup()은 app().startup() 구문의 실행 시에 실행되는 부분입니다. plugin_initailize() 부분에서는 nodeos 실행 때 받아야 할 parameter 들을 확인하고 처리하는 내용들이 들어갑니다. 다른 plugin들을 참조하면 이해하기가 더 쉬울 텐데요. 예를 들어, mongo_db_plugin 등을 참조하면 좋을 것 같습니다.

구체적인 구현 내용에 대한 부분은 _plugin 클래스가 아닌 _plugin_impl 클래스를 따로 만들어 구현하게 됩니다. 플러그인 개발은 여러 가지 구현 방법이 있겠지만 nodeos로 부 터 나오는 데이터를 이용하는 것을 원한다면 다음의 signal들을 참조하시기 바랍니다.

이 signal 중에서 쉽게 이해할 수 있는 4가지 signal을 위에 표시했습니다. node의 동작 순서대로 하자면 applied_transaction, accepted_transaction, accepted_block, irreversible_block 순서입니다. Transaction의 accept, 블록 생성 accept, 이후 블록이 비가역 블록으로 변환되는 과정에서 나오는 데이터들을 확인해 볼 수 있어서 nodeos에 어떤 기능을 추가하거나 nodeos로 부터 나오는 데이터를 이용하고자 할 때, Plugin 개발을 생각해 볼 수 있습니다.

1.1.x 버전까지는 플러그인이 소스내에 포함되었으나 1.2.x 버전 이후로 plugin은 추가적인(additional) 개발이 되어 빌드 방법도 변경되었고 EOSIO의 소스 내에 포함되지 않습니다. 변경된 빌드 방법은 아래와 같습니다.

EOSIO 1.2.X 이전

플러그인 디렉터리를 EOSIO 소스 내에 생성하고 빌드 스크립트를 아래와 같이 수정하여 포함시켰습니다.

EOS 1.2.x 이후

아래와 같이 eosio_build.sh 파일에 아래 변수 하나를 추가하는 것으로 빌드 준비가 됩니다.

nodeos 실행 시에 플러그인을 포함시키기 위해서는 옵션을 추가해 주면 됩니다.

여기까지 EOSIO 에서의 플러그인 역할과 구조, nodeos에 포함시키는 방법까지 간략히 설명했습니다. 다음 포스팅에서는 실제 플러그인의 제작에 대해서 소개해 보도록 하겠습니다.

감사합니다.

eosBLACK 팀 드림.

eosBLACK Contact:
eosBLACK Homepage
eosBLACK Koreos
eosBLACK Medium
eosBLACK steemit
eosBLACK Facebook
eosBLACK twitter
eosBLACK Telegram(Korean)
eosBLACK Telegram(English)

White Paper (Chinese)
White Paper (Korean)
White Paper (English)

H2
H3
H4
3 columns
2 columns
1 column
Join the conversation now