본문 바로가기

MY어플리케이션

[자작] 암화화폐 거래소 - Silverstring

암호화페 거래소 개발은 정말 어려운 개발이다.

 

GIT : https://github.com/coinext/silverstring-exchange

 

암호화페 특히 비트코인, 이더리움에 대해서 정말 많은 관심이 있었을때가 있다.

특히 이더리움의 오픈소스를 하나하나 분석하며 본적이 있는데, 이더리움은 코드에서도 진정성이 느껴졌다.

다른 알트코인들의 돈벌려고 혈안이 되는 듯한 느낌을 이더리움의 오픈소스 코드에서 볼수없었다.

하나하나 문제들에 대해서,

개념을 정리하고 해결책을 코드로 구성한 부분, 고민한 부분이 그대로 코드에 녹아있었다.

 

비트코인, 이더리움의 블록체인을 이해한 시점에서 암호화페 거래소 한번 토이 프로젝트로 만들어볼까? 하는 생각이 들었고,

이내 실행에 옮겼다.

거래소 이름은 SilverString (은실), 와이프에 대한 사랑의 표현이라고 할까? ㅋㅋ...

 

가장 어려웠던부분은 블록체인을 읽고, 입금,출금을 처리하는 로직이였다.

특히 이더리움에서 erc20의 스마트컨트랙트로 작성된 토큰들의 입출금은 트랜잭션 데이터를 이해를 해야 만들수있었기 때문에,

많은 시간이 들었다.

 

또하나 어려웠던 부분은 거래체결 로직이였다.

이부분은 git에 올라가 있는 코드로는 대용량의 처리가 되지않는다.

개발하고 나서, 고민을 좀더 하는 시간을 가졌고,

얼마의 시간이 흐른후,

거래체결의 로직을 문제를 해결할수있었다.

(정말 이부분에 대해서, 고민을 많이 했던것 같다.. 토이프로젝트에서 이렇게 고민한것도 오랜만이다!!)

 

거래체결을 순수하게 디비의 락을 이용해서 처리를 했는데,

동시성 문제로 인해, 대량처리가 불가한 부분이 있었다.

동시성을 디비에 의존했기 때문의 결과이다.

 

이부분은 레디스 + 레디스 그루비 스크립트(트랜잭션)을 이용하는 방법으로 개발하였고,

디비 처리도, 건건의 거래를 처리하게되면, 같은 유저의 같은 지갑에 업데이트를 동시에 해야하는 케이스가 늘어나기 때문에,

최대한 유저단위의 거래를 묶어서 한번에 처리하도록 하는 알고리즘으로 해결할수있었다.

 

마치,

게임에서 프레임에 따른 드로잉을 update함수에서 시간 간격으로 한번에 그리듯(드로잉콜),

거래체결 또한 짧은 시간의 마이크로배치와 같이 동작하게 만들고,

그 배치에서 처리할 거래들을 최대한 유저/코인 단위로 그루핑을 하여 한번에 처리하고,

디비에는 업데이트를 최소화하는 방법을 사용하였다.

또한 레디스에서 처리를 메인작업으로 우선시하고, 디비는 레디스의 결과를 after write방식이라고 하나??..

비동기적으로 동기화하는 방법을 사용하여 퍼포먼스를 극복하고, 데이터의 정합성을 맞추었다.

 

이런부분은 하이버네이트 2차캐시로 훨씬 심리스하게 동작하게 설정하여 사용할수있었다.

(직접 구현하면, 너무 복잡해져...)

 

그리고 KYC와 계정에 대한 처리 (비밀번호 찾기, 아이디 찾기, 비밀번호 변경)는 어렵지는 않았지만,

너무 귀찮은 개발이였다.

이부분은 SNS로그인을 활용하고, KYC는 텔레그램 passport를 활용하면 좀더 나을듯하다.

 

그리고 거래체결에 따른 시장가의 계산은, esper를 이용하였다.

1분단위 체결가를 이벤트로 esper로 pub하여 넘기고,

esper에서는 해당 이벤트를 sub하여, 1분단위 평균가를 계산하여 콜백하도록 만들었고,

해당 데이터를 데이터베이스에 저장하고, 그 데이터를 화면에 출력하도록 하여, 거래 체결가를 보여줄수있게 했다.

(아..esper없었으면, 정말 슬라이딩 윈도우에 따른 평균값 구하는것...개발..끔찍하다..ㅠ)

 

암호화폐 거래소를 직접 만들어보니,

거래소의 기술은 대용량, 실시간 처리의 끝판왕 개발 같다.

모든 기능을 실시간, 대용량 처리의 관점에서 생각을 하여야 안정적인 거래소를 만들수있기 때문이다.

(안그러면...거래소 바로 트래픽으로 마비..)

 

개인적으로 실력이 한단계 올라갈수있었던, 질좋은 토이 프로젝트 경험이었다고 생각한다.

개인적으로 깃헙에 오픈소스로 올린 프로젝트중에, star 93개, fork 87개 !!!! 가장 반응이 뜨거웠다, 좋았다.