Envio와 Quicknode를 사용하여 Kaia에서 KIP7 전송을 인덱싱하는 방법
들어가며
들어가며
스마트 컨트랙트 인덱싱은 빠르고 성능이 뛰어난 탈중앙화 애플리케이션을 구축하기 위한 기본 요소입니다. 개발자는 인덱서를 통해 애플리케이션별 데이터를 집계하여 빠르게 액세스하고, 복잡한 블록체인 데이터를 쉽게 쿼리할 수 있는 형식으로 추출하는 등, 최종 사용자와 개발자 모두에게 더 빠른 속도와 데이터 안정성을 제공할 수 있습니다.
이 글에서는 현대적이고 개발자 친화적이며 속도에 최적화된 블록체인 인덱싱 솔루션인 Envio를 소개하고, QuickNode RPC 엔드포인트를 데이터 소스로 사용하여 Kaia에서 스마트 컨트랙트를 인덱싱하는 방법을 알아보겠습니다.
전제 조건
인덱싱을 시작하기 전에 다음과 같은 사전 요구 사항을 설치해야 합니다.
시작하기
이 가이드에서는 Kairos 테스트넷에 기본 KIP7 스마트 계약을 배포하고 주로 그 전송을 인덱싱할 것입니다. 또한 RPC URL을 통해 데이터를 인덱싱하기 위해 Envio를 사용할 것입니다. 이 가이드와 같은 소규모 애플리케이션에는 적합할 수 있지만, 매우 빠른 인덱싱을 위해서는 Kaia에 도입될 HyperSync 기능을 사용하는 것이 권장됩니다.
스마트 컨트랙트 배포하기
Kairos 테스트넷에 샘플 KIP7 스마트 계약을 배포하는 것으로 시작해 보겠습니다. Kaia Contract Wizard에서 기본 KIP7 계약을 쉽게 생성하거나, Kaiascan에 이미 배포되고 검증된 컨트랙트를 간단히 사용할 수 있습니다: 0x1f1d5027a1e5817d807458008ca6af5c9ad98354.
Envio 설치하기
아래 명령을 실행하여 Envio를 설치할 수 있습니다.
npm i -g envio인덱서 초기화하기
이제 envio와 사전 요구 사항들이 설치되었으니, 다음 단계는 인덱서를 초기화하고 KIP7 계약의 전송을 인덱싱하기 위한 기본 틀을 생성하는 것입니다.
인덱서를 초기화하려면 아래 단계를 따르세요:
- 빈 프로젝트에서 터미널을 열고 아래 명령어를 실행하세요.
envio init2. 인덱서에 이름을 지정하세요. (예: “kaia-token-indexer”).
3. 선호하는 언어(typescript)와 블록체인 생태계(EVM)를 선택하세요.
4. 초기화 옵션을 선택하세요 (Template)
5. 사용하고 싶은 템플릿을 선택하세요 (ERC20)
인덱서 구성하기
템플릿을 사용하여 생성된 인덱서는 추가 구성 없이도 작동합니다. 하지만 이번 경우에는 QuickNode RPC를 데이터 소스로 사용하는 방법을 설명하고, 또한 여러 이벤트로 인덱서를 설정하는 방법을 보여주기 위해 두 가지 이벤트를 더 추가할 것입니다. 이 접근 방식은 인덱싱 프로세스의 유연성을 보여주고 더 포괄적인 예시를 제공합니다. 이러한 이유로, 우리는 다음 파일들을 구성해야 합니다:
1. config.yaml 변경하기
# yaml-language-server: $schema=./node_modules/envio/evm.schema.json
name: erc20indexer
description: ERC-20 indexer
networks:
- id: 1001 # Kairos Testnet
rpc_config:
url: https://responsive-green-emerald.kaia-kairos.quiknode.pro/ # RPC URL that will be used to subscribe to blockchain data on this network
initial_block_interval: 10000 # Integer
backoff_multiplicative: 0.8 # Float
acceleration_additive: 2000 # Integer
interval_ceiling: 10000 # Integer
backoff_millis: 5000 # Integer
query_timeout_millis: 20000 # Integer
start_block: 166803165
contracts:
- name: Evoor
abi_file_path: ./abis/evoor-abi.json
address: "0x1F1D5027A1E5817D807458008Ca6Af5C9AD98354" #EVR
handler: src/EventHandlers.ts
events:
- event: "Approval(address indexed owner, address indexed spender, uint256 value)"
- event: "Transfer(address indexed from, address indexed to, uint256 value)"
- event: OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
# Rollback on reorg mode currently incurs a performance hit on historical sync
# while developing an indexer we recommend setting this to false
rollback_on_reorg: falseconfig.yaml 파일에서 볼 수 있듯이, QuickNode RPC 엔드포인트를 추가하고, 계약 주소, 계약 ABI 경로, 그리고 인덱싱 프로세스에 사용되는 기타 세부 사항을 지정했습니다.
2. schema.graphql 변경하기
type TokenApproval {
id: ID!
owner: String!
spender: String!
value: BigInt!
}
type TokenOwnershipTransferred {
id: ID!
previousOwner: String!
newOwner: String!
}
type TokenTransfer {
id: ID!
from: String!
to: String!
value: BigInt!
}구성 파일과 스키마를 설정했으면 이벤트 핸들러를 작성하는 데 필요한 인덱싱 코드를 생성할 준비가 된 것입니다.
다음 명령을 실행합니다:
envio codegen3. EventHandlers.ts 변경하기
import { Evoor, TokenApproval, TokenOwnershipTransferred, TokenTransfer } from "generated";
Evoor.Approval.handler(async ({ event, context }) => {
const entity: TokenApproval = {
id: `${event.chainId}_${event.block.number}_${event.logIndex}`,
owner: event.params.owner,
spender: event.params.spender,
value: event.params.value,
};
context.TokenApproval.set(entity);
});
Evoor.OwnershipTransferred.handler(async ({ event, context }) => {
const entity: TokenOwnershipTransferred = {
id: `${event.chainId}_${event.block.number}_${event.logIndex}`,
previousOwner: event.params.previousOwner,
newOwner: event.params.newOwner,
};
context.TokenOwnershipTransferred.set(entity);
});
Evoor.Transfer.handler(async ({ event, context }) => {
const entity: TokenTransfer = {
id: `${event.chainId}_${event.block.number}_${event.logIndex}`,
from: event.params.from,
to: event.params.to,
value: event.params.value,
};
context.TokenTransfer.set(entity);
}
);인덱서 시작하기
인덱서를 시작하려면 터미널에서 아래 명령을 실행합니다:
envio dev터미널에서 아래 명령어를 사용하여 인덱스를 중지할 수도 있습니다:
envio stop인덱싱된 데이터에 접근하기
이제 데이터가 인덱싱되었으니, 인덱싱된 데이터에 접근해 봅시다! 이를 위해 아래 단계를 따르세요:
- http://localhost:8080/에서 제공되는 Hasura Console로 이동하여 admin-secret 비밀번호(“testing”)를 입력하고, 상단 열에서 “API”를 클릭하여 실시간 데이터를 쿼리할 수 있는 GraphQL 엔드포인트에 접근하세요.
2. 상단 열의 “Data” 탭으로 이동하여 이벤트 동기화 상태 테이블을 통해 Kaia에서의 인덱싱 진행 상황을 모니터링하고 현재 어느 블록 번호에 있는지 확인하세요.
실제 쿼리 실행하기
이제 TokenTransfer 이벤트를 쿼리하여 금액, 송신자, 수신자, 그리고 가치 등의 세부 정보를 살펴보겠습니다. 이 가이드에서는 우리가 먼저 보고 싶은 금액 순서로 쿼리를 정렬할 것입니다(이 경우: desc = 가장 큰 금액), 누구로부터 온 것인지, 그리고 전송되는 가치를 기준으로 정렬하겠습니다.
원하는 이벤트를 선택한 후, 재생 버튼( ▶️)을 클릭하여 쿼리를 실행하면 실시간 인덱싱된 데이터에 접근할 수 있습니다.
결론
축하합니다! KIP7 토큰 계약의 모든 토큰 전송 이벤트를 Kaia 네트워크에서 성공적으로 인덱서를 생성하고 인덱싱 했습니다. Envio 인덱싱 솔루션에 대한 자세한 정보는 Envio 문서를 참조하세요. 또한 Kaia 블록체인에 대한 더 많은 정보를 원하시면 Kaia 문서를 방문하세요. 질문이 있다면 Kaia 개발자 포럼을 방문하세요.