다자간 상대매매를 스마트 컨트랙트로 구성할 수 있을까?
비상장주식과 거래 방법
비상장주식은 상장요건에 다소 미달하거나, 상장요건은 갖추었으나 회사의 사정에 의해 기업공개(IPO)를 하지 않아 거래소 및 코스닥 시장에 상장되지 않은 주식을 말한다 (출처: 유안타증권). 비상장주식의 거래는 크게 플랫폼, K-OTC(장외주식시장), 커뮤니티 게시판을 통해 이루어진다. 공식적으로는 플랫폼과 K-OTC를 증권계좌와 연계하여 계좌이체를 통해 거래하도록 되어있다.
@그림 1 : 비상장주식 거래 방식 비교 - KVIC
위의 그림을 보면, 비상장주식을 거래하는 방식은 크게 일대일 상대매매 또는 다대다(다자간) 상대매매로 구분된다.
일대일 상대매매
- 종목을 팔고자 하는 사람과 사고자 하는 사람이 일대일로 수량과 가격을 협의하여 거래
다자간 상대매매
- 종목에 대한 수량과 가격을 제시하고, 매도 호가와 매수 호가가 일치하는 경우 일치하는 수량 범위 내에서 자동으로 거래가 체결
- 동일 가격의 호가가 존재하면, 먼저 호가가 접수된 경우부터 진행
- 가격이 일치하지 않으면, 체결을 원하는 투자자가 상대호가를 보고 자신의 호가를 정정
위의 글에서 알 수 있듯이, 다자간 상대매매는 현재 증권 시스템에서 사용하고 있는 일반적인 거래 방식을 의미한다. 일대일 상대매매는 다른 표현으로 게시판 거래라고도 말하는데, 구매하고자 하는 종목을 발견하면, 구매 가능한 수량과 가격은 두 거래 당사자가 협의하고 정하기 때문이다.
다자간 상대매매
다자간 상대매매를 조금 더 이해하기 쉽게 그림으로 표현하면 아래와 같다.
@그림 2 : Alice와 Bob이 각각 월리전자 주식을 매도 신청
위의 그림에서 가운데는 월리전자라는 주식의 현재 매도 또는 매수 요청된 내역을 보여준다. Alice는 1주당 11000원의 가격으로 2주를, Bob은 1주당 10000원의 가격으로 3주를 매도신청한 상태이다.
@그림 3 : Chris가 월리전자 주식을 매수 신청
Chris는 10000원으로 매도 신청 되어있는 월리전자의 주식 3주를 매수 신청한다. 그러면 10000원에 매도 요청되어 있던 상품은 모두 매수되어 없어진다.
@그림 4 : Alice가 월리전자 주식을 매수 신청
10000원에 월리전자 주식을 매도한 Alice가 갑자기 오르기 시작하는 주식 가격을 보고 무지성 매수를 다시 하기 시작했다고 하자. 11000원에 매도 요청되어있는 주식 중 1개만 우선 구매하기로 가정했다고 하자. 그러면 위와 같이 11000원에 매도 요청되어있는 주식 중 Alice가 요청한 1주에 대한 매수만 이루어지며, 이전에 Bob이 매도요청한 2개 중 1개는 계속 남아있게 된다.
@그림 5 : Chris가 월리전자 주식을 매도 신청
Chris가 이익을 남기고자 10000원에 구매한 월리전자 주식 3주를 모두 12000원에 매도 요청한다. Alice는 또 다시 무지성 매수를 하기로 마음먹고 12000원에 총 4주를 매수하고자 한다. 하지만 12000원에 형성되어 있는 주식의 총 개수는 3개이므로, Alice는 우선 3주만 매수가 확정된다.
@그림 6 : Bob이 월리전자 주식을 매도 신청
이후 Bob이 본인이 11000원에 매도 신청했던 내역을 취소하고 12000원으로 정정하여 매도를 신청한다. 그러면 이전에 매수신청을 했던 Alice의 차례가 왔을 때, 해당 주식이 매수처리된다.
위 그림들을 정리하여 다자간 상대매매 방식을 요약해보면 아래와 같다.
- 매도자와 매수자 간 원하는 가격이 일치하는 경우 거래가 발생한다.
- 해당 가격대에 형성된 매도 요청 수량보다 매수 요청 수량이 작거나 같으면, 매수 요청한 수량만큼 거래가 발생한다.
- 해당 가격대에 형성된 매도 요청 수량보다 매수 요청 수량이 많은 경우, 거래 가능한 매수 요청 수량만큼 매수가 발생하고 남은 개수는 추가적인 매도 요청 수량이 들어왔을 때 순차적으로 완료된다.
스마트 컨트랙트로 구현할 수 있을까?
결론부터 말하면, 가능하다. 거래가 발생할 수 있는 중요도 순으로 정리해보면 아래와 같다.
- 거래하고자 하는 종목
- 매도 또는 매수하고자 하는 가격대
- 매도 또는 매수하고자 하는 주식량
중요한 것은, 스마트 컨트랙트로 구현하게 될 경우 토큰 증권화 된 주식과 이를 1:1로 거래하기 위한 별도의 유틸리티 토큰(이더리움의 경우 일반적으로 ERC-20으로 이루어진)이 필요하다. 만약 유틸리티 토큰의 종류가 K은행토큰, S은행토큰과 같이 여러개라고 가정하자. 그렇다면 1과 2 사이에 토큰 증권화 되어있는 주식을 거래할 수 있는 유틸리티 토큰의 종류가 포함되어야 할 것이다. 위의 중요도 순으로 맵을 구성하여 토큰 증권 별 형성된 거래 내역을 정리하면 될 것이다.
1. 순차적으로 거래되어야 하는 조건
하지만 가장 중요한 점이 있는데, 다자간 상대매매는 순차적으로 거래된다는 것이다. 맵은 순서를 보장하지 않는다. 그렇다면 사용할 수 있는 방법은 리스트(LinkedList)일텐데, 아쉽게도 솔리디티에서는 이를 지원하지 않는다. 그렇다면? 별도로 만들어서 사용해야 할 것이다.
하지만 솔리디티는 함수 내에서 진행되는 코드의 라인별로 gas를 측정한다. 퍼블릭이 아닌 프라이빗 환경에서 Quorum과 같은 플랫폼으로 이더리움을 구성하면 gas는 무시되기도 하지만, 그렇다고 해도 이더리움이 자체적으로 너무 많은 gas를 소모하는 경우에 프로그램을 정지시키기도 한다. 이러한 경우 수많은 거래 내역을 순차적으로 돌아다녀도 일치하는 거래 조건을 찾지 못하게되면 프로그램은 정지될 수 있다.
2. 프로그램이 정지될 확률이 존재하는지 확인할 필요
그렇기 때문에 루프가 어느정도까지 돌았을 때 프로그램이 정지할 수 있는지에 대한 선행 학습이 필요하다. 그 이후에 거래 전 미리 정지될 확률을 확인하고 거래를 진행하는 것이 좋다. 이를 위해서는 해당 토큰증권을 특정 유틸리티 토큰으로 거래하기 위해 요청된 전체 내역의 수를 각각 가지고 있는 것이 좋다.
3. 스마트 컨트랙트로 개발할 경우의 이점은?
우선, 토큰증권을 적용할 수 있는 플랫폼은 상식적으로 퍼블릭 환경에서 구성되지 않을 가능성이 높다. 이미 금융위원회의 보도자료에서도 보면, 퍼블릭 형태의 블록체인이 아닌 여러 협의체가 함꼐(컨소시움 형태로) 노드를 구성하는 프라이빗 블록체인의 형태를 지향하고 있음을 볼 수 있다.
그렇다면 블록체인은 100% P2P 거래방식보다는, 별도의 인증된 어플리케이션에서 트랜잭션을 발생시키고, 이를 블록체인으로 2차 전달할 가능성이 높다. 굳이 빈번하게 발생하는 거래를 모두 블록체인에서 처리하기보단, 어플리케이션에서 이를 1차 처리하는 방법이 속도면에서는 더욱 유리할 것이다.
하지만 현재 장외시장거래의 특성상 거래가 빈번하지 않음을 고려한다면, 스마트 컨트랙트로 다자간 상대매매를 진행하는 이점이 없다고만 할 수는 없다. 스마트 컨트랙트를 통해 배포된 프로그램은 임의로 조작하거나 재배포할 수 없기 때문에, 그 자체로도 부정적인 공격 또는 위변조로부터 보호받을 수 있다. 완전하진 않지만, 컨소시움으로 구성된 협의체 간은 공유되는 내용이기 때문에 어느 한 협의체에서 이를 임의대로 조작할 수도 없다.
스마트 컨트랙트로 구성하는 것이 가장 불편해지는 상황은 바로 ‘속도(TPS)’이다. 단순히 트랜잭션 하나 당 처리되는 시간이 아니라, 시간 별로 처리(블록체인의 블록에 confirm되는)되는 시간이 더 빠르게 요구될 수록 블록체인은 사용성이 매우 낮아진다. 일반적인 증권거래에서는 아직 블록체인을 100% 활용할 수 없는 가장 큰 이유인데, 장외시장의 경우에는 거래량이 크지 않기 떄문에 블록체인만을 가지고 거래를 할 경우 어떠한 또 다른 이점이 있는지 확인해볼 수 있는 좋은 기회가 될 수 있을 것이라고 본다.