[거래소 만들기 1-1] 블록체인에서 어떻게하면 빠른 입금출금여부를 알수있을까?

in #ethereum2 years ago (edited)

개인적으로 가상화폐 거래소개발에 관심이 많다.
최초 공부하면서 거래소를 만들고 github에도 오픈소스로 공개한적도 있고,
https://github.com/coinext/silverstring-exchange

그 이후에도 어떻게 업비트나 코인원,바이낸스는 그많은 사용자, 트래픽을 처리하도록 거래소를 만들었을까? 라는 생각을 하며,
아이디어를 짜내기도 했다.

사실 오픈소스로 공개한 거래소 오픈소스는 길라잡이용의 초기 버전이였다. 해당 소스로 상업용으로 사용할수있다고는 처음부터 생각을 하지 않았고, 그 코드를 보면서 누군가 더 발전하고 아이디어가 생겼으면 하는 바램이 컸다.

얼마전부터, 다시 현재까지 공부하고, 연구한 기술,아이디어를 바탕으로 한번 거래소를 다시 만들어보자라는 결심을 했고, 1인 개발 프로젝트를 시작하였다.
프로젝트명 : yongjun-exchange 이다. 첫째아들이름을 땄다. 나는 항상 프로젝트를 하면, 내 가족이름을 딴다.
후에 ,유명해지거나, 오픈소스로 널리 알려질때, 마치 훈장같은 느낌이다.

우선 프로젝트는 서브프로젝트로 3가지로 나눴다.

  1. 가상화페 입출금내역 기능
  2. 트래이딩 매칭 기능
  3. 사용자 UI - 거래소 화면 기능

위와 같이 3개의 서브 프로젝트로 나눴고, 1번 프로젝트를 진행했다.
우선 결과물로 만든 서비스 링크는 아래와 같다.
https://cryptosherlock.me/

거래소 기능중에는 가상화페를 입금받고, 해당 가상화페를 출금해주는 기능이 매우 중요하다. 모든 거래의 출발점은 입금에서 시작하고 , 출금을 끝난다. 주식도 마찬가지다. 주식같은경우는 은행 계좌를 조회하면 쉽게 입금출금내역을 알수있고, 그에 따라, 처리를 해주면 쉽겠지만, 가상화페의 입금출금내역을 알기위해서는 블록체인 노드에 연결해서 직접 트랜잭션을 뒤져야한다.
하물며, 블록체인의 종류와 계정 방식(UTXO, ACCOUNT등)과 블록체인 노드에서 제공하는 API등도 모두 다르기 때문에 그에 맞추어 맞춤형으로 개발을 해야하는게 번거롭고, 힘이든다. 그리고 이걸 유연하고 쉽게 개발하는게 기술인것이다.

입출금 기능을 개발할때는 아래와 같이 해야 유연하게 개발을 할수있다.

  1. [각각의 블록체인에서 제공하는 노드 API <-------------> 해당 트랙잭션을 바탕으로 입출금내역을 조회하는 비즈니스로직]
    위의 두 연결구간에는 스탠다드한 기준을 만들고, 정형화된 인터페이스를 만들어서 블록체인이 어떤것이든, 그 트랜잭션의 형태를 정형화 시켜야 한다는것이다. (쉽게 말해, 인터페이스를 통해 같은 형태(DTO)의 데이터로 만들어 놓고 시작해라 라는 말)

  2. 이렇게 인터페이스화된 트랜잭션 데이터는 비트코인이던 이더리움이던 같은 형태의 트랜잭션 데이터DTO로 변환된 상태기 때문에 그 이후의 비즈니스 로직은 거의 동일하게 작성이 가능하게 된다. (물론 100% 같을수는 없지만, 상이한 부분이 최소화됨)

  3. 그럼 이 트랜잭션 데이터를 가지고 거래소 사용자가 입금주소에 이더리움을 입금했을때, 그걸 빠르게 알아차리고, 해당 입금에 대한 내역을 거래소에 남기고, 입금처리를 하게 할수있을까?

블록체인은 탈중화화된 노드들에 의해 합의알고리즘을 거쳐 매초, 매분마다 블록이라는 트랜잭션들의 묶음 데이터를 만들어 낸다. 그 트랜잭션의 묶음 데이터 즉 블록안에는 누가 어디로 몇개의 코인을 입금했는지, 출금했는지에 대한 내역이 존재한다.

우리는 이 매번 생겨나는 블록을 트래킹하여, 입금주소에 입금된 주소와 코인갯수를 알아내서 사용해야한다.
데이터는 매번 생겨나고, 흘러가는 스트림 데이터라고 생각하는게 맘이 편하다.

데이터베이스에 남겨져있고, 파일쓰기로 하드디스크에 남겨져있는 정적데이터가 아닌, 매번 생겨나고, 해당 데이터는 과거의 데이터가 되버리는 스트림 데이터다. 이것을 실시간으로 트래킹을 하면서 입출금내역을 찾아내야한다.

그 내역을 찾아내는 웹어플리케이션은 실시간으로 트래킹을 해야하며, 만약 문제가 생겨 웹어플리케이션이 중단되거나, 블록체인노드 서버가 중단되는등의 예외가 생겼을때도 트래킹하지 못했던 블록들은 문제없이 트래킹을 다시 해야하며, 그것과 상관없이 매번 실시간으로 생거나는 블록도 트래킹을 해야한다.

그리고 가장중요한, 블록체인의 특성인 컨펌수에 따라 그 입출금내역이 불변하고 완벽한 내역인지에 대한 상태를 판단하고 해당 트랜잭션을 사용해야한다.
(블록체인의 최근에 생겨나는 블록은 언제나 불변이고, 보장되는 안전한 블록이 아니다. 블록자체가 합의알고리즘에 의해 생겨나는 것이기에, 합의를 수행하는 노드들의 단합이나, 카르텔등등의 여러 변수등으로 인해 최근의 생겨난 블록을 버리고 다른 블록을 최근의 블록으로 인정,합의해 버리는 경우가 발생할수있기때문에, 최근에 생성된 블록에 존재하는 트랜잭션 거래내역을 바로 사용하는건 보안상 위험하다. 그래서 일반적으로는 최근 블록생성되고, 몇블록이 그 뒤로 생성된 시점에 해당 블록의 데이터를 사용하는것이 안전하다, 이 최근블록과 내가 사용할 블록의 갯수차이가 몇블록 난 시점에 내가 사용할 블록의 데이터를 사용하겠다라고 하는 개념이 컨펌이다. (최근블록의 높이 - 내가 사용할불록의 높이)

위에 언급한 내용을 바탕으로 실제로 안전하게 입출금내역을 트래킹하는 기능을 구현해 보자.

[다음회에]

Sort:  

Your post was upvoted and resteemed on @crypto.defrag