트래커 만들기:RDBMS 연동을 위한 플러그인 제작

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

개발 일지를 통해 트래커 만들기를 주제로 연재를 진행하고 있습니다. 지난번 포스팅에서는 ‘트래커 만들기: Plugin의 역할/ 구조 알기’를 소개해드렸으며 이번 포스팅에서는 트래커 만들기 연재 그 두번째로,‘RDBMS 연동을 위한 Plugin 제작’방법에 대해 알아보겠습니다.

개발을 시작한 이유?

EOSIO는 eosio::mongo_db_plugin 이라는 MongoDB를 이용한 블록체인 데이터 저장 방법을 제공하고 있습니다. 트래커 제작에 있어서 이를 이용하면 블록 데이터를 노드가 아닌 MongoDB를 통해 조회해 볼 수 있습니다. 그런데, 왜 굳이 시간을 들여 MySQL DB를 이용한 플러그인을 별도로 제작하려고 했는지 궁금하실 수 있을 겁니다.

MongoDB는 직관적이고 Flexibility가 좋아 어떤 데이터라도 저장할 수 있는 장점이 있습니다. 하지만, DB 특성상 JOIN이 없기 때문에 데이터를 원하는 대로 나누고 필요한 데이터만 retrieve 하여 쓰기에 불편합니다. 또한, B-Tree Index를 사용하여 데이터의 크기가 커질수록 새로운 데이터를 입력할 때 성능이 저하되는 단점을 가지고 있습니다.

MongoDB가 데이터를 넣어두고 정보를 조회하는 데에는 적합하다고 할 수 있지만 현재 2,400만 개의 블록과 수억 개의 action 데이터를 앞으로도 계속 입력받는 데에는 적합하지 않으므로 SQL 계열의 DB를 사용하기로 결정하게 되었고 특히, 웹서비스 등에서 널리 사용되고 있는 MySQL DB를 사용할 수 있는 MySQL 플러그인을 제작하게 되었습니다.

궁극적으로 위와 같은 구조의 시스템을 고려하였으며 별도 DBMS를 구축하여 플러그인으로부터 저장된 데이터를 웹, 모바일, 콘솔 등을 이용해 다양하게 사용할 수 있도록 하는 데에 이 플러그인 개발의 목적이 있습니다.

MySQL Plugin생성하기

이전 글에서 소개한 바와 같이 EOSIO/plugins 디렉터리 밑에 eosio-make_new_plugin.sh 를 이용하여 새로운 플러그인 디렉터리와 기본 파일을 생성합니다. 이름을 지정하지 않으면 기본 템플릿이 생성되어 2번 작업할 수 있기에 맞는 이름을 부여해서 생성합니다.

새로 생성한 플러그인은 eosio/plugins 아래 있어도 되지만 가능하면 eosio 소스 외부에 위치하기를 권합니다. eosio 1.2.x 버전부터는 eosio의 외부에 있더라도 같이 빌드 될 수 있는 옵션이 마련되어 있으므로 여러가지 환경을 고려할 때 외부에 두는 것을 권합니다.

위와 같이 플러그인을 만들고 난 후 빌드를 하면 기본 준비는 마치게 됩니다. 아래는 빌드 하는 방법입니다.

EOS 1.2.x 이후

EOS 1.2.X 이전

MySQL Plugin 구성

트래커 제작에 필요한 데이터를 DB에 저장하기 위해서는 table 들을 정의하여 생성해야 합니다. 필요한 테이블 이름들은 다음과 같습니다.

자세한 테이블 스키마는 공개된 github소스를 참고하기 바랍니다.

소스: https://github.com/eosBLACK/eosio_mysqldb_plugin

account_table, actions_table, blocks_table, transactions_table을 각각 class로 만들어 각 class의 method를 이용해 처리하도록 합니다. 아래 소스는 mysql_db_plugin_impl 클래스의 init function의 내용이며 db connection 및 event를 통해 수신한 데이터들을 처리할 thread를 생성하여 초기 셋팅에 필요한 작업을 수행합니다.

이제 이전 포스팅에서 소개한 바와 같이 노드로부터 데이터를 받아오는 이벤트를 아래와 같이 설정합니다.

설정한 4개의 signal들을 각각 아래와 같이 function들과 연결(connect)해 주면 각각의 이벤트에 맞는 데이터를 수신하게 됩니다.

모든 데이터를 다 저장하면 완벽한 History가 되겠지만, 데이터 용량도 걱정해야 하므로 irreversible block에 저장된 데이터만 SQL DB에 저장하기로 합니다. 만약, block에 들어간 데이터만을 처리하고자 한다면 accepted_block 이벤트와 irreversible_block 이벤트만 받아도 됩니다.

글을 쓰는 시점에서 EOSIO 메인넷의 전체 block 수는 2,400만 개를 넘었습니다. EO0SIO의 구조는 Block:Transaction = 1:n으로, 다시 Transaction:action = 1:n으로 구성됩니다. 또, action은 inline action들이 줄줄이 달려 있으므로 action 데이터의 크기는 블록 개수의 몇배가 됩니다. 실제로 한 block에 1,000개가 넘는 transaction이 포함되어 있는 경우가 있으니 각 Transaction에 어마어마한 action이 포함되어 있을 것이라는 것은 쉽게 상상할 수 있을 겁니다.

이런 이유로 applied_transaction 이벤트에서 transaction_trace 정보와 action 정보를 처리하도록 구성하였습니다.

여기까지 소스를 기반으로 mysql db plugin의 구성에 대해 설명하였습니다. 세부적인 내용은 본 문서를 바탕으로 소스를 참고하기 바랍니다.

소스를 빌드하고 실행해 봅니다.

마치며

이제 트래커 제작을 위한 블록 데이터를 가져올 준비가 되었습니다. 다음 포스팅에서는 실제 노드를 호출하고 블록 데이터를 가져와서 DB에 저장하여 트래커에 활용하는 방법에 대해서 설명 드리도록 하겠습니다.

감사합니다.

eosBLACK 팀 드림.

eosBLACK Contact:

eosBLACK Homepage 
eosBLACK Koreos 
eosBLACK Medium
eosBLACK steemit
eosBLACK Naver Blog
eosBLACK Facebook
eosBLACK twitter
eosBLACK Telegram(Korean) 
eosBLACK Telegram(English)

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