The Graph 입문 가이드(2–2)

Boom Labs는 Web 3 개발자들을 온보딩시키고, 생태계를 활성화시키기 위해 교육을 비롯한 여러 활동들을 하고 있습니다. 저희 비전에 공감하여 동참하고자 하는 분들은 Boom Labs의 문을 두드려주세요!

Disclaimer: 이 글은 정보 전달을 위한 목적으로 작성되었으며, 특정 프로젝트에 대한 투자 권고, 법률적 자문 등 목적으로 하지 않습니다. 모든 투자의 책임은 개인에게 있으며, 이로 발생된 결과에 대해 어떤 부분에서도 Boom Labs는 책임을 지지 않습니다. 본문이 포괄하는 내용들은 특정 자산에 대한 투자를 추천하는 것이 아니며, 언제나 본문의 내용만을 통한 의사결정은 지양하시길 바랍니다.

2–1 글에서 이어집니다.

5.이제 schema.graphql 파일을 정의합니다.

  • schema는 GraphQL을 사용합니다. 유일하게 The Graph에서 추가한 부분은 @entity 라는 directive를 추가한 부분입니다.
  • GraphQL 데이터 타입을 확인하려면 이 링크를 참고하세요.
  • schema를 정의할 때 유의해야할 점은 schema를 우리가 조회하고자 할 데이터들을 정의할 객체로 바라봐야 한다는 것입니다. schema는 온체인 이벤트나 메소드 형식에 일대일로 대응 될 필요가 없습니다.
type Token @entity {
id: ID!
count: BigInt! # 솔리디티의 uint 타입들과 대응됩니다.
owner: Bytes! # 솔리디티의 address 타입과 대응됩니다.
spender: Bytes!
}

6.yaml, graphql 파일을 바탕으로 codegen을 합니다.

  • 이제 AssemblyScript 파일을 작성하기 위해 yarn codegen 커맨드를 실행하면, 자동으로 코드가 생성됩니다. generated 폴더에 가면 이벤트와 schema가 정의된 AssemblyScript class code들이 존재합니다

dai.ts 파일에는 handler 메소드를 정의합니다. 이 handler 메소드를 통해 컨트랙트 이벤트가 listen 되었을 때, 데이터 수집 로직을 처리합니다.

import { BigInt } from "@graphprotocol/graph-ts"
import { DAI, Approval, Transfer } from "../generated/DAI/DAI"
import { Token } from "../generated/schema"
export function handleApproval(event: Approval): void {
// Token 클래스의 load를 사용해 이미 저장한 객체를 불러옵니다. 인자에는 주로 ID를 넣습니다.
let entity = Token.load(event.transaction.from.toHex())
// Token 인스턴스를 생성 시 인자에는 주로 ID를 넣습니다.
// ID는 string 타입이어야 하므로 주로 toHex()를 사용합니다.
if (!entity) {
entity = new Token(event.transaction.from.toHex())
// BigInt 타입으로 만들기 위해 graph-ts 라이브러리의 BigInt 타입을 사용합니다.
entity.count = BigInt.fromI32(0)
}
// BigInt 타입 연산 시에는 메소드를 사용합니다.
entity.count = entity.count.plus(BigInt.fromI32(1));
// Entity fields can be set based on event parameters
entity.owner = event.params.owner
entity.spender = event.params.spender
// Entities can be written to the store with `.save()`
entity.save()
// 스마트 컨트랙트에도 접근이 가능합니다.
// 아래와 같이 bind를 이용해 Contract 객체를 부르고, 메소드 또한 호출할 수 있습니다.
// let contract = Contract.bind(event.address)
// - contract.totalSupply(...)
}
export function handleTransfer(event: Transfer): void {}
  • 이 파일에서는 블록체인의 이벤트 객체를 인자로 받아와서 아까 schema에 정의한 데이터 모델로 필요한 데이터를 변환하는 작업을 합니다.
  • 문법이 자바스크립트와 유사해보이지만 AssemblyScript라는 다른 언어입니다. 자바스크립트의 일부 문법은 사용이 제한되니, cheetSheet를 참고하시기 바랍니다.
  • Token class는 save, load 등의 메소드를 제공합니다. 즉, handle 함수 호출 시점에 이미 저장 되어있는 객체를 불러올 수 있습니다.

7.이제 mapping 파일까지 정의했으니, 배포를 해볼 차례입니다. 배포를 하기 위해선 Access token으로 인증을 해야 합니다.

  • graph auth --product hosted-service <ACCESS_TOKEN>
  • ACCESS_TOKEN 자리에는 Hosted Service 사이트에 있던 ACCESS TOKEN을 입력해야 합니다.

8.인증이 완료되면, 배포를 할 수 있습니다. 배포는 yarn deploy 를 이용해 간편하게 할 수 있습니다. (인증은 서브그래프 당 1번만 진행하면 됩니다. 배포 시 매번 인증을 할 필요는 없습니다.)

9.아래와 같이 Completed가 뜨면 배포가 성공적으로 완료된 것입니다.

10.이제 Hosted Service 사이트로 가면 만들었던 서브그래프의 상태가 DEPLOYED 로 바뀐 것을 볼 수 있습니다.

  • 세부 서브그래프 페이지로 들어가면 서브그래프의 ID, graphQL 요청을 보낼 Queries endpoint, 수집된 데이터의 수(entitis) 등을 보실 수 있습니다. 아래에는 PlayGround가 있어서 바로 쿼리를 호출해볼 수 있습니다.

글을 마치며

  • 이번 글에서는 서브그래프 관련 파일 작성, 빌드, 배포에 대해 알아보았습니다. 처음 본 개념들이 많아 다소 복잡해보일 수 있지만, 글을 읽고 차근차근 따라가면 쉽게 사용하실 수 있을 것이라 생각합니다.
  • 마지막 글에서는 배포한 서브그래프를 이용해 쿼리하는 법에 대해 알아보겠습니다.

3편으로 이어집니다.

--

--