0 0
Read Time:17 Minute, 13 Second

Hướng dẫn Bắt đầu Với The Graph

TL; DR: The Graph là một giao thức lập chỉ mục và truy vấn cho phép các nhà phát triển xây dựng các API với dữ liệu từ blockchain. Dữ liệu từ các API này có thể được truy vấn thông qua API truy vấn GraphQL . Để xây dựng một API phi tập trung, một nhà phát triển tạo một subgraph xác định:

  • nguồn dữ liệu (hợp đồng thông minh)
  • dữ liệu cần được lập chỉ mục
  • những sự kiện bạn muốn lắng nghe
  • Resolvers để thực thi khi các sự kiện cụ thể được phát ra, biến đổi dữ liệu thô từ blockchain và lưu nó vào The Graph Node.

Tài nguyên dành cho nhà phát triển để xây dựng bằng The Graph

Bạn có thể tìm thấy hướng dẫn từng bước để xây dựng subgraph mà chúng tôi đang theo dõi trong bài đăng này .

Bạn có thể tìm thấy một cheat sheet để làm việc với AssemblyScript tại đây.

Kiểm tra và truy vấn subgraph mà chúng tôi sẽ xây dựng trong bài đăng này ở đây.

Ảnh chụp màn hình 2022-03-01 lúc 9,18,30 sáng.png

Là một nhà phát triển, tại sao bạn nên quan tâm?

The Graph đã trở thành một trong những giao thức yêu thích của tôi để làm việc với thế giới web3. Khi tôi bắt đầu sử dụng The Graph, cảm giác giống như lần đầu tiên tôi bắt đầu sử dụng các API web và khám phá ra một lớp phát triển mới. Với The Graph, bạn có thể bắt đầu làm việc với dữ liệu thực từ blockchain và sử dụng dữ liệu này để tạo ra những trải nghiệm hữu ích và đẹp mắt. The Graph là một trong những phần quan trọng nhất của web3 stack, cho phép các nhà phát triển dễ dàng tương tác với dữ liệu blockchain theo cách mà trước đây không thể thực hiện được. Trong bài đăng này, tôi hy vọng sẽ trả lời những câu hỏi sau:

  1. The Graph là gì?
  2. The Graph đóng vai trò gì trong web3 stack?
  3. Làm thế nào để The Graph thực sự hoạt động?
  4. Làm cách nào tôi có thể sử dụng The Graph để xây dựng API web3?

The Graph là gì?

The Graph là một giao thức để lập chỉ mục và truy vấn dữ liệu từ các blockchain khác nhau với GraphQL. Giao thức cho phép truy vấn thông tin dễ dàng và hiệu quả từ bất kỳ hợp đồng thông minh nào được triển khai trên blockchain và là lớp API của web3 stack. Nói một cách dễ hiểu, điều đó có nghĩa là bạn có thể sử dụng The Graph để xây dựng một API phi tập trung với dữ liệu từ blockchain. Các API này, được gọi là subgraph, có thể được sử dụng bởi bất kỳ ai. Khám phá những gì ở đó bằng cách sử dụng subgraph explorer.

Lập chỉ mục thường đề cập đến quá trình biến dữ liệu không có thứ tự thành một thứ tự sẽ tối đa hóa hiệu quả của truy vấn được thực hiện dựa trên dữ liệu đó. Để đọc thêm về lập chỉ mục, hãy xem bài đăng này trình bày về cách hoạt động lập chỉ mục.

Hệ sinh thái của The Graph được tạo thành từ bốn vai trò: developers, indexers, delegators, và curators. Indexers stake Graph token gốc, $ GRT và được khuyến khích lập chỉ mục chính xác các subgraph thông qua phần thưởng truy vấn và lập chỉ mục. Delegators stake $ GRT cho Indexers và kiếm một phần phí truy vấn của Indexers. Curators báo hiệu một subgraph để chỉ ra rằng chúng có chất lượng cao và nên được lập chỉ mục bởi The Graph Network. Đọc thêm về các vai trò ở đây.

Một Quick Refresher trên Blockchain

Blockchain là một cơ sở dữ liệu công khai được chia sẻ bởi một mạng lưới máy tính phân tán. Blockchain là một chuỗi dữ liệu và trạng thái được lưu trữ theo lô, được gọi là block. Ghi vào blockchain, như thay đổi trạng thái của một biến hoặc lưu dữ liệu mới vào blockchain, được gọi là giao dịch. Các giao dịch được ký bằng mật mã bởi một địa chỉ ví và đây là lý do tại sao bạn được yêu cầu kết nối ví trước khi tương tác với hợp đồng thông minh hoặc dapp. Các giao dịch này và chữ ký của chúng và được lưu trữ vĩnh viễn trên blockchain, có thể truy cập được bởi bất kỳ ai thực hiện thao tác đọc.

