블록체인 데이터를 조회하는 방법
Midnight blockchain은 DApp의 데이터 프라이버시와 컴플라이언스에 새로운 접근 방식을 도입하며, zero-knowledge proof(ZKP)와 듀얼 토큰 시스템을 활용합니다.
이 글에서는 Midnight blockchain에 연결하는 방법을 안내합니다. Polkadot API를 사용하여 Substrate 기반 blockchain(Midnight 포함)에 접속하고, 새 블록을 실시간으로 수신하며, 블록에서 데이터를 추출하는 방법을 다룹니다.
코드의 실제 동작은 이 저장소에서 확인할 수 있습니다. Midnight mempool을 감시하는 간단한 앱입니다!
Understanding Midnight's Architecture
Midnight은 기존 blockchain의 데이터 프라이버시 한계를 해결하기 위해 설계되었습니다. 이를 위해 다음 기술을 활용합니다:
- Zero-Knowledge Proof(ZKP): 데이터 자체를 드러내지 않고도 데이터를 검증할 수 있습니다.
- 듀얼 토큰 시스템: 거버넌스를 위한 NIGHT(비차폐)와 transaction 수수료 지불을 위한 DUST(차폐)를 사용합니다.
- Compact Smart Contract 언어: TypeScript 기반 언어로 프라이버시 보존 smart contract 개발을 지원합니다.
이러한 기능 덕분에 Midnight은 의료 기록, 금융 거래, 신원 확인 등 데이터 기밀이 중요한 애플리케이션에 적합합니다.
Connecting to the Midnight Blockchain
@polkadot/api 라이브러리는 Midnight을 포함한 Substrate 기반 blockchain에 연결하기 위한 WebSocket 프로바이더(WsProvider)를 제공합니다.
Installation
먼저 필요한 패키지가 설치되어 있는지 확인하세요:
npm install @polkadot/api
Establishing a Connection
WsProvider를 사용하여 Midnight 노드에 연결합니다:
import { ApiPromise, WsProvider } from '@polkadot/api';
// Midnight 노드의 WebSocket 엔드포인트 정의
const wsProvider = new WsProvider('wss://rpc.testnet.midnight.network');
// API 인스턴스 생성
const api = await ApiPromise.create({ provider: wsProvider });
Listening for New Blocks
연결이 완료되면, 새 블록 헤더를 구독하여 새 블록을 수신할 수 있습니다:
api.rpc.chain.subscribeNewHeads((lastHeader) => {
console.log(`New block #${lastHeader.number} has been added`);
});
이 함수는 새 블록이 체인에 추가될 때마다 블록 번호를 로깅합니다.
Extracting Data from Blocks
각 새 블록에서 transaction과 event 같은 상세 정보를 추출하려면 다음 접근 방식을 사용할 수 있습니다:
api.rpc.chain.subscribeNewHeads(async (lastHeader) => {
const blockHash = await api.rpc.chain.getBlockHash(lastHeader.number);
const signedBlock = await api.rpc.chain.getBlock(blockHash);
const allEvents = await api.query.system.events.at(blockHash);
console.log(`nBlock #${lastHeader.number}`);
signedBlock.block.extrinsics.forEach((extrinsic, index) => {
console.log(`nExtrinsic ${index}: ${extrinsic.method.section}.${extrinsic.method.method}`);
console.log(`Arguments: ${extrinsic.args.map((arg) => arg.toString()).join(', ')}`);
});
allEvents.forEach(({ event, phase }, index) => {
console.log(`nEvent ${index}: ${event.section}.${event.method}`);
console.log(`Phase: ${phase.toString()}`);
console.log(`Data: ${event.data.toString()}`);
});
});
이 스크립트는 새 블록 헤더를 구독하고, 전체 블록과 관련 event를 가져오며, 각 extrinsic(transaction)과 event에 대한 상세 정보를 로깅합니다.
What is an extrinsic?
Midnight 같은 Substrate 기반 blockchain에서 extrinsic은 런타임 외부에서 발생하여 블록 포함을 위해 네트워크에 제출되는 모든 정보를 말합니다. 사용자와 외부 주체가 blockchain과 상호작용하여 상태를 변경하는 주된 수단입니다.
세 가지 주요 유형의 extrinsic이 있습니다:
- Signed Extrinsic: 디지털 서명이 포함된 사용자 제출 transaction입니다. 토큰 전송이나 smart contract 호출 등이 해당합니다. 서명으로 진위를 보장하고 transaction 수수료를 청구할 수 있습니다.
- Unsigned Extrinsic: 서명 없이 제출되며, 사용자 인증이 필요 없는 작업에 사용됩니다. 오용 방지를 위해 커스텀 검증 로직을 적용할 수 있습니다.
- Inherent Extrinsic: Blockchain 자체에서 생성되며, 블록 타임스탬프 설정 같은 시스템 수준 작업에 사용됩니다. 네트워크를 통해 전파되지 않고, 블록 생성 시 블록 프로듀서가 직접 포함시킵니다.
Extrinsic은 네트워크 상태를 변경하는 기본 메커니즘이므로, Substrate 기반 blockchain 개발자에게 반드시 이해해야 할 개념입니다.
Conclusion
@polkadot/api 라이브러리의 WsProvider를 활용하면 Midnight blockchain에 연결하고, 실시간으로 새 블록을 모니터링하며, 애플리케이션에 필요한 데이터를 추출할 수 있습니다. Midnight 네트워크에서 프라이버시 중심 DApp을 구축하기 위한 견고한 기반이 됩니다.
더 많은 정보와 상세 문서는 Midnight Developer Hub를 방문하세요.