> For the complete documentation index, see [llms.txt](https://docs.chiliz.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.chiliz.com/vi/phat-trien/nang-cao/theo-doi-chuyen-fan-token.md).

# Theo dõi chuyển nhượng Fan Token

Theo dõi sự di chuyển của Fan Token trên Chiliz Chain là một cách tuyệt vời để giám sát hoạt động của các token yêu thích của bạn. Bằng cách sử dụng nó như một thành phần cơ bản cho một dashboard tiềm năng, bạn có thể tổng hợp dữ liệu để cung cấp thông tin chi tiết về những gì đang được ưa chuộng và những gì không.

Khi theo dõi các giao dịch chuyển nhượng Fan Token™, bạn sẽ nhanh chóng gặp phải một thách thức: đọc dữ liệu trực tiếp từ blockchain rất hiệu quả cho trạng thái hiện tại ("*Số dư của ví X là bao nhiêu?*"), nhưng lại kém hiệu quả cho dữ liệu lịch sử ("*Hiển thị cho tôi mọi giao dịch chuyển nhượng liên quan đến ví X trong năm qua*").

Để giải quyết vấn đề này, chúng ta có thể sử dụng subgraph.

## Về subgraph

Subgraph là một API tùy chỉnh trích xuất dữ liệu từ một blockchain, xử lý và lưu trữ nó để có thể dễ dàng truy vấn.\
Thay vì yêu cầu blockchain quét hàng triệu khối mỗi lần bạn cần dữ liệu, subgraph lập chỉ mục các sự kiện cụ thể khi chúng xảy ra và lưu trữ chúng vào cơ sở dữ liệu.

Chiliz Chain hỗ trợ các giao thức lập chỉ mục chuẩn công nghiệp. Bạn có thể chọn nhà cung cấp phù hợp nhất với nhu cầu dự án của mình:

* [The Graph](https://thegraph.com/): Tiêu chuẩn công nghiệp cho việc lập chỉ mục phi tập trung. Nó cho phép bạn triển khai subgraph của mình lên một mạng phi tập trung gồm các indexer.
* [Goldsky](https://goldsky.com/): Dịch vụ lập chỉ mục được lưu trữ, hiệu suất cao. Hoàn toàn tương thích với code của The Graph (bạn thường có thể dùng cùng một đoạn code) nhưng cung cấp tốc độ lập chỉ mục nhanh hơn và các tính năng truyền dữ liệu theo thời gian thực.

Cả hai công cụ đều sử dụng cùng một framework phát triển, vì vậy hầu hết các bước trên trang này có thể áp dụng cho cả hai.

Hãy xem ví dụ về cách chúng ta có thể theo dõi các giao dịch chuyển nhượng của PSG Fan Token...

## 0. Chọn công cụ

Bạn có thể triển khai subgraph trên Chiliz Chain bằng **The Graph** (mạng phi tập trung) hoặc **Goldsky** (indexer được lưu trữ). Cấu trúc code là giống nhau; chỉ các lệnh triển khai là khác nhau.

Tất nhiên, bạn có thể tham khảo tài liệu riêng của từng công cụ:

{% embed url="<https://thegraph.com/docs/en/subgraphs/quick-start/>" %}

{% embed url="<https://docs.goldsky.com/subgraphs/deploying-subgraphs>" %}

## 1. Khởi tạo dự án subgraph

Cả The Graph và Goldsky đều cung cấp các phương pháp dựa trên CLI để tạo graph của bạn.

{% hint style="info" %}
The Graph có [Subgraph Studio](https://thegraph.com/studio/), nơi bạn có thể kết nối bằng ví Web3 của mình, sau đó tạo subgraph thông qua giao diện.

Goldsky cung cấp cho bạn một [dashboard](https://app.goldsky.com/) khi bạn tạo tài khoản, từ đó bạn có thể tạo subgraph.
{% endhint %}

### Cài đặt Graph CLI⁠

Trên máy tính của bạn, hãy chạy lệnh sau:

```bash
npm install -g @graphprotocol/graph-cli
```

{% hint style="info" %}
Bạn có thể tạo subgraph bằng công cụ CLI từ The Graph cho cả subgraph phi tập trung của The Graph, hoặc subgraph được lưu trữ bởi Goldsky.

Goldsky có công cụ CLI riêng, mà bạn sẽ cần nếu muốn triển khai trên Goldsky (xem bên dưới).
{% endhint %}

### Khởi tạo subgraph của bạn⁠

Bạn có thể sao chép trực tiếp từ trang subgraph của mình để bao gồm slug subgraph cụ thể của bạn:

```bash
graph init --studio <SUBGRAPH_SLUG>
```

Thẻ `--studio` là tùy chọn.

Trong ví dụ PSG Fan Token của chúng ta, có thể dùng:

```bash
graph init chiliz-psg-fantoken-followup
```

Bạn sẽ được nhắc cung cấp một số thông tin về subgraph của mình, như sau:

<figure><img src="/files/FVq2oDr3gV7ntjbD0Sop" alt=""><figcaption></figcaption></figure>

Bạn cần có hợp đồng đã được xác minh trên block explorer, và CLI sẽ tự động lấy ABI và thiết lập subgraph của bạn. Các cài đặt mặc định sẽ tạo ra một entity cho mỗi sự kiện.

{% hint style="warning" %}
Lưu ý:

* Nếu hợp đồng sử dụng proxy, như PSG Fan Token, thì hãy dùng địa chỉ hợp đồng implementation thay thế. Bạn sẽ thấy nó trong tab "Read/write contract" trên trang block explorer của hợp đồng. Ví dụ: [xem tại đây cho hợp đồng PSG Fan Token trên Chiliz Block Explorer](https://scan.chiliz.com/token/0xc2661815C69c2B3924D3dd0c2C1358A1E38A3105?tab=read_write_contract).
  * Nếu bạn phải nhập địa chỉ hợp đồng implementation của proxy, thì sau khi dự án được thiết lập, hãy vào tệp manifest (`subgraph.yaml`) và thay đổi địa chỉ hợp đồng thành địa chỉ của proxy.
* Nếu Start Block không được lấy tự động, bạn có thể nhập thủ công số khối nơi hợp đồng được tạo. Bạn có thể lấy thông tin này từ block explorer.
  {% endhint %}

{% hint style="info" %}
Khi thực hiện các thay đổi đối với subgraph, bạn sẽ chủ yếu làm việc với ba tệp:

* Manifest (`subgraph.yaml`): Xác định các nguồn dữ liệu mà subgraph của bạn sẽ lập chỉ mục.
* Schema (`schema.graphql`): Xác định dữ liệu bạn muốn truy xuất từ subgraph.
* AssemblyScript Mappings (`mapping.ts`): Dịch dữ liệu từ các nguồn dữ liệu của bạn sang các entity được định nghĩa trong schema.
  {% endhint %}

Mở `subgraph.yaml` và đảm bảo tệp manifest của bạn trỏ đến đúng mạng:

```yaml
dataSources:
  - kind: ethereum
    name: FanToken
    network: chiliz  # Use 'chiliz' for Mainnet, chiliz-testnet for Spicy
    source:
      address: "0x..." 
      abi: FanToken
```

### Biên dịch subgraph của bạn

Cuối cùng, biên dịch subgraph của bạn để đảm bảo không có lỗi:

```bash
graph codegen && graph build
```

## 2. Triển khai & Xuất bản

Sau khi subgraph được xây dựng, hãy chọn nhà cung cấp để triển khai.

{% columns %}
{% column %}
**The Graph**

1. Kết nối với [Subgraph Studio](https://thegraph.com/studio/), tạo subgraph và sao chép deploy key của bạn.
2. Xác thực qua CLI:\
   `graph auth --studio <DEPLOY_KEY>`
3. Triển khai subgraph của bạn lên Subgraph Studio:\
   `graph deploy --studio <SUBGRAPH_SLUG>`
4. Vào Studio, mở subgraph của bạn và nhấp "Publish" để đúc subgraph của bạn lên mạng phi tập trung.\
   Thao tác này sẽ kích hoạt một giao dịch qua ví của bạn để xuất bản subgraph dưới dạng NFT trên mạng Arbitrum One.
   {% endcolumn %}

{% column %}
**Goldsky**

1. Vào [Goldsky](https://app.goldsky.com/), tạo API key trong "Project Settings" và đăng nhập qua CLI.
2. Cài đặt lệnh `goldsky`:\
   `curl https://goldsky.com | sh`\
   Sau đó xác thực qua CLI:\
   `goldsky login`
3. Tải subgraph của bạn lên Goldsky:\
   `goldsky subgraph deploy / --path`

Subgraph trên Goldsky hoạt động ngay sau khi triển khai. Không cần bước xuất bản thêm.
{% endcolumn %}
{% endcolumns %}

{% hint style="info" %}
Bạn sẽ được yêu cầu nhập nhãn phiên bản. Bạn có thể nhập thứ gì đó như `v0.0.1`, nhưng bạn tự do chọn định dạng. Sau khi hoàn tất, bạn sẽ thấy subgraph bắt đầu đồng bộ hóa trên trang Studio.
{% endhint %}

{% hint style="info" %}
Các smart contract của The Graph đều trên [Arbitrum One](https://arbitrum.io/arbitrum-101), mặc dù subgraph của bạn đang lập chỉ mục dữ liệu từ Chiliz Chain.
{% endhint %}

## 3. Truy vấn Subgraph của bạn

Xin chúc mừng! Bây giờ bạn có thể bắt đầu truy vấn nó bằng cách truyền truy vấn GraphQL vào URL truy vấn của subgraph, có thể tìm thấy trong dashboard của dịch vụ bạn đã chọn.

Ví dụ:

{% columns %}
{% column %}
**The Graph**

`https://gateway-arbitrum.network.thegraph.com/api/[APIKEY]/subgraphs/id/[ID]`
{% endcolumn %}

{% column %}
**Goldsky**

`https://api.goldsky.com/api/public/project_[KEY]/subgraphs/[SLUG]/1.0.0/gn`
{% endcolumn %}
{% endcolumns %}

Bây giờ, bạn chỉ cần điền thông tin chi tiết của mình để bắt đầu gửi các truy vấn GraphQL đến endpoint này.

## Phụ lục

### Truy vấn mẫu

Truy vấn này hiển thị tất cả các giao dịch của PSG Fan Token.

```typescript
const axios = require('axios');

// The GraphQL query (Identical for both providers)
const graphqlQuery = `{
  transfers {
    from
    to
    value
    transactionHash
  }
}`;

// Choose the right URL format depending on the provider:
// const queryUrl = 'https://gateway-arbitrum.network.thegraph.com/api/[api-key]/subgraphs/id/[id]'
// const queryUrl = 'https://api.goldsky.com/api/public/project_[key]/subgraphs/[slug]/1.0.0/gn';

const graphQLRequest = {
  method: 'post',
  url: queryUrl,
  data: {
    query: graphqlQuery,
  },
};

// Send the GraphQL query
axios(graphQLRequest)
  .then((response) => {
    // Handle the response here
    const data = response.data.data
    console.log(data)

  })
  .catch((error) => {
    // Handle any errors
    console.error(error);
  });
```

### Code mẫu

```json
{
  "data": {
    "transfers": [
      {
        "from": "0x26a3e78fa4d2cbebf6b59b2f84b8fb7c61b52d28",
        "to": "0xdca23d02923d01779fb22959bd2575d64eab4535",
        "value": "1500",
        "transactionHash": "0x000309e9cd3f550e8965381bbd83a35c5cee18f26c33a357f9dbb57450d594ea"
      },
//      ...
  }
}
```

Truyền nội dung này vào URL truy vấn sẽ trả về kết quả sau:

```json
{
  transfers {
    from
    to
    value
    transactionHash
  }
}
```

## Tài nguyên bổ sung

Để biết thêm thông tin về việc truy vấn dữ liệu từ subgraph của bạn với GraphQL:

{% embed url="<https://thegraph.com/docs/en/subgraphs/querying/best-practices/>" %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.chiliz.com/vi/phat-trien/nang-cao/theo-doi-chuyen-fan-token.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