Có hai loại giao dịch: Giao dịch từ ví này sang ví khác và giao dịch triển khai hợp đồng. Cả hai giao dịch này đều được ‘ghi’ vào blockchain thay đổi trạng thái. Các giao dịch này và siêu dữ liệu liên quan của chúng là thông tin mà nhà phát triển có thể muốn truy vấn. Bạn muốn truy vấn chủ sở hữu hiện tại của NFT mà bạn đã để mắt tới? Bạn muốn truy vấn 5 giao dịch gần nhất tại một địa chỉ ví? Bạn có thể tạo một subgraph cho điều đó.

Truy vấn dữ liệu blockchain thực sự khó

Dữ liệu mà bạn có thể truy vấn dựa trên blockchain Ethereum chia thành hai loại: dễ và khó. Có một số thông tin mà bạn có thể truy vấn để sử dụng các phương thức getter tích hợp sẵn của hợp đồng thông minh. Ví dụ: nếu hợp đồng thông minh cho bộ sưu tập NFT đang sử dụng triển khai token ERC-721 , thì bất kỳ ai cũng có thể truy cập các phương pháp để có được chủ sở hữu của NFT dựa trên token và số lượng token tại một địa chỉ cụ thể. Các phương thức getter này cho phép chúng tôi truy vấn dữ liệu dễ dàng.

Nếu bạn muốn truy vấn thông tin cụ thể liên quan đến lọc, mapping relationships và tìm kiếm theo đặc điểm, bạn sẽ phải dành một chút thời gian để thực hiện các thao tác này theo cách thủ công ở phía máy khách sau khi đọc thông tin từ blockchain. Do bản chất và cấu trúc của một blockchain, dữ liệu mà bạn có thể muốn truy vấn có thể nằm ở các block khác nhau và không có cơ chế tích hợp nào để xác định, phân loại hoặc truy vấn cho dữ liệu đó.

Cuộc sống trước khi có The Graph

Trước khi giải thích cách thức hoạt động của The Graph, tôi thấy bắt đầu dễ dàng hơn bằng cách giải thích việc lập chỉ mục và truy vấn một blockchain như Ethereum sẽ như thế nào nếu không có giao thức. Giả sử bạn muốn có một NFT pfp mới. Tôi là một fan hâm mộ lớn của Fame Lady Squad , vì vậy hãy lấy bộ sưu tập của họ làm ví dụ.

Ảnh chụp màn hình 2022-02-28 lúc 1.50.20 PM.png

Ảnh chụp màn hình 2022-02-28 lúc 1.50.26 chiều.pngNếu tôi muốn truy vấn xem Ladies nào đang tồn tại với mái tóc thẳng, mắt nâu, da sáng và khuôn mặt tươi cười, tôi sẽ phải lấy từng điểm duy nhất tokenID maps tới một Lady, đọc siêu dữ liệu được lưu trữ trong IPFS, tổng hợp dữ liệu và sau đó viết chương trình lọc những phù thủy phù hợp với mô tả của tôi. Ngoài việc tốn nhiều công sức thủ công, quá trình này sẽ cực kỳ chậm.

Tùy chọn khác của tôi sẽ là chạy máy chủ của riêng tôi, xử lý và lưu trữ các giao dịch được thực hiện với blockchain, lưu chúng vào cơ sở dữ liệu, lập chỉ mục cơ sở dữ liệu của tôi để có thời gian truy vấn hợp lý và xây dựng một API để làm cho dữ liệu này có thể truy cập được thông qua một điểm cuối có thể xem như thế này:

https://api.fameladysquad.com/ladies/{hairstyle}.

Cả hai tùy chọn này đều không khả thi hoặc hiệu quả đối với các nhà phát triển nếu không có nguồn lực kỹ thuật lớn. Hệ sinh thái web3 cần một cách để thực hiện các truy vấn phức tạp một cách nhanh chóng và hiệu quả đối với blockchain. Đó là nơi mà The Graph xuất hiện.

Tạo một Subgraph dễ dàng một cách đáng ngạc nhiên

Bất kỳ ai cũng có thể sử dụng The Graph để lập chỉ mục các giao dịch cụ thể mà họ muốn cung cấp để truy vấn. Người dùng làm điều này bằng cách tạo một subgraph. The Graph dựa trên API GraphQL, vì vậy nếu bạn đã làm việc với GraphQL, một số điều này có thể cảm thấy rất quen thuộc.

