[루디움 렉쳐] 솔리디티 디앱 만들기 / 분산 스토리지와 데이터 쿼리 / @Ho53903Ho

블록체인 기술과 함께 등장한 분산 스토리지는 데이터 저장 방식에 혁신을 가져왔다. 이번 글에서는 분산 스토리지의 개념부터 IPFS와 Pinata를 활용한 데이터 관리, 그리고 블록체인 데이터 쿼리와 인덱싱 도구인 The Graph와 SubQuery에 대해 알아볼 예정이다.

분산 스토리지란?

분산 스토리지는 데이터를 여러 독립적인 노드에 분산하여 저장하는 방식이다. 이를 통해 데이터의 안정성과 보안성을 높일 수 있으며, 중앙 서버의 장애로 인한 데이터 접근 불가능 문제를 해결할 수 있다. 또한, 네트워크에 노드를 추가함으로써 용량을 유연하게 확장할 수 있는 장점이 있다.

중앙 집중식 스토리지와의 차이점

  • 중앙 집중식 스토리지는 모든 데이터가 하나의 중앙 서버에 저장된다. 이 서버가 다운되면 데이터에 접근할 수 없게 된다.
  • 분산 스토리지는 데이터를 여러 독립적인 노드(컴퓨터)에 나누어 저장한다. 일부 노드가 장애를 겪더라도 다른 노드에서 데이터에 접근할 수 있어 안정성이 높다.

분산 스토리지의 주요 이점

  • 안정성: 데이터가 여러 노드에 복제되어 저장되므로 일부 노드에 문제가 생겨도 데이터 손실을 막을 수 있다.
  • 확장성: 네트워크에 노드를 추가함으로써 스토리지 용량을 쉽게 확장할 수 있다.
  • 보안성: 데이터가 분산되어 있어 중앙 서버를 공격하는 것보다 훨씬 어려워 보안성이 높다.

IPFS (InterPlanetary File System)

IPFS는 분산 스토리지의 대표적인 예로, 데이터를 해시값으로 주소화하여 여러 노드에 분산 저장한다. 사용자가 데이터를 요청하면 가장 가까운 노드에서 데이터를 가져온다.

IPFS의 동작 원리

  1. 파일 추가: 파일을 IPFS에 추가하면 파일을 작은 청크(chunk)로 분할하고, 각 청크에 고유한 해시값을 생성한다. 이 해시값이 파일의 주소로 사용된다. 파일 내용이 변경되면 해시값도 변경된다.
  2. 파일 검색: 파일의 해시값을 사용하여 네트워크에서 해당 파일을 검색한다. 노드들은 요청된 해시값과 일치하는 청크를 반환한다.
  3. 파일 복원: 분할된 청크들을 연결하여 원래 파일로 복원한다.

Pinata로 IPFS 관리하기

Pinata는 IPFS 파일을 쉽게 관리할 수 있는 서비스이다. Pinata를 사용하면 IPFS에 파일을 고정(Pin)하여 데이터의 지속성을 보장할 수 있으며, 사용자 친화적인 인터페이스와 API를 통해 파일 관리를 효율적으로 수행할 수 있다.

1. Pinata 계정 생성 및 API Key 발급

  1. Pinata 웹사이트에 접속하여 계정을 생성한다.
  2. "New Key" 버튼을 클릭하여 새로운 API Key를 생성한다.
  3. 생성된 API Key, API Secret, JWT를 복사하여 안전하게 보관한다.

2. Pinata CLI 설치 및 설정

npm install -g @pinata/sdk

3. Node.js 프로젝트 설정

mkdir pinata-example
cd pinata-example
npm init -y
npm install @pinata/sdk
touch upload.js

4. 파일 업로드 코드 작성

upload.js 파일에 다음 코드를 작성한다.

const pinataSDK = require('@pinata/sdk');
const fs = require('fs');

// 복사해둔 API Key, API Secret, JWT 입력
const pinata = new pinataSDK('API Key', 'API Secret', 'JWT');

// 업로드할 파일 경로 설정
const readableStreamForFile = fs.createReadStream('./test.txt');

const options = {
    pinataMetadata: {
        name: 'MyTestFile',
        keyvalues: {
            customKey: 'customValue'
        }
    },
    pinataOptions: {
        cidVersion: 0
    }
};

pinata.pinFileToIPFS(readableStreamForFile, options).then((result) => {
    console.log(result);
}).catch((err) => {
    console.error(err);
});

5. 파일 업로드 실행

node upload.js

성공적으로 업로드되면 파일의 IpfsHash 값을 얻을 수 있다. 이 해시값을 통해 파일에 접근할 수 있다.

출처: 루디움 - [Aidenteti crew] 로글스 스터디 프로그램

블록체인 데이터 쿼리와 인덱싱

블록체인에서는 모든 거래와 데이터가 체인 형태로 연결되어 저장되기 때문에, 특정 데이터를 빠르게 검색하고 접근하는 것이 어렵다. 이는 디앱(DApp) 개발 시 실시간 데이터 접근에 큰 장애가 된다. 예를 들면, Uniswap V3에서 특정 풀의 전체 유동성을 확인하려면 가격 구간별로 분산된 유동성 정보를 모두 합산해야 한다. 블록체인 데이터베이스는 이에 대한 직접적인 인덱싱을 제공하지 않기 때문에 개발자들이 추가로 데이터를 가공해야 하는 번거로움이 있다. 이에 다음과 같은 이유로 데이터 인덱싱이 필요하다.

  1. 효율적인 데이터 검색: 인덱싱을 통해 필요한 데이터를 신속하게 찾을 수 있다.
  2. 실시간 데이터 접근: 실시간 데이터를 필요로 하는 디앱에서 인덱싱은 필수적이다.
  3. 확장성: 데이터 처리 요구가 증가해도 효율적으로 대처할 수 있다.

데이터 인덱싱 도구

The Graph

The Graph는 블록체인 데이터를 수집하고 인덱싱하여 개발자들이 쉽고 빠르게 데이터를 쿼리할 수 있도록 지원한다.

출처: 루디움 - [Aidenteti crew] 로글스 스터디 프로그램

The Graph의 구성 요소

  • Graph Node: 블록체인 데이터를 모니터링하고 인덱싱한다.
  • Subgraph: 특정 데이터 세트를 정의하고 인덱싱하는 단위이다.
    • Manifest: 서브그래프의 정의와 메타데이터를 포함한다.
    • Schema: 데이터를 구조화하는 GraphQL 스키마를 정의한다.
    • Mapping: 데이터를 변환하고 저장하는 방법을 지정한다.

GraphQL을 통한 데이터 쿼리

출처: 루디움 - [Aidenteti crew] 로글스 스터디 프로그램

 

GraphQL은 필요한 데이터만 효율적으로 쿼리할 수 있는 언어이다. REST API와 달리 단일 요청으로 필요한 모든 데이터를 가져올 수 있어 불필요한 데이터 전송을 줄이고 응답 속도를 높인다.

SubQuery

SubQuery는 주로 PolkadotSubstrate 생태계를 위한 데이터 인덱싱 솔루션이다. 블록체인 데이터를 수집, 인덱싱, 쿼리하는 데 중점을 두며, manifest 파일과 schema 파일을 사용하여 데이터를 모델링한다.