특정 시간 동안 블록에 포함된 트랜잭션의 리스트를 반환
우리가 흔히 사용하는 RDB, NoSQL DB에서는 위의 쿼리를 간단하게 실행할 수 있습니다. 시간 필드에 인덱스를 만들어 빠르게 처리할 수도 있죠. 하지만 블록체인은 자주 사용되는 몇 가지 필드 외에는 인덱스를 만들지 않습니다. 즉, 위와 같은 쿼리는 제공하지 않을 가능성이 크죠. 블록체인이 돌아가는 데 꼭 필요한 정보가 아니면 인덱스를 만들지 않기 때문에 RPC API로 제공되는 쿼리에 상당한 제약이 있습니다. 블록 넘버나 해시 값등으로 블록을 읽어오는 단순한 RPC API로는 간단한 블록 익스플로러나 특정 주소로 코인을 전송하는 애플리케이션 정도밖에 만들 수 없습니다.
코드체인 인덱서
다양한 쿼리를 지원하려면 블록체인에 저장된 데이터를 가져와서 DB에 새로 인덱스를 생성해야 합니다. 코드체인 인덱서는 코드체인 블록 데이터를 읽어와 ElasticSearch위에 인덱스를 생성합니다.
코드체인에 새로운 블록이 쌓이면 해당 블록을 가져와 아래와 같은 인덱스를 생성합니다.
- Block : 블록 데이터 - Parcel : 파셀 데이터 - Transaction : 트랜잭션 데이터 - Asset : 특정 주소의 사용하지 않은 에셋의 리스트 - AssetImage : 특정 에셋의 이미지 데이터 - Log : 하루 동안 체인에 포함된 블록, 파셀, 트랜잭션 수 - Account : 특정 주소가 가진 CCC 수량 - PendingParcel : 펜딩된 파셀 데이터
코드체인 인덱서는 체인에 있는 모든 블록 정보를 ElasticSearch에 인덱싱하므로 유저는 직접 ElasticSearch에 복잡한 쿼리를 할 수 있습니다.
코드체인 인덱서가 생성한 인덱스가 어떻게 사용되는지 몇가지 예제로 설명하겠습니다.
특정 주소가 가지고 있는 사용하지 않은 에셋의 리스트
만약 블록체인 지갑을 만들려면 위와 같은 데이터가 필요합니다. 코드체인은 특정 주소가 가지고 있는 에셋의 리스트에 대한 인덱스를 생성하지 않기 때문에 JSON RPC도 지원하지 않는 데요, 코드체인 인덱서를 사용하여 ElasticSearch에 인덱스를 만든다면 간단하게 쿼리를 생성할 수 있습니다.
다음 쿼리를 이용하면 특정 주소가 가지고 있는 에셋의 리스트를 얻을 수 있습니다.
또 인덱서는 ElasticSearch에 직접 쿼리하지 않아도 간편하게 사용할 수 있도록 Rest API 서버도 제공하고 있습니다.
특정 주소가 가지고 있는 사용하지 않은 에셋의 리스트를 반환하는 API는 다음과 같습니다.
https://husky.codechain.io/explorer/api/utxo/tcaqyqur2tpam5wgcspdey5vdxvxf95xuxh46esn5m6s7
현재 테스트 넷에서 제공하고 있는 코드체인 익스플로러도 ElasticSearch에 인덱싱된 데이터를 사용하고 있습니다. 최신 블록, 파셀, 트랜잭션 리스트의 페이지네이션 기능이나 통합검색 기능 등은 인덱싱된 데이터가 없으면 구현할 수 없죠.
코드체인 익스플로러
코드체인 인덱서는 에셋의 메타데이터에서 이름을 가져와 인덱스를 생성하기 때문에 코드체인 익스플로러는 에셋을 이름으로 검색할 수 있습니다. ElasticSearch는 fuzziness 검색기능을 기본으로 제공하기 때문에 오타가 보정된 결과를 얻을 수 있습니다.
마찬가지로 에셋을 이름으로 검색하는 API는 다음과 같습니다.
https://husky.codechain.io/explorer/api/search/asset/petrol
마무리
지금까지 코드체인 인덱서를 소개했습니다. 앞서 말했듯이 블록체인에 저장된 데이터를 다양하게 활용하려면 DB에 다시 인덱스를 만들어야 합니다. 블록체인의 합의를 이루는 과정에서 블록이 추가되었다 빠지기를 반복하기 때문에 따로 DB 인덱스를 만드는 것이 상당히 까다로운데요. 이런 까다로운 일을 코드체인 인덱서가 해결할 뿐만 아니라 쉽게 사용할 수 있도록 API도 제공하기 때문에 다양한 애플리케이션을 만들기 위해서는 인덱서 사용이 필수라고 생각됩니다.