KStarCoin SWAP 프로그램 개발기(3) — Ethereum KSC에서 Luniverse KSST로의 전환

토큰 SWAP을 위한 토큰 순환 구조 설계는 끝났습니다. 이제 실질적인 프로그램 구조의 설계와 구현을 할 차례입니다. SWAP 과정은 크게 네 부분으로 나눠서 설계하고 구현했습니다.
하나, 사용자로 부터 Ethereum KSC 입금 받기
특정 사용자가 SWAP을 위해 Ethereum KSC(이하, KSC)를 전송 했을 때, 어떻게 해당 사용자가 보냈는지 확인하여 사용자의 지갑으로 Luniverse KSST(Luniverse Side Token, 이하 KSST)를 전송해 주어야 할 지가 고민이었습니다.
가장 먼저 단순하게 생각했던 방식은 하나의 계정 주소에 입금받는 방식이었습니다. SWAP 용 계정을 하나 만들어서 모든 사용자가 동일한 계정 주소로 KSC를 입금하게 하는 방식이었습니다. 해당 방식을 이용하려면 사용자가 KSC를 전송할 때 본인의 KStarLive 계정 주소를 함께 적어서 보내야 했고, 해당 데이터를 다시 분석해서 어떤 사용자가 보냈는지 확인해야 되는 과정이 필요했습니다. 사용자의 입장에서도 서비스 제공자의 입장에서도 너무나 불편한 방식이었습니다.
그래서 다음으로 생각했던 방식은 거래소에서 많이 사용하는 방식이었습니다. 각 각의 사용자 마다 전용 스마트 컨트랙트 계정(CA)을 발급한 후 해당 계정 주소로 입금 되는 토큰은 계정 주소를 발급 받은 사용자가 입금 했다고 간주하는 방식이었습니다. 그리고 입금이 확인되면 해당 스마트 컨트랙트에 내장되어 있는 sweep 기능을 이용해서 거래소에서 관리하는 계정으로 토큰을 모두 이동 시킵니다.
우리는 해당 토큰을 다시 모으지 않고 소각할 예정이어서 sweep 기능이 필요 없었습니다. 그래서 스마트 컨트랙트 계정이 아니라 일반적인 계정(EOA)을 사용하는 것이 더 좋은 방법이라고 생각했습니다. 계정을 생성하고 프라이빗 키를 폐기해 버리면 해당 계정에 담긴 토큰을 옮기는 것은 불가능하고 소각하는 것은 가능했기 때문에, 보안을 높이면서 우리가 원하는 것을 달성할 수 있었습니다.
둘, Ethereum 상에서 발생하는 KSC 전송 이벤트 캐치
다음으로 전용 계정 주소로 KSC 를 전송 했을 때, 어떻게 인지할 수 있는지에 대해 고민해야 했습니다. 옵션은 크게 3가지 정도가 있었습니다.
- 직접 Ethereum 노드(Geth, Parity 등…)도 운영하고 이벤트도 직접 캐치하여 처리하는 방식
- Ethereum 노드 서비스(Infura, Hexlant 비즈니스 월렛 등…)를 이용하여 노드 운영만 위임하고 이벤트는 직접 캐치하여 처리하는 방식
- Ethereum 이벤트 구독 서비스 (Candelachain CoinManageServer, 이하 Candelachain CMS)를 이용해서 노드 운영과 이벤트 캐치까지 모두 위임하고 캐치 된 이벤트에 대한 정보만 받는 방식
위의 3가지 중 우리가 선택 한 방식은 Ethereum 이벤트 구독 서비스 였습니다. 우선 Ethereum KStarCoin 스마트 컨트랙트를 Candelachain CMS에 등록합니다. 주요 등록 사항은 아래와 같습니다.
- Postback URL : 이벤트가 발생했을 때 메세지를 받아서 처리 할 우리 쪽 서버의 퍼블릭 URL을 등록해야 합니다. (보안을 위해 검증 코드를 포함하고 있어야 합니다.)
- 토큰 컨트랙트 주소 : 등록 된 주소에서 발생 한 이벤트만 캐치하여 보내줍니다.
- ABI(Application Binary Interface) : 프라이빗 키를 노출하지 않고 로컬에서 서명하여 SendRawTransaction을 실행하기 위해서는 토큰 컨트랙트 메소드를 실행하는 bytecode 가 필요합니다. 이것을 제공받기 위해서 ABI를 등록합니다.
- 컨펌 블록 수 : 이벤트가 발생한 후 지정 한 블록 수 만큼 더 쌓여서 트랜잭션의 Finality가 보장되었을 때 지정한 Postback URL로 메세지를 보내줍니다.
그리고 사용자가 전용 계정을 발급할 때 Candelachain CMS에 해당 계정 주소를 등록합니다. 등록 된 계정 주소가 포함 된 이벤트를 캐치해서 Postback URL로 메세지를 보내줍니다. 해당 메세지에는 보낸 이, 받는 이, 보낸 수량 등 토큰 SWAP에 필요한 정보를 담고 있습니다.
셋, 전달 받은 메세지를 분석해서 전송한 KSC 만큼의 KSST를 사용자의 Luniverse 지갑에 전송
위에서 전달 받은 메세지에서 트랜잭션의 상태, 트랜잭션 ID, 컨트랙트 주소, 보낸 이, 받는 이, 보낸 토큰 수량 등의 정보를 가져옵니다. 그리고 우선 중복으로 들어왔는지, 성공한 트랜잭션 인지 등을 체크하여 예외 사항을 처리합니다. 그리고 받는 이의 주소를 확인하여 해당 주소가 우리가 발급한 사용자 전용 계좌 인 경우 해당 사용자의 Luniverse 지갑 주소에 보낸 토큰 수량 만큼을 전송합니다. 이때 전송되는 과정은 우선 Luniverse KSC Pool 에 잠겨 있는 토큰 중 보낸 토큰 수량 만큼을 Eco system 을 위해 할당 된 계정으로 옮겨 유통 시킵니다. 그리고 Eco system을 위한 계정에서 다시 한번 사용자의 지갑 주소로 전송하는 과정을 거칩니다.
넷, 사용자가 전송한 Ethereum KSC를 소각 해서, 유통량을 맞춤
- 그림에 표시되어 있지 않음 (주기적으로 일괄 처리)
사용자의 입장에서는 위의 과정까지만 완료되면 정상적으로 SWAP이 완료되었다고 생각할 수 있습니다. (Ethereum KSC가 사라지고 동일 수량의 Luniverse KSST가 생겼으니까요.) 하지만 전체 토큰 유통량은 사용자가 보낸 수량 만큼이 증가 된 상태입니다. 그래서 유통량 10억 개를 맞추기 위해서 사용자 전용 계정에 입금 된 Ethereum KSC 를 소각해야 합니다. 소각은 주기적으로 일괄적으로 모아져 실행 됩니다.
Ethereum KSC가 Luniverse KSST로 SWAP 되는 과정이 왜 그렇게 설계되었고, 어떻게 구현 되었는지(그림의 1번 ~ 4번) 살펴봤습니다. 이 상태에서는 KStarLive 사용자 간의 전송은 가능한 상태입니다. 하지만 거래소에서 직접 거래를 하기 위해서는 조금 더 복잡한 과정(그림의 5번 ~ 9번)이 남아있습니다. 해당 내용은 다음 시간에 다뤄보겠습니다.
Published at Mon, 09 Sep 2019 01:14:24 +0000
Bitcoin Pic Of The Moment
✅ Marco Verch is a Professional Photographer and Speaker from Cologne. 👆 This image can be used under Creative Commons 2.0. Please link to the original photo and the license.
By wuestenigel on 2019-01-19 18:14:05

