0 0
Read Time:14 Minute, 18 Second

Làm theo hướng dẫn cách sử dụng Subgraph Studio này để xây dựng và xuất bản các subgraph trên mạng lưới phi tập trung.

Subgraph là thành phần cốt lõi của The Graph. Chúng cho phép bất kỳ nhà phát triển nào xây dựng và triển khai các API hiệu suất và có thể khám phá với dữ liệu được lập chỉ mục từ các mạng lưới phi tập trung như Ethereum, IPFS và các blockchain khác. Các nhà phát triển subgraph xác định dữ liệu nào sẽ được lập chỉ mục từ blockchain và cách nó sẽ được lưu trữ và cung cấp thông qua một lớp API. Nhiều ứng dụng xây dựng và sử dụng các subgraph để cung cấp cho các ứng dụng sản xuất của chúng.

Subgraph Studio, ra mắt ngày hôm nay, cho phép các nhà phát triển triển khai và quản lý một cách dễ dàng trên các subgraph để kiếm phí truy vấn! Curation trên The Graph là một trong những thị trường quản lý đầu tiên hoạt động trên Ethereum ở quy mô này.

Trong hướng dẫn này, bạn sẽ học cách xây dựng subgraph đầu tiên của mình bằng Graph CLI và Subgraph Studio . Subgraph của bạn sẽ xây dựng sẽ dùng để lập chỉ mục và truy vấn dữ liệu từ hợp đồng thông minh Zora. Zora là một thị trường NFT. Zora có một website nhà phát triển có liên kết đến họ smart contract address cũng như một subgraph chính thức .

Bạn sẽ học cách xây dựng, kiểm tra và xuất bản subgraph tương tự lên mạng lưới phi tập trung của The Graph bằng cách lập chỉ mục dữ liệu từ hợp đồng thông minh Zora.

Điều kiện tiên quyết

Để thành công trong hướng dẫn này, bạn cần có những điều sau:

  1. 1. Node.js được cài đặt trên máy của bạn
  2. 2. Ví Metamask

Bắt đầu

Để bắt đầu, hãy truy cập Subgraph Studio tại https://thegraph.com/studio .

Tiêu chuẩn

Tại đây, nhấn vào Connect Wallet và chọn một địa chỉ ví để xác thực. Khi bạn đã xác thực, bạn sẽ có thể nhấp vào Create a Subgraph để tạo một Subgraph mới.

Tiêu chuẩn

Tại đây, đặt tên cho subgraph và nhấp vào Continue.

Tiêu chuẩn

Tiếp theo, bạn sẽ thấy một chế độ xem của subgraph của mình cho phép bạn thêm siêu dữ liệu tùy chọn như mô tả và hình ảnh của subgraph cũng như xem một số thông tin hữu ích như key triển khai, slug và status của subgraph.

Tiêu chuẩn

Bây giờ, dự án subgraph của bạn đã được tạo trong Studio, bạn có thể tiếp tục bằng cách đi vào môi trường phát triển địa phương của bạn và mở thiết bị đầu cuối của bạn.

Tiếp theo, thay đổi hoặc tạo một thư mục trống và cài đặt Graph CLI bằng NPM:

npm install -g @graphprotocol/graph-cli

Khi Graph CLI đã được cài đặt, bạn có thể khởi tạo một subgraph mới bằng lệnh Graph CLI init:

graph init --contract-name Token \
--index-events \
--product subgraph-studio \
--from-contract 0xabEFBc9fD2F806065b4f3C237d4b59D9A97Bcac7 

Sau đó, bạn sẽ được nhắc với những điều sau:

  1. ✔ Tên subgraph ·
  2. ✔ Danh mục để tạo subgraph trong đó ·
  3. ✔ Mạng lưới Ethereum · mainnet
  4. ✔ Contract address · 0xabEFBc9fD2F806065b4f3C237d4b59D9A97Bcac7
  5. ✔ Tìm nạp ABI từ Etherscan
  6. ✔ Tên hợp đồng ›Token

Điều này sẽ tạo ra một subgraph cơ bản dựa trên địa chỉ hợp đồng được chuyển vào làm đối số --from-contract. Bằng cách sử dụng contract address này, CLI sẽ khởi tạo một số thứ trong dự án của bạn để giúp bạn bắt đầu (bao gồm tìm nạp các ABI và lưu chúng trong thư mục ABIs).

