서비스를 위한 소규모 이더리움 거래소 만들기

Park Juhyung
GoCryptobot
Published in
4 min readApr 15, 2018

소규모 거래소가 필요한 이유
이더리움을 활용한 서비스를 만드는 방법은 2가지가 있습니다. 하나는 모든 로직과 데이터를 스마트 컨트랙트에 담는 방법입니다. 완전히 분산화된 앱을 만드는 거죠. 하지만 이 방법에는 한계가 있습니다. 이더리움의 수수료와 트랜잭션 처리 속도의 문제죠. 액션 한 번에 수 분의 시간이 걸리고, 몇 천원의 수수료를 내는 한계에서 만들 수 있는 건 많지 않습니다.

이런 한계를 우회하기 위한 하나의 방법으로, 서비스 전용의 소규모 거래소를 만들어 쓸 수 있습니다. 이더리움과 서비스 내의 화폐를 서로 교환가능하게 하는 방법입니다. 1 이더를 입금하면 게임 내에서 1 골드를 지급합니다. 반대로 1 골드를 사용하여 1 이더를 받게 만드는 거죠. 이렇게 만들면, 골드와 이더를 교환할 때를 제외하면 수수료를 내지 않습니다. 골드는 일반 디비에 들어있기 때문에 트랜잭션도 매우 빠르게 처리할 수 있습니다.

물론 이 방법은 완전한 해결책은 아니라고 생각합니다. 제일 좋은 상황은 이더리움 망 안에서 빠르고 싸게 트랜잭션을 처리하는 것입니다. 그렇게 돼야 블록체인의 장점인, 분산화와 디지털 소유권이 잘 보장됩니다. 직접 소규모 거래소를 만들게 되면 장점들이 거의 희미해지죠.

하지만, 이더리움의 개발자들 역시 트랜잭션 속도의 한계를 인지하고 있으며, 이를 극복하기 위한 다양한 방법들을 시도중에 있습니다. 이런 극복 방법들이 효과를 얻기 전까지는 직접 소규모 거래소를 만들어서 우회하는 것이 필요합니다.

거래소를 개발하는 데 중요한 부분은 이더를 입금받는 부분과 그 이더를 관리하는 것입니다. 이번 글에서는 그 중 이더를 입금받는 부분에 대해서 이야기합니다.

입금을 받는 방법들

여러 유저들로부터 이더를 입금받는 경우, 몇가지 방법이 있습니다. 첫 번째는 각 유저들이 컨트랙트에 자신의 아이디를 넘기면서 이더를 보내는 방법입니다. 이 방법을 쓰면, 컨트랙트에서 필요한 이벤트를 남길 수 있어서 간단하게 구현할 수 있습니다. 하지만 유저가 이더리움 지갑에 익숙해야하는 단점이 있습니다.

다른 한 방법은 유저들에게 각각 다른 이더리움 입금 주소를 할당해주는 것입니다. 어떤 이더리움 주소에 이더가 들어오면, 해당 주소의 유저에게서 돈을 입금받았다고 처리하는 방식입니다. 이 방식을 쓰면 유저들은 좀 더 쉽고 익숙한 방식으로 이더를 입금할 수 있습니다. 대신, 받는 입장에서는 다양한 주소들로 이더가 들어오기 때문에 이더를 관리하기가 복잡해집니다.

아직은 많은 사람들이 이더리움의 지갑 소프트웨어를 쓰는 걸 어려워 합니다. 또한, 일반 거래소들도 이더리움을 입금할 때 유저별로 이더리움 주소를 할당해주기 때문에 이 방식이 익숙합니다.

이더리움 watch하는 코드 짜기

이더리움이 특정 주소로 들어오는 걸 확인하는 방법은 간단합니다. 한 블록에 있는 모든 트랜잭션의 정보를 읽은 뒤, 트랜잭션의 to가 해당 주소인지 확인하면 됩니다. 한 블록은 보통 10~20초 이내에 생성되고, 한 블록당 많아야 200~300개의 트랜잭션이 들어있습니다. 생성되는 모든 트랜잭션의 정보를 확인하는 건 간단하죠.

좀 더 디테일을 보겠습니다. web3라이브러리getBlock함수가 있습니다. blockNumber를 인자로 받아 블록의 정보를 주는 함수입니다. 이 함수를 사용하여 한 블록에 들어있는 트랜잭션의 해시의 리스트를 얻어옵니다. 그 뒤 getTransaction함수를 통해서 트랜잭션의 세부정보를 가져옵니다. 트랜잭션의 세부정보에는, 받는 사람과 보낸 이더의 양이 적혀있습니다. 이 두가지 정보면 충분합니다.

이 방법을 쓰면 원하는 주소로 이더가 언제 얼마나 들어오는 지 감시할 수 있습니다.

주의할 점

이더리움이나 비트코인에서 블록이 마이닝되었다고 해서 그 블록이 확정되는 것은 아닙니다. 보통 블록이 마이닝 되고 나서 그 뒤에 몇 개의 블록이 더 생성되길 기다리는 게 안전합니다. 따라서 블록의 트랜잭션을 얻어올 때 최신의 블록이 아닌 최신보다 수십블록 이전의 블록을 읽어오는 게 안전합니다. 최신 블록의 넘버는 web3의 getBlockNumber로 가져올 수 있습니다.

또한 이더리움 주소로 입금받을 때 한 가지 더 조심할 점이 있습니다. 유저가 스마트 컨트랙트를 통해서 이더를 입금한 경우, 추적이 힘들다는 점입니다. 이더리움의 RPC 프로토콜에서는 한 트랜잭션이 스마트 컨트랙트를 콜 했을 때, 어디에 어떤 영향을 주는 지 얻어오는 API가 없습니다. web3로 가져오는 트랜잭션 정보에는 함수의 이름과 인자 정도의 정보밖에 없습니다. 따라서 유저들에게 스마트 컨트랙트를 사용하지 않도록 주의를 주어야합니다. 국내의 유명 거래소들도 스마트 컨트랙트를 통한 입금을 지원하지 않고 있습니다.

이상으로 이더리움에서 소규모 거래소가 필요한 상황에 대해서 알아보았습니다. 또한 소규모 거래소를 구현할 때, 이더리움을 입금받는 방법에 대해서도 알아보았습니다.

Link: English version

--

--