본문 바로가기

MY어플리케이션

[자작] 블록체인 모니터링 서비스 - Crypto-Sherlock

한때 블록체인 기술에 엄청나게 심취한적이 있다.

 

데모 : https://cryptosherlock.super100.app/

 

P2P 컨세서스 협의 알고리즘이나, 스마트컨트랙트, 제로날리지등 생소한 기술들을 하나하나씩 알아가는게 희열이 느껴졌다.

지금의 AI기술을 사용하는 느낌이랄까..

 

특히, 흥미롭게 다가왔던점은, 신뢰할수없는 환경에서 신뢰를 만들어가는 기술이라 더욱 빠져들었다.

(마치 무에서 유를 창조하는 기술로도 느껴졌기에)

 

블록체인쪽은 한동안 깊게 팠어서, 정말 우리나라에서는 나만큼 많이 아는 사람도 없을껄? 이라는 생각도 가진적 있긴 했는데...

이제는 AI로 메타가 넘어갔으니.. 아쉽긴하다. (세월이 야속하구나...)

 

암튼, 블록체인에 엄청 심취하던 시기에 문득, 아이디어가 생각나서, 블록체인 모니터링 서비스를 만들었다.

이름하여 "크립토 셜록홈즈" :)

 

서비스의 목적은,

특정 지갑의 입출금을 모니터링하고, 해당 입출금이 발생했을때, 텔레그램으로 알림을 받을수있는 서비스이다.

비트코인, 이더리움등 암호화페에서는, 소위 고래라는 많은 코인을 가지고 있는 사람들의 행위(입금/출금)가 상당한 가격 변동의 지표로 사용하고 있기에.. 고래들의 암호화화폐의 지갑을 종종 사람들은 수시로 확인하며 입출금내역을 모니터링하곤 한다.

 

이런 모니터링을 서비스로 만들면 어떨까? 라는 아이디어에서 해당 서비스를 만들게 되었다.

 

단순한 화면이라고 생각할수있지만,

해당 블록체인에서 특정 주소의 입금출금 트랜잭션을 추적하는건,

블록체인 구조를 굉장히 잘 파악하고 이해하고 있어야 가능한 개발이라고 생각한다.

 

일주일정도의 밤샘작업으로 만들었던 기억이 있다.

개발중에 특히 어려웠던부분은 블록체인은 하나의 스트림과 갔다.

시간이 지남에 따라 새로운 블록데이터를 지속적으로 만들고 기다려주지않는다.

이런 블록데이터를 지속적으로 따라가며, 데이터를 해석하고 그 트랜잭션안에서 입금,출금 데이터를 뽑아내는 작업이 난이도가 높았다.

그리고 그 블록데이터를 지속적으로 따라가지 못하는 상황..갑자기 서버가 내려가거나, 서비스에 문제가 있어서 멈추었을때,

분석하지못한 블록들을 빠르게 따라가며 분석을 해야하는 부분에 대한 아이디어 또한 있어야 했다.

 

그 아이디어는 이렇다.

 

투트랙 플랙을 세웠다.

2개의 잡을 만들었다.

1) 현재기준으로 블록을 따라가면서 분석하는 잡.

2) 마지막 블록기준으로 블록을 따라가면서 분석하는 잡.

 

1번 잡은 서비스가 시작/재시작할때, 항상 가장 최근의 블록부터 빠르게 따라가도록 구현하였다.

현재 생성되는 블록의 분석을 우선시 하면서 모니터링에 딜레이가 최대한 없도록 하기위한 전략이다.

 

2번 잡은 서비스가 중지됬던 시점에 블록부터 1번잡이 시작할때 처리하기 시작한 블록 그 사이의 블록을 분석하는 잡이다.

중지되었던 사이의 블록을 별도의 잡으로 분석하도록 하여, 분석의 빠짐이 없게 만들었고, 분석의 성능도 끌어올렸다.

(이부분은 해당갭의 블록들을 여러개의 조각으로 슬라이스해서 멀티 스레드로 나눠서 분석/구동하여 좀더 빠르게 처리를 하도록 만들었다.)

 

이렇게 2트랙의 분석잡을 구현함으로써, 실시간으로 만들어지는 블록의 데이터를 지연없이 빠르게 분석하여 모니터링할수있게 만들었다.

(이부분이 이 서비스의 개발에 킥이라고 본다!!!)

 

그리고 팁하나, 블록체인 노드를 직접 운영을 해야, 블록체인 데이터를 받을수있다.

하지만 노드를 토이 프로젝트에서 운영을 하기는 너무 서버 자원이 많이 들었다.

이더리움, 비트코인 노드만 운영하려해도, 블록데이터가 어마어마하기 때문이다.

이런 경우 대부분은 이런 노드를 대신 서비스해주는 서비스들을 사용하게 되는데, https://www.infura.io/  가 특히 유명하다.

이런 서비스는 구독서비스지만, free티어도 제법사용하기 좋다. 하지만, 트래픽 제한이 있기때문에 24시간 데이터를 받으면 트래픽 제한으로 사용 제한이 걸리게된다. 

 

이부분은 여러 계정에서 API키를 발급받아서, 자체 키 클러스터를 구성해서 트래픽을 더 사용/받을수있게 했다.

키 클러스터라고 하니 거창하지만,

val index = 0

val keys = listOf("api키", "api키", "api키")

val key = keys[(index++) % keys.size]

key이용해서 infura의 블록체인 정보조회 API 호출하고 사용!!!

 

키를 여러개 받고, 모드연산으로 라운드로빈 방식으로 api키를 돌려가면서 사용하게 하여,

트래픽을 api갯수배만큼 더 사용할수있게 만들었다. (이놈의 잔머리..)