Tổng quan ngắn gọn trước khi đi vào từng bước về cách tạo một subgraph: Dựa trên (các) địa chỉ hợp đồng mà bạn muốn truy vấn dữ liệu, bạn xác định lược đồ (schema) của mình. Lược đồ là một cấu trúc dữ liệu được xây dựng xung quanh dữ liệu mà bạn muốn truy vấn.

Sau đó, bạn xác định sự kiện nào cần lắng nghe và xác định handlers sự kiện để chuyển đổi dữ liệu thô được đọc từ blockchain thành các thuộc tính mà bạn muốn truy vấn. Các ánh xạ này tương tự như các trình phân giải GraphQL ở chỗ chúng tìm nạp dữ liệu từ nguồn dữ liệu đã chọn và sau đó áp dụng một số logic để đặt chúng ở định dạng chính xác cho truy vấn.

Bên trong một Subgraph

CLI của The Graph giúp bạn bắt đầu thực sự dễ dàng, vì chúng cung cấp cho bạn một số mã boiler plater. Bạn chỉ phải tương tác với 3 file trong kho của mình để triển khai một subgraph:

  • Manifest ( subgraph.yaml) – Tệp kê khai xác định (các) nguồn dữ liệu mà các subgraph của bạn sẽ lập chỉ mục.
  • Schema ( schema.graphql) – Giản đồ GraphQL xác định dữ liệu nào bạn muốn lấy từ subgraph.
  • AssemblyScript Mappings ( mapping.ts) – Đây là mã dịch dữ liệu từ các nguồn dữ liệu của bạn sang các thực thể được xác định trong lược đồ.

Xây dựng một Subgraph

Không có cách nào tốt hơn để học hơn là làm. Chúng ta sẽ theo dõi hội thảo subgraph của tôi để tạo một subgraph cho Fame Lady Squad, một dự án của NFT. Với subgraph này, người dùng sẽ có thể truy vấn thông tin về từng Lady trong bộ sưu tập này.

Một số tài nguyên mà bạn có thể thấy hữu ích:

  • Bạn có thể tìm thấy mã cho dự án này tại đây.
  • Một cheat sheet để làm việc với AssemblyScript có thể được tìm thấy tại đây.
  • Kiểm tra và truy vấn subgraph mà chúng tôi sẽ xây dựng ở đây.
Ảnh chụp màn hình 2022-02-28 lúc 1.02.24 chiều.png

Lưu ý: The Graph cung cấp hai sản phẩm: Hosted Service và Subgraph Studio. Subgraph Studio là phiên bản hoàn toàn phi tập trung của Hosted Servicen. Hosted Service cuối cùng sẽ ngừng hoạt động sau khi Studio đạt được tính năng tương đương. Vì siêu dữ liệu của dự án của chúng tôi được lưu trữ trong IPFS, chúng tôi sẽ sử dụng Hosted Service.

Bạn có thể spin up một subgraph chỉ trong vài phút với sự trợ giúp của CLI của The Graph.

1. Đi đến Hosted Service và đăng ký với Github.

2. Điều hướng đến “My Dashboard”, sau đó nhấn “Add subgraph” và đặt tên cho nó. Các chi tiết khác là tùy chọn. Sau đó nhấn “Create Subgraph” ở cuối trang. Bạn sẽ nhận thấy mình được cấp một token truy cập mà bạn sẽ cần để triển khai subgraph của mình sau này.

Ảnh chụp màn hình 2022-02-28 lúc 12.39.50 PM.png

3. Cài đặt Graph CLI bằng lệnh này:

npm install -g @graphprotocol/graph-cli

4. Khởi tạo subgraph của bạn thông qua lệnh CLI:

graph init --from-contract 0xf3E6DbBE461C6fa492CeA7Cb1f5C5eA660EB1B47 \ --contract-name Token --index-events

Bằng cách sử dụng index-events flag, CLI sẽ tự động tạo một số mã dựa trên các sự kiện được phát ra từ địa chỉ hợp đồng mà bạn đã chuyển vào.

Bạn sẽ được nhắc điền vào các chi tiết bổ sung về subgraph của mình như giao thức, sản phẩm, v.v. Khi bạn điền vào subgraph name, nó phải ở định dạng sau: yourgithubhandlesubgraphname (tên bạn đã sử dụng khi tạo subgraph ở bước 2 .)

graph-1.png