Bằng cách chuyển vào --index-eventscờ, CLI sẽ tự động điền một số mã và cấu hình cho chúng ta cả trong schema.graphql cũng như src / mapping.ts dựa trên các sự kiện phát ra từ hợp đồng.

Codebase của subgraph bao gồm một số tệp:

  • subgraph.yaml: tệp YAML chứa tệp kê khai subgraph. Cấu hình và định nghĩa chính cho một subgraph nằm trong subgraph.yaml.
  • schema.graphql: một sơ đồ GraphQL xác định dữ liệu nào được lưu trữ cho subgraph của bạn và cách truy vấn nó qua GraphQL
  • AssemblyScript Mappings: Mã AssemblyScript chuyển từ dữ liệu sự kiện trong Ethereum sang các thực thể được xác định trong lược đồ của bạn (ví dụ: mapping.ts trong hướng dẫn này)

Các thực thể trong subgraph.yaml mà bạn sẽ làm việc là:

  • dataSources.source: địa chỉ của hợp đồng thông minh, các nguồn subgraph và ABI của hợp đồng thông minh mà bạn đang sử dụng. Địa chỉ là tùy chọn; bỏ qua nó cho phép lập chỉ mục các sự kiện phù hợp từ tất cả các hợp đồng.
  • dataSources.source.startBlock (tùy chọn): số block mà nguồn dữ liệu bắt đầu lập chỉ mục. Trong hầu hết các trường hợp, chúng tôi khuyên bạn nên sử dụng block mà hợp đồng đã được tạo, nếu không, Indexer sẽ bắt đầu từ block gốc.
  • dataSources.mapping.entities: các thực thể mà nguồn dữ liệu ghi vào store. Lược đồ cho mỗi thực thể được xác định trong tệp schema.graphql.
  • dataSources.mapping.abis: một hoặc nhiều tệp ABI được đặt tên cho hợp đồng nguồn cũng như bất kỳ hợp đồng thông minh nào khác mà bạn tương tác từ bên trong mappings.
  • dataSources.mapping.eventHandlers: liệt kê các sự kiện hợp đồng thông minh mà subgraph này reacts và các trình xử lý trong mapping – ./src/mapping.ts trong ví dụ – chuyển đổi các sự kiện này thành các mục trong store.

Xác định các mục:

Với The Graph, bạn xác định các loại thực thể (entity) trong schema.graphql và Graph Node sẽ tạo các trường (fields) cấp cao nhất để truy vấn các trường hợp và tập hợp đơn lẻ của loại thực thể đó. Mỗi loại phải là một thực thể bắt buộc phải được chú thích bằng chỉ thị @entity.

Các thực thể / dữ liệu mà chúng tôi sẽ lập chỉ mục là Token và Người dùng. Bằng cách này, chúng tôi có thể lập chỉ mục các Token được tạo bởi người dùng cũng như chính người dùng.

Để thực hiện việc này, hãy cập nhật schema.graphql bằng mã sau:

type Token @entity {
  id: ID!
  tokenID: BigInt!
  contentURI: String!
  metadataURI: String!
  createdAtTimestamp: BigInt!
  creator: User!
  owner: User!
}

type User @entity {
  id: ID!
  tokens: [Token!]! @derivedFrom(field: "owner")
  created: [Token!]! @derivedFrom(field: "creator")
}  type Token @entity {
  id: ID!
  tokenID: BigInt!
  contentURI: String!
  metadataURI: String!
  createdAtTimestamp: BigInt!
  creator: User!
  owner: User!
}

type User @entity {
  id: ID!
  tokens: [Token!]! @derivedFrom(field: "owner")
  created: [Token!]! @derivedFrom(field: "creator")
}  type Token @entity {
  id: ID!
  tokenID: BigInt!
  contentURI: String!
  metadataURI: String!
  createdAtTimestamp: BigInt!
  creator: User!
  owner: User!
}

type User @entity {
  id: ID!
  tokens: [Token!]! @derivedFrom(field: "owner")
  created: [Token!]! @derivedFrom(field: "creator")
}  

