---
title: "什麼是 subgraph？（指南）"
description: "了解 subgraph 的運作方式、使用場景，以及如何開始建置"
---

# 什麼是 subgraph？（指南）

**Subgraph 彙整特定應用程式的區塊鏈資料，讓全端開發者能快速存取。**

區塊鏈是按時間順序記錄資料，不會考量特定應用程式的需求。過去，開發者若想顯示與其智能合約相關的資訊，就必須使用 JSON-RPC 逐區塊、逐交易地搜尋。

Subgraph 讓開發者能以簡單的方式即時存取鏈上資料，並協助開發者為使用者建立實用的應用程式互動功能。

本文將探討 subgraph，包括其功能、常見應用、優勢、可用的服務提供商，以及協助開發者上手使用 subgraph 的資源。

## **什麼是 Subgraph？**

**Subgraph 彙整特定應用程式的區塊鏈資料，讓前端開發者能快速存取。**

Subgraph 透過 [GraphQL ](https://www.alchemy.com/dapps/graphql) API 開放給開發者使用，讓使用者能即時查詢其合約上發生的交易資料。對於需要建構強大前端介面的複雜自訂智能合約開發者來說，subgraph 特別有用。

舉例來說，若要查詢過去 24 小時內某個 [Uniswap](https://www.alchemy.com/dapps/uniswap) v3 流動性池中的所有交易，Uniswap 只需定義其 schema、將事件資料建立索引以產生 subgraph，然後使用產生出來的 GraphQL API 來查詢其 subgraph，即可靈活且有效率地取得區塊鏈資料。

Subgraph 讓開發者能依據自身需求篩選與排序資料，只擷取對其 dapp 重要的資訊。相較於直接向[全節點或 archive 節點](https://www.alchemy.com/overviews/full-vs-light-vs-archive-nodes)請求資料，subgraph 透過預先編譯與索引資料來加快查詢速度，讓資料查詢更有效率。

### Subgraph 如何運作？

**Subgraph 的「mapping」是一些腳本，用來指示節點依照 subgraph 的「manifest」，從每個新發現的區塊中擷取相關資料。這些新資料接著會被加入 subgraph，並依照 subgraph 的「schema」所定義的方式，透過 GraphQL 呼叫提供給開發者使用。**

首先，我們必須理解 subgraph 的基本架構、其組成部分，以及它們彼此如何互動。

#### 什麼是 Subgraph manifest？

**manifest** 包含資料來源、模板，以及一些 subgraph 的中繼資料（例如說明、儲存庫等）。manifest 定義了 subgraph 所索引的智能合約、這些智能合約上的相關事件，以及如何將事件資料轉換為 Graph node 儲存並可供查詢的實體。

#### 什麼是 Subgraph schema？

**schema** 說明了 subgraph 資料的組織方式，以及如何用 GraphQL 查詢這些資料。schema 應定義各個實體以及每個實體的結構化資料。

舉例來說，若你正在為 Uniswap v3 池建立即時分析用的 subgraph，你的實體可能會是一個池，而 schema 就會定義該池的資產、名稱、智能合約地址、手續費等。

#### 什麼是 Subgraph mapping？

**mapping** 是一段 AssemblyScript 程式碼，每當伺服器找到 manifest 中指定的事件時就會被呼叫。mapping 定義了負責轉換事件或呼叫傳來的資料、並將其儲存到 Graph node store 的事件處理器。

### **Subgraph 有哪些常見用途？**

**Subgraph 經常被用於 DeFi、NFT、DAO 以及其他各種鏈上應用程式。**

#### **自訂智能合約索引**

想為自訂智能合約（特別是那些不遵循 ERC1155 或 ERC721 NFT 等標準的合約）建立資料索引的區塊鏈應用程式開發者，經常會建立 subgraph。對於需要搜尋、篩選等功能的前端使用者介面開發者來說，自訂索引也格外重要。

#### **去中心化金融（DeFi）**

[DeFi subgraph](https://www.alchemy.com/dapps/best/defi-subgraphs) 常被用於應用程式中，以索引並查詢代幣價格、匯率、流動性、交易量等區塊鏈資料。使用 subgraph 的 DeFi 應用程式能讓使用者即時取得最新資料，並促成高效率的交易與其他金融操作。

#### **非同質化代幣（NFT）**

[NFT subgraph](https://www.alchemy.com/dapps/best/nft-subgraphs) 可用來索引並查詢 NFT 資料，例如結合鏈下資料的所有權、來源，以及交易紀錄。這能協助 NFT 市場與其他應用程式，為買賣及交易 NFT 的使用者提供更順暢的體驗。

#### **去中心化自治組織（DAO）**

與中心化機構不同，去中心化自治組織（[DAO](https://www.alchemy.com/dapps/top/daos)）是由分散社群運作的組織。由於大部分 DAO 的決策都在鏈上進行，[DAO subgraph](https://www.alchemy.com/dapps/best/dao-subgraphs) 對於讓成員能正確投票並檢視資料而言至關重要。

#### **遊戲**

[以區塊鏈為基礎的遊戲](https://www.alchemy.com/overviews/play-to-earn-games) 經常需要即時存取使用者帳戶餘額、遊戲狀態、遊戲內物品等資料。這些資料可透過 subgraph 建立索引並查詢，讓遊戲玩法及其他功能更有效率、反應更靈敏。

## **使用 Subgraph 開發有哪些好處？**

對全端開發者來說，subgraph 是一種非常簡單的區塊鏈資料索引範式。只要寫一些 AssemblyScript 程式碼即可上手！若使用託管方案，還會附帶後端，開發者不需要自行運行資料庫和伺服器。

以下是使用 subgraph 開發的其他幾項優點：簡單性、相容性，以及韌性。

### **1. Subgraph 的簡單性**

Subgraph 是可供查詢的特定應用程式資料資料庫。使用託管的 subgraph 作為資料後端，能為開發者省下自行建立資料庫的時間與成本。

Subgraph 分別以 AssemblyScript 和 GraphQL 來定義與存取。對全端開發者而言，這些通常是熟悉的範式，讓 subgraph 對於新進的 web3 開發者來說也容易上手。

### **2. 與多個區塊鏈的相容性**

Subgraph 的優勢在於能與眾多相容於 EVM 的區塊鏈網路搭配運作，讓開發者能從多個來源取得資料。因此，去中心化應用程式可以被設計成能跨多個區塊鏈網路運行，提升彈性與可擴展性。

雖然每個 subgraph 只從一條鏈擷取資料，但開發者可以使用類似的 schema 與 mapping，以最少的工程成本將 subgraph 部署到不同的受支援區塊鏈網路上。透過 graph-cli 或支援此功能的服務提供商，subgraph 查詢也可以跨鏈進行。

### 3. 更高的安全性與韌性

使用去中心化的索引協定來查詢 subgraph，讓開發者可以選擇為其應用程式維持完整的全端去中心化。雖然使用去中心化版本與託管版本的 subgraph 之間存在效能上的取捨，但擁有多種選項能讓開發者針對特定使用情境進行優化。

透過去中心化索引器，應用程式可以藉由執行來自不同服務提供商的多個 subgraph，降低對單一資料來源的依賴，使其較不容易因單一來源遭受攻擊或停機而受影響。Graph 協定即提供此類服務。

Subgraph 也可以被設計成過濾掉潛在有害的資料，為應用程式增加一層額外的保護。透過運行多個 subgraph，應用程式的資料基礎架構可以變得更安全、更具韌性。

## **使用 Subgraph 建構應用程式有哪些取捨？**

**雖然現有的 subgraph 使用起來很簡單，但建立與除錯它們可能相當複雜，而且可能受限於成本或設計上的考量。**

### 1. Subgraph 開發與除錯

要有效使用 subgraph，開發者必須學習一套複雜的生態系統，並因缺乏工具與可見性而面臨 subgraph 除錯上的挑戰。使用 subgraph 開發的另一項挑戰是，mapping 會被轉譯成 WebAssembly，這增加了除錯 subgraph 的難度！

### **2. 自訂化的限制**

雖然 subgraph 在索引哪些資料、以及如何查詢方面提供了相當大的彈性，但自訂化程度可能有限。如果 dapp 有非常嚴格的索引或查詢需求，可能就需要完全客製化的資料索引與轉換解決方案。

### **3. 成本**

對於需要選擇新技術解決方案的應用程式開發者來說，成本是一項重要的決策因素。雖然相較於 JSON-RPC，使用 subgraph 能讓查詢區塊鏈資料變得更容易、更快速，但它會帶來額外的成本，包括支付索引與查詢服務的費用，長期累積下來可能相當可觀。

### 4. 索引速度

資料量龐大的應用程式開發者，經常將索引速度列為使用 subgraph 時的挑戰之一。索引速度不僅會隨資料的數量與複雜程度而變化，也會因你所使用的索引解決方案而有所不同。

## **哪些是最好的 Subgraph 服務提供商？**

**在這個領域中，較知名的服務提供商包括 The Graph、Goldsky，以及 ChainStack。**

### **The Graph**

[The Graph](https://www.alchemy.com/dapps/the-graph) 讓開發者能以具擴展性且符合成本效益的方式，產生並查詢區塊鏈資料的子集合。

Subgraph 服務提供商可以利用 The Graph 的工具與基礎架構來建立、部署並維護 subgraph，開發者則可以輕鬆透過 The Graph 的 GraphQL API 進行查詢。The Graph 中的 subgraph 服務被設計成具彈性且可設定，讓開發者能索引並查詢來自任何區塊鏈或資料來源的資料。

**要將 subgraph 部署到 The Graph，主要有三種方式：**

1. 自行架設
1. The Graph Hosted Service
1. Subgraph Studio

#### **1. 自行架設**

開發者可以自行架設組成 subgraph 生態系統的各項元件（\`graph-node\` 程式碼庫），並將其 subgraph 部署到這套自行架設的系統上。

#### **2. The Graph 的 Hosted Service**

如果開發者不想自行運行基礎架構，可以免費將其 subgraph 部署到 The Graph Hosted Service。這對新成立的小型團隊來說是不錯的選擇，因為使用簡單，而較低的可靠度和較慢的速度是可以接受的。不過，[The Graph 的 hosted service 目前正逐步淘汰中](https://thegraph.com/blog/sunsetting-hosted-service/)。

#### **3. Subgraph Studio**

開發者可以透過 [Subgraph Studio](https://thegraph.com/docs/en/deploying/subgraph-studio/) 產品，將其 subgraph 部署到 The Graph 的去中心化網路，此方式會用到 The Graph 的代幣。不過，這種部署方式並不支援託管方案的所有功能（例如沒有 IPFS 功能，且支援的鏈較少）。

### **Goldsky**

[Goldsky](https://www.alchemy.com/dapps/goldsky) 讓工程師能為其應用程式建立即時資料串流，同時省去管理複雜的區塊鏈與[資料串流基礎架構](https://www.alchemy.com/docs/reference/custom-webhooks-example)的需求。Goldsky 可以為區塊鏈或 subgraph 建立索引，依你的需求轉換資料，並即時將結果串流傳送到資料倉儲、webhook，或 API。

### Chainstack

[Chainstack Subgraphs](https://www.alchemy.com/dapps/chainstack-subgraphs) 是一套速度極快、可用於正式環境的解決方案，讓你能部署自己的 subgraph，而不必經歷質押、委託及／或獎勵 subgraph 索引的麻煩。你可以信賴 [Chainstack](https://www.alchemy.com/dapps/chainstack) 提供快速的索引以及持續穩定的資料可用性。

## **Subgraph 開發資源**

**以下清單列出了幾項有助於開發者開始使用 subgraph 進行開發的實用資源：**

### **1. The Graph 文件**

[The Graph 文件](https://thegraph.com/docs/en/) 是一份完整的資源，提供開發者開始為去中心化應用程式建立 subgraph 所需的所有知識。它提供完整的說明、教學，以及參考資料，內容涵蓋從建立開發環境，到部署與查詢 subgraph 的每個環節。

### **2. Subgraph 範例**

The Graph 的官方 Github 儲存庫中，包含了用於索引與查詢區塊鏈網路資料（包括 Ethereum、Polygon、IPFS 等）的 subgraph 實作範例。它提供了一個[簡單的 subgraph 模板](https://github.com/graphprotocol/example-subgraph)以及範例程式碼，可依特定 dapp 的需求進行客製化。

### **3. Messari 標準 Subgraph**

[Messari](https://www.alchemy.com/dapps/messari) 的 [subgraph 儲存庫](https://subgraphs.messari.io/) 為開發者提供了多種預先建置好的 subgraph，用於分析來自 Ethereum、BNB Chain 等知名區塊鏈網路的資料。它提供了歷史價格資料、鏈上指標等多種功能，對於想要善用 subgraph 的開發者而言，是相當有價值的資源。

## **我該使用 Subgraph 嗎？**

如果你有想要監控的自訂智能合約，建立 subgraph 對你來說可能會是一個很好的解決方案。

Subgraph 彙整特定應用程式的區塊鏈資料，讓前端開發者能快速存取。