5. Xác định schema của bạn bằng ngôn ngữ định nghĩa giao diện GraphQL. Sự khác biệt chính duy nhất giữa GraphQL schema tiêu chuẩn và The Graph là @entity chỉ thị cũng như các kiểu dữ liệu duy nhất cho The Graph. Để có cái nhìn tổng quan đầy đủ, hãy xem trang này từ tài liệu. Trong schema, bạn nên lập mô hình các thực thể và thuộc tính của chúng mà bạn muốn tạo sẵn để truy vấn dựa trên mô hình dữ liệu của mình. Bạn nên tránh mô hình hóa các thực thể xung quanh các sự kiện. Cách bạn lập mô hình các thực thể trong lược đồ hoàn toàn tùy thuộc vào bạn và những gì bạn đang cố gắng xây dựng.

Vì chúng tôi đang xây dựng một API cho Fame Lady Squad, tôi sẽ lập mô hình các thuộc tính mà bạn có thể truy vấn xung quanh siêu dữ liệu có sẵn cho bộ sưu tập này.

Lưu ý: Để xem những thuộc tính nào có sẵn dưới dạng siêu dữ liệu, bạn có thể lấy IPFS hash và đọc tất cả các thuộc tính. Bài viết này giải thích cách xem siêu dữ liệu của token / bộ sưu tập bằng cách sử dụng IPFS hash ..)

graph-2.png

Mẹo: Hãy ném cái này vào bộ định dạng JSON online để có thể xem dữ liệu này dễ dàng hơn.

SAO CHÉPCOPY

type Lady @entity {
  id: ID!
  tokenID: BigInt!
  tokenURI: String! 
  owner: User
  name: String 
  faceExpression: String
  hairStyle: String
  skinColor: String
  eyeColor: String
}

Vì tôi muốn có thể truy vấn thông tin về chủ nhân của một Lady, chúng tôi sẽ tạo một entity User có nguồn gốc từ field Ladyat Owner.

Để biết thêm về cách khai báo mối quan hệ giữa các entity, hãy xem tài liệu này. Đảm bảo rằng bạn lưu các thay đổi của mình trong tệp này khi hoàn tất.

type User @entity {
  id: ID! # wallet address 
  Ladies: [Lady!] @derivedFrom(field: "owner")
}

6. Để lấy một số mã miễn phí ra khỏi box bằng cách chạy lệnh này: graph codegen. Lệnh này sẽ cung cấp cho bạn một số mã AssemblyScript trong file mappings.ts của bạn cũng như mã trong subgraph.yaml file của bạn. Mã được tạo đến từ sự kết hợp giữa schema của bạn và các ABI theo hợp đồng được thu thập tự động từ nguồn dữ liệu được xác định trong file subgraph.yaml của bạn.

graph-3.png

7. Trong file .yaml, bạn sẽ xác định như sau:

  • Các sự kiện bạn muốn lắng nghe. Trong dataSources.mapping.eventHandlers, xóa bất kỳ sự kiện nào mà bạn không muốn nghe. Với mỗi sự kiện, có một function handler được đặt tên. Đây là những function mà bạn sẽ xác định trong mappings.ts đó.
  • Block bắt đầu mà indexer sẽ bắt đầu lập chỉ mục. Nếu bị bỏ qua, subgraph của bạn sẽ bắt đầu tìm kiếm các sự kiện của bạn bắt đầu từ block đầu tiên. Tìm giá trị này trên etherscan bằng cách đi tới trang đầu tiên của giao dịch, nhấp vào transaction ID và tìm số block.
graph-4.png
  • Tên của các entity bạn muốn truy vấn thông tin. Cập nhật tên của các entity của bạn để khớp với các entity bạn đã xác định trong schema của mình tại dataSources.mapping.entities.
specVersion: 0.0.2
schema:
  file: ./schema.graphql
dataSources:
  - kind: ethereum
    name: Token
    network: mainnet
    source:
      address: "0xf3E6DbBE461C6fa492CeA7Cb1f5C5eA660EB1B47"
      abi: Token
      startBlock: 12813031
    mapping:
      kind: ethereum/events
      apiVersion: 0.0.5
      language: wasm/assemblyscript
      entities:
        - Lady
        - User
      abis:
        - name: Token
          file: ./abis/Token.json
      eventHandlers:
        - event: Transfer(indexed address,indexed address,indexed uint256)
          handler: handleTransfer
      file: ./src/mapping.ts

8. Cuối cùng, viết các mappings trong AssemblyScript biến dữ liệu Ethereum thô được đọc từ blockchain thành các entity được xác định trong schema của bạn. Đây là phần khó nhất vì có một số khái niệm chỉ có ở The Graph Node. Kiểm tra cheat sheet này để giúp bạn viết các schema của mình, hoàn chỉnh với các ví dụ. Ý tưởng lớn ở đây là làm việc với dữ liệu thô từ blockchain và áp dụng logic để biến đổi nó nhằm đáp ứng nhu cầu của schema của bạn.