Các mối quan hệ qua @derivedFrom:

Tra cứu ngược có thể được xác định trên một thực thể thông qua trường @derivedFrom. Điều này tạo ra một trường ảo trên thực thể có thể được truy vấn nhưng không thể được đặt theo cách thủ công thông qua mapping API. Đúng hơn, nó có nguồn gốc từ mối quan hệ được xác định trên thực thể khác. Đối với các mối quan hệ như vậy, hiếm khi có ý nghĩa khi lưu trữ cả hai bên của mối quan hệ và cả hiệu suất lập chỉ mục và truy vấn sẽ tốt hơn khi chỉ một bên được lưu trữ và bên kia được dẫn xuất.

Đối với các mối quan hệ one – to – many, mối quan hệ phải luôn được lưu trữ ở bên ‘một’ và bên ‘nhiều’ phải luôn được dẫn nguồn. Lưu trữ mối quan hệ theo cách này, thay vì lưu trữ một mảng các thực thể ở phía ‘nhiều’, sẽ dẫn đến hiệu suất tốt hơn đáng kể cho cả lập chỉ mục và truy vấn subgraph. Nói chung, việc lưu trữ các mảng thực thể nên tránh càng nhiều càng tốt.

Bây giờ chúng ta đã tạo lược đồ GraphQL cho ứng dụng của mình, chúng ta có thể tạo cục bộ các thực thể để bắt đầu sử dụng trong mappings CLI đã tạo:

  graph codegen

Để làm cho các hợp đồng thông minh, sự kiện và thực thể hoạt động dễ dàng và type-safe (loại an toàn), Graph CLI tạo ra các kiểu AssemblyScript từ sự kết hợp của lược đồ GraphQL của subgraph và ABI của hợp đồng được bao gồm trong các nguồn dữ liệu.

Cập nhật subgraph với các thực thể và mapping

Bây giờ bạn có thể cập nhật cấu hình chính trong subgraph.yaml để sử dụng các thực thể mà bạn vừa tạo cũng như định cấu hình mapping của chúng.

Để làm như vậy, trước tiên hãy cập nhật trường dataSources.mapping.entities với các thực thể Uservà Token:

entities:
  - Token
  - User

Tiếp theo, cập nhật dataSources.mapping.eventHandlers để chỉ bao gồm hai trình xử lý sự kiện sau:

eventHandlers:
  - event: TokenURIUpdated(indexed uint256,address,string)
    handler: handleTokenURIUpdated
  - event: Transfer(indexed address,indexed address,indexed uint256)
    handler: handleTransfer

Các trình xử lý sự kiện này sẽ map sự kiện Ethereum thành một chức năng trong dự án cục bộ. Trong chức năng đó, chúng ta sẽ có thể tương tác và ghi vào The Graph node.

Cuối cùng, cập nhật cấu hình để thêm startBlock:

source:
  address: "0xabEFBc9fD2F806065b4f3C237d4b59D9A97Bcac7"
  abi: Token
  startBlock: 11565020

Tệp subgraph.yaml cuối cùng sẽ trông như thế này:

specVersion: 0.0.2
schema:
file: ./schema.graphql
dataSources:
- kind: ethereum/contract
 name: Token
 network: mainnet
 source:
   address: "0xabEFBc9fD2F806065b4f3C237d4b59D9A97Bcac7"
   abi: Token
   startBlock: 11565020
 mapping:
   kind: ethereum/events
   apiVersion: 0.0.4
   language: wasm/assemblyscript
   entities:
     - Token
     - User
   abis:
     - name: Token
       file: ./abis/Token.json
   eventHandlers:
     - event: TokenURIUpdated(indexed uint256,address,string)
       handler: handleTokenURIUpdated
     - event: Transfer(indexed address,indexed address,indexed uint256)
       handler: handleTransfer
   file: ./src/mapping.ts

Mappings tập lệnh Assembly Script

Tiếp theo, chúng ta có thể cấu hình mappings AssemblyScript để xử lý các sự kiện được định nghĩa trong subgraph.yaml .

Để tạo mã chúng ta sẽ cần, chúng ta có thể chạy lệnh codegen từ Graph CLI:

graph codegen

