코드체인 인덱서

 

코드박스 / 19. 11. 20. 오후 10:11

코드체인 팀은 코드체인 코어 개발 외에도 코드체인 애플리케이션 개발에 열중하고 있습니다. 코드체인 블록 정보를 보여주는 익스플로러, 키를 유저가 직접 관리하는 웹 지갑, 키를 직접 보관하지 않고도 사용할 수 있는 모바일 지갑 앱(iOS, Android), 코드체인에 자산을 발행하고 관리할 수 있는 콘솔 등이 있습니다. 이 애플리케이션들은 내부적으로 코드체인 인덱서 API를 사용한다는 공통점이 있습니다. 이번 포스팅에서는 코드체인 인덱서가 무엇이고 어떻게 돌아가는지 소개합니다.

익스플로러 등의 서비스 개발을 위해서는 데이터베이스가 필요합니다. 코드체인 인덱서는 이 데이터베이스 역할을 하고 실제 구현도 Postgres에 의존합니다. 바꿔 말해서 코드체인 인덱서는 블록 및 트랜잭션 정보를 데이터베이스에 인덱싱합니다. 블록체인은 분산 데이터베이스와 자주 비교되는데, 블록체인 노드 자체는 범용적인 데이터베이스 기능을 지원하지 않습니다. 예를 들면 SQL 같은 유연한 쿼리 언어를 지원하지 않습니다. 오히려 매우 제한적인 인터페이스로 블록체인 데이터를 제공합니다. 따라서 어떤 서비스를 개발하든 간에, 코드체인 노드를 운영함과 동시에 별도의 데이터베이스를 구축해야 할 가능성이 높은데, 코드체인 인덱서가 그 대안이 될 수 있습니다. 코드체인 애플리케이션들이 일반적으로 필요로 하는 API를 제공하기 때문입니다.

코드체인 인덱서 Worker

코드체인 인덱서의 구현은 크게 두 부분으로 나뉩니다. 하나는 블록 정보를 읽어서 데이터베이스에 저장하는 Worker고, 다른 하나는 DB에 저장된 정보를 읽어서 API 형태로 제공하는 API 입니다.

Worker는 주기적으로 코드체인 노드에 블록을 요청하여 이를 가공한 뒤 데이터베이스에 저장합니다. 주요하게 가공하는 정보 중 하나는 주소입니다. 예를 들어 블록과 트랜잭션에는 ECDSA 서명이 있지만 서명한 사람의 주소는 적혀 있지 않습니다. ECDSA 서명은 서명으로부터 공개키를 복구할 수 있습니다. 공개키를 알면 주소를 계산할 수 있기 때문에 코드체인 노드 입장에서는 주소를 기록하는게 공간 낭비입니다. 코드체인 인덱서 API는 주소로 검색하는 쿼리를 지원해야 하므로 이를 미리 모두 계산하여 데이터베이스에 저장합니다.

또 하나 주요하게 가공하는 정보는 UTXO입니다. 현재 코드체인의 JSON-RPC만으로는 어떤 주소가 보유한 모든 UTXO를 알아오는 방법이 없습니다. 내 주소로 자산을 보낸 트랜잭션 트래커(Transaction tracker)를 통해 UTXO를 일일이 알아내거나, 이조차 모른다면 모든 트랜잭션을 읽어와 내 주소로 자산을 보냈는지 여부를 계산해야 합니다. 인덱서를 사용하면 UTXO API 한 번 호출로 특정 주소가 보유한 모든 UTXO 정보를 알 수 있습니다. 이는 Worker가 모든 주소에 대해 UTXO 정보를 미리 저장해두기 때문에 가능합니다.

코드체인 인덱서 API

데이터베이스에 저장된 정보를 API 형태로 제공하는 것은 간단합니다. 몇 가지 예를 들어 설명하겠습니다. 아래 코드는 인덱서의 UTXO 모델 구현의 일부입니다.

interface UTXOAttribute { address: string; assetType: string; quantity: string; blockNumber: number; usedBlockNumber?: number | null; /* ... */ }

usedBlockNumber는 UTXO가 사용된 트랜잭션의 블록 번호를 기록하는 필드입니다. 만약 UTXO가 아직 사용되지 않았다면 필드값이 NULL일 것입니다. “X” 주소의 모든 UTXO는 아래와 같은 SQL로 쉽게 구할 수 있습니다.

SELECT * FROM UTXOs WHERE address = “X” AND usedBlockNumber IS NULL

인덱서의 “GET /api/utxo” API를 호출하면 내부적으로 위와 비슷한 SQL이 사용되며, 코드체인 익스플로러에서 주소를 검색하면 보유한 자산을 보여주는데 사용됩니다. 해당 API는 익스플로러 주소를 통해서도 호출할 수 있습니다.

https://explorer.codechain.io/api/utxo?address=ccaqyqnchjfu5q7caphhtdenvg3fha2y6zj8dus20gng0

이번엔 살짝 더 복잡한 케이스를 알아 보겠습니다. 코드체인 콘솔은 자산을 발행해서 투자자를 모집하고 관리할 수 있는 서비스입니다. 자산을 발행한 사람은 투자자를 대상으로 투표를 진행하거나, 이자 혹은 배당금을 지급하는 기능이 있습니다. 여기서 배당금은 자산의 지분율에 비례하고,지분율을 계산하는 시점은 배당일이 아니라 배당일 이전의 특정 시점일 수도 있습니다. 콘솔 서비스를 구현하는 입장에서는, 특정 시점의 특정 자산에 대한 모든 UTXO를 불러와 각 주소별로 지분율을 계산해야 하는 문제가 됩니다. 아래 SQL은 블록 1234567에서 “A” 에셋의 모든 UTXO를 가져오는 SQL의 예입니다.

SELECT * FROM UTXOs WHERE assetType = “A” AND blockNumber <= 1234567 AND (usedBlockNumber IS NULL OR usedBlockNumber > 1234567)

인덱서의 “GET /api/snapshot” API를 호출하여 위의 기능을 사용할 수 있습니다. 마찬가지로 익스플로러 주소를 통해 호출할 수 있습니다. 아래 URL에 접속하면 UTC 기준 2019년 6월 18일 9시 wCCC를 보유한 주소 및 수량을 알 수 있습니다.

https://explorer.codechain.io/api/snapshot?assetType=0x0000000000000000000000000000000000000000&date=2019-06-18T09:00:00.000Z

비용

인덱서는 편리한 기능을 제공하지만 이 모든 것이 공짜로 이루어지지는 않습니다. 코드체인 데이터를 데이터베이스에 중복으로 저장하기 때문에 기존 코드체인 데이터를 저장하는 것 대비 1.5배 정도의 저장 공간이 추가로 필요합니다. 그리고 처음 인덱서를 시작할 때 모든 블록을 싱크하기 위해 시간이 걸립니다. 코드체인 팀은 이런 비용을 최소화하는 방법을 모색하고 있습니다.

결론

코드체인 애플리케이션을 개발할 때 코드체인 인덱서 API를 활용하면 노력과 시간을 절약할 수 있습니다. 코드체인 팀에서도 익스플로러, 지갑 등 애플리케이션 개발에 인덱서를 활용했고 앞으로도 개선하며 활용할 예정입니다. 코드체인 인덱서 개발에 관심이 있다면 GitHub 저장소 혹은 Gitter로 오셔서 참여하시면 됩니다. 코드체인 인덱서는 100% 오픈소스 프로젝트입니다.

기업문화 엿볼 때, 더팀스

로그인

/