Ví dụ: Theo ví dụ về Fame Lady mà chúng ta đã nói ở trên, dữ liệu thô mà chúng ta sẽ nhận được từ blockchain sẽ sử dụng các phương thức getter tiêu chuẩn với việc triển khai ERC-721. Do đó, dữ liệu duy nhất có thể đọc trực tiếp từ blockchain sẽ là tokenID, và owner. Trong mapping của chúng tôi, chúng tôi phải làm việc với hai phần dữ liệu này để giải quyết phần còn lại của các thuộc tính : hairStyleskinColoreyeColor, và faceExpression. Bằng cách sử dụng tokenID, , chúng tôi sẽ cần sử dụng IPFS hash để xem siêu dữ liệu này được lưu trữ ở đâu. Khi chúng ta truy cập vào điều này, chúng ta cần lưu dữ liệu này vào một biến, sau đó lưu biến này vào The Graph node để truy vấn nó có thể truy cập được. Kiểm tra mã nguồn cho điều này ở đây.

import {
  Transfer as TransferEvent
} from "../generated/Token/Token";
import { Lady, User } from "../generated/schema";
import { log, ipfs, json, JSONValue } from "@graphprotocol/graph-ts";

const ipfsHash = "QmTngWTnURuyiz1gtoY33FKghCiU2uQusXpnUc36QJNKsY";

export function handleTransfer(event: TransferEvent): void {
  let lady = Lady.load(event.params.tokenId.toString());

  if (lady == null) {
    lady = new Lady(event.params.tokenId.toString());
    lady.tokenID = event.params.tokenId;
    lady.tokenURI = "/" + event.params.tokenId.toString();

    let metadata = ipfs.cat(ipfsHash + lady.tokenURI);
    if (metadata) {
      const value = json.fromBytes(metadata).toObject();
      if (value) {
        const name = value.get("name");
        if (name) {
          lady.name = name.toString();
        }
      }
      let attributes: JSONValue[];
      let ladyAttributes = value.get("attributes");
      if (ladyAttributes) {
        attributes = ladyAttributes.toArray();

        for (let i = 0; i < attributes.length; i++) {
          let item = attributes[i].toObject();
          let trait: string;
          let traitName = item.get("trait_type");
          if (traitName) {
            trait = traitName.toString();
            let value: string;
            let traitValue = item.get("value");
            if (traitValue) {
              value = traitValue.toString();
              if (trait == "Hair") {
                lady.hairStyle = value;
              }
              if (trait == "Skin") {
                lady.skinColor = value;
              }
              if (trait == "Eyes") {
                lady.eyeColor = value;
              }
              if (trait == "Face Expression") {
                lady.faceExpression = value;
              }
            }
          }
        }
      }
    }
  }
  lady.owner = event.params.to.toHexString();
  lady.save();

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

9. Nếu bạn đã làm được đến mức này, hãy tự vỗ về mình! Bây giờ bạn đã sẵn sàng triển khai subgraph của mình để bạn có thể sử dụng API trong dapp của mình. Đầu tiên, bạn phải xác thực. Sao chép token truy cập của bạn bằng cách điều hướng đến “My Dashboard”. Sau đó, chạy lệnh này trong terminal: graph auth https://api.thegraph.com/deploy/ <ACCESS_TOKEN>

10. Triển khai subgraph của bạn bằng lệnh này: yarn deploy

11. Khi subgraph được triển khai, giao diện người dùng trên The Graph dashboard sẽ cập nhật và bạn sẽ có thể thực hiện các truy vấn trong playground tương tự như GraphQL playground.

Ảnh chụp màn hình 2022-02-28 lúc 12,53,46 chiều.png

Wrap lại

Bây giờ bạn đã triển khai subgraph của mình, bạn có thể truy cập nó từ ứng dụng khách của mình giống như bạn làm với điểm cuối API GraphQL thông thường. Bất kỳ ai cũng có thể sử dụng API của bạn và sẽ có thể thực hiện các cuộc gọi đến nó và hiển thị dữ liệu này tới giao diện người dùng của họ.

Nếu bạn thích phong cách giảng dạy của Camila Ramos (Tác giả bài viết này) hoặc muốn tìm hiểu thêm về The Graph, cô ấy sẽ tạo một vài content cho The Graph trong những ngày tới. Theo dõi Camila Ramos trên Twitter và Hashnode để được thông báo khi có hướng dẫn của cô ấy. Bạn có thể tìm thấy Camila Ramos trên tất cả các nền tảng @camiinthisthang.

Bài viết gốc từ Camila Ramos

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.