Lệnh này đã tạo một số mã trợ giúp trong một tệp nằm trong một thư mục có tên được tạo sẽ cung cấp cho chúng tôi sự an toàn khi nhập cũng như các chức năng cho phép chúng tôi tương tác với Graph Node cũng như bản thân hợp đồng thông minh.

Tiếp theo, mở src / mappings.ts để viết mapping logic cho các event mappings mà chúng ta đã xác định trong subgraph.yaml eventHandlers .

Mappings được viết bằng AssemblyScript, rất giống với TypeScript về cú pháp của nó. Các mapping này cho phép chúng ta đọc và lưu dữ liệu vào Graph Node. Bạn cũng có thể đọc dữ liệu từ các hợp đồng thông minh bằng cách tương tác trực tiếp với một blockchain.

Hai loại API đã sẵn sàng để sử dụng tại thời điểm này: thư viện Graph TypeScript ( @ graphprotocol / graph-ts ) và mã được tạo từ các tệp subgraph bằng graph codegen.

Thư viện @graphprotocol/graph-ts cung cấp các API sau:

  • Một API để làm việc với các hợp đồng thông minh, sự kiện, block, giao dịch và các giá trị blockchain.
  • Một store API để tải và lưu các thực thể từ và và Graph Node store.
  • Một log API để log các message vào đầu ra Graph Node và Graph Explorer.
  • IPFS API để tải tệp từ IPFS.
  • JSON API để phân tích cú pháp dữ liệu JSON.
  • Một crypto API để sử dụng các chức năng mật mã.
  • Primitives cấp thấp để chuyển giữa các hệ thống kiểu khác nhau như Ethereum, JSON, GraphQL và AssemblyScript.

Cập nhật src / mappings.ts bằng mã sau:

import {
TokenURIUpdated as TokenURIUpdatedEvent,
Transfer as TransferEvent,
Token as TokenContract
} from "../generated/Token/Token"

import {
Token, User
} from '../generated/schema'

export function handleTransfer(event: TransferEvent): void {
let token = Token.load(event.params.tokenId.toString());
if (!token) {
 token = new Token(event.params.tokenId.toString());
 token.creator = event.params.to.toHexString();
 token.tokenID = event.params.tokenId;
 token.createdAtTimestamp = event.block.timestamp;

 let tokenContract = TokenContract.bind(event.address);
 token.contentURI = tokenContract.tokenURI(event.params.tokenId);
 token.metadataURI = tokenContract.tokenMetadataURI(event.params.tokenId);
}
token.owner = event.params.to.toHexString();
token.save();

let user = User.load(event.params.to.toHexString());
if (!user) {
 user = new User(event.params.to.toHexString());
 user.save();
}
}

export function handleTokenURIUpdated(event: TokenURIUpdatedEvent): void {
let token = Token.load(event.params._tokenId.toString());
token.contentURI = event.params._uri;
token.save();
}

Các chức năng handleTransfer sẽ được gọi bất cứ lúc nào một token được tạo ra hoặc chuyển từ một phần khác.

Các chức năng handleTokenURIUpdated sẽ được gọi bất cứ lúc nào một chủ sở hữu của một bản cập nhật thẻ nội dung URI của một token.

Triển khai và thử nghiệm subgraph

Bây giờ, subgraph đã hoàn thành, nó đã sẵn sàng được triển khai tới Studio để thử nghiệm.

Trước khi chúng tôi triển khai, trước tiên chúng tôi cần xác thực. Để làm như vậy, hãy sao chép DEPLOY KEY vào clipboard của bạn. Tiếp theo, mở CLI của bạn và chạy lệnh sau:

graph auth --studio

Khi được nhắc, hãy dán vào DEPLOY KEY của bạn.

Bây giờ bạn có thể triển khai subgraph của mình bằng lệnh triển khai:

graph deploy --studio <subgraph-name>

Khi được nhắc nhập một version label, hãy chọn phiên bản cho subgraph.

Sau khi triển khai subgraph, Studio sẽ cập nhật giao diện người dùng mới cho phép bạn kiểm tra các truy vấn trong plaground GraphQL cũng như view logs và các chi tiết khác.

Tiêu chuẩn

Bây giờ subgraph đã được triển khai thành công, chúng ta có thể bắt đầu truy vấn dữ liệu.

Để làm như vậy, bạn có thể chạy các truy vấn GraphQL cho cả Người dùng và token, cũng như dữ liệu quan hệ giữa Người dùng và token. Để kiểm tra, hãy chạy truy vấn sau. Truy vấn này sẽ trả về một mảng dữ liệu NFT bao gồm URI nội dung, ID token, contentURI và metadata URI cho mỗi token:

  {
  tokens {
    id
    tokenID
    contentURI
    metadataURI
  }
}
Tiêu chuẩn

Bạn cũng có thể chuyển các đối số để trả về các tập hợp lựa chọn khác nhau, như bộ lọc và tìm kiếm toàn văn. Ví dụ: hãy đặt hàng các mặt hàng theo ngày tạo của chúng và trả lại chúng theo thứ tự giảm dần:

  {
  tokens(
    orderBy:createdAtTimestamp,
    orderDirection: desc
  ) {
    id
    tokenID
    contentURI
    metadataURI
  }
}

Tại thời điểm này, subgraph mới chỉ được triển khai cho Studio, có thể được coi như một môi trường thử nghiệm hoặc dàn dựng. Các bước tiếp theo sẽ là triển khai tới testnet hoặc mainnet.

Để triển khai mạng lưới, hãy nhấp vào nút Publish. Tại đây, bạn sẽ được nhắc chọn mạng lưới bạn muốn triển khai.

Hãy kiểm tra điều này bằng cách chuyển sang testnet Rinkeby và xuất bản subgraph ở đó. Đảm bảo rằng bạn được kết nối với đúng mạng lưới bằng ví MetaMask của mình.

Tiêu chuẩn

Để triển khai Rinkeby, bạn sẽ cần phải có test funds trong ví của mình. Nếu bạn chưa có, hãy truy cập https://faucet.rinkeby.io/ và nhận một ít trước.

Khi bạn đã nhận được test funds trong ví của mình, hãy thử xuất bản subgraph lên Mạng lưới Rinkeby.

Tiêu chuẩn

Tiếp theo, bạn sẽ được nhắc chấp thuận giá gas để xuất bản subgraph.

Tiêu chuẩn

Khi subgraph được xuất bản thành công, bạn sẽ thấy xác nhận cũng như liên kết để xem nó trong Graph Explorer:

Tiêu chuẩn

Khi bạn nhấp vào liên kết để xem trong Explorer, bạn sẽ thấy một chế độ xem mới của subgraph của mình với khả năng mô phỏng các truy vấn cũng như báo hiệu.

Tiêu chuẩn

Giám tuyển trên subgraph của bạn!

Bây giờ bạn đã xây dựng và xuất bản subgraph của mình, bạn cũng có thể được thưởng cho việc quản lý nó bằng cách báo hiệu trên subgraph của bạn bằng GRT. Để báo hiệu trên subgraph của bạn, bạn có thể sử dụng token Graph thử nghiệm (GRT). Để nhận token Graph thử nghiệm, bạn có thể tham gia Máy chủ Graph Discord và yêu cầu token trong kênh 🚰-testnet-faucet. Khi bạn đã sẵn sàng, bạn có thể báo hiệu trên subgraph của mình trên mainnet.

Tìm hiểu thêm về giám tuyển tại đây .

Nếu bạn có bất kỳ câu hỏi nào về việc xây dựng các subgraph, hãy tham gia The Graph Discord để hỏi các nhà phát triển khác hoặc đăng trên The Graph Forum để bắt đầu thảo luận!

Link gốc: https://thegraph.com/blog/building-with-subgraph-studio

THEGRAPHVN – Tham gia các cộng đồng The Graph Việt Nam tại:

Website tin tức

Telegram tin tức

Cộng đồng Telegram

Happy
Happy
0 %
Sad
Sad
0 %
Excited
Excited
0 %
Sleepy
Sleepy
0 %
Angry
Angry
0 %
Surprise
Surprise
0 %

Average Rating

5 Star
0%
4 Star
0%
3 Star
0%
2 Star
0%
1 Star
0%

Leave a Reply

Your email address will not be published. Required fields are marked *