The Graph介紹和使用

specterofblog發表於2020-12-20

The Graph的使命是賦能完全由公共基礎架構所驅動的網際網路應用。

全棧去中心化讓應用具備應對商業失敗和尋租的能力,同時帶來前所未有的互操作性。使用者和開發者都清楚知曉他們投入時間和資金打造的軟體不會憑空消失。

為了實現完全去中心化應用(dApp)的願景,有一點非常關鍵,就是我們要進行一個正規化轉移,從為應用正常執行所需的持續儲存、計算和其他服務付費的業務模式,轉變成使用者直接為去中心化服務提供商網路付費。

The Graph網路對Web3的查詢層和API層進行了去中心化,消除了dApp開發者目前面臨的取捨難題:到底是開發一個高效能應用,還是開發一個完全去中心化的應用。

目前,開發者可以在自己的基礎架構上執行一個Graph節點,也可以在我們的託管服務上開發一個。其中,開發者構建和部署從Web3資料來源提取資料併為其編制索引的子圖。目前已經有許多領先的以太坊專案建立了子圖,包括Uniswap、ENS、DAOstack、Synthetix和Moloch等。在The Graph網路中,任何索引器都能夠通過抵押Graph代幣(GRT)參與到網路中,並在提供查詢服務的過程賺取費用和通貨膨脹獎勵。

使用者則按照使用次數進行付費,使用日益增長的索引器,此做法證明了供需規律也適用於該協議提供的服務。

當你嘗試訪問以太坊智慧合約以及DApp產生的區塊鏈資料時,可能會發現很難將資料轉換為一種可讀的格式。 The Graph提供了一種用於查詢以太坊和IPFS網路資料的索引協議,任何人都可以基於其提供的開放API建立併發布索引資料,即subgraph,這使得區塊鏈資料更容易訪問。在這個教程中,我們將學習如何使用The Graph來查詢Aave協議資料,使用的技術棧包括Graphql、JavaScript和Nodejs。

1、訪問The Graph的準備工作

教程的第一步是訪問The Graph網站並檢視目前已經支援的協議,例如Uniswap、ERC20、Aave、Compound等等。如果找到了你要提取資料的協議,例如Aave,那麼點選該協議進入:

在這裡插入圖片描述

你要做的第一件事就是記下來頁面上的地址(1),後面要用這個地址來查詢。在我們的示例中,這個地址就是: https://api.thegraph.com/subgraphs/name/aave/protocol

左邊的區域(2)給出了一個查詢示例,你可以點選【play】按鈕來執行。也可以修改查詢示例進行其他測試。

右邊的區域(3)給出了這個subgraph所包含的實體的描述。點選其中任何一個實體都會給出該實體更詳細的說明資訊,包括它的欄位以及與其他實體的關係。

2、構造GraphQL查詢語句

在下面的示例中,我們將構造一個簡單的查詢語句,來列出Aave平臺上最新的閃電貸。The Graph的查詢使用GraphQL,如果你還不熟悉GrapQL,可以檢視這個教程

在開始寫GraphQL查詢語句之前,我們還需要先了解下閃電貸在graph中是如何定義的。為此我們可以在左邊搜尋FlashLoan實體,檢視它包含了哪些內容:

在這裡插入圖片描述

我們的查詢語句將查詢最新的10條閃電貸記錄:

{
  flashLoans(first: 10, orderBy: timestamp, orderDirection: desc) {
    id
    reserve {
      name
      symbol
    }
    amount,
    target,
    timestamp
  }
}

注意閃電貸物件指向另一個實體reserve,即儲備庫。

3、使用NodeJS提交GraphQL查詢

The Graph的使用者介面為測試和開發自己的查詢提供了一個非常好的辦法。現在是時候用JavaScript(或你選擇的其他語言)來實現查詢了。這個過程很簡單,我們只需要將查詢語句通過HTTP POST請求提交給The Graph提供的https訪問端節點。

我們使用axios來處理請求:

npm install axios --save

整個程式碼看起來是這樣:

const axios = require('axios')

axios.post('https://api.thegraph.com/subgraphs/name/aave/protocol', {
  query: `
  {
    flashLoans(first: 10, orderBy: timestamp, orderDirection: desc) {
      id
      reserve {
        name
        symbol
      }
      amount,
      target,
      timestamp
    }
  }  
  `
})
.then((res) => {
  for (const flashsloan of res.data.data.flashLoans) {
    console.log(flashsloan)
  }
})
.catch((error) => {
  console.error(error)
})

執行結果類似下圖:

在這裡插入圖片描述

4、總結

使用The Graph索引過的資料可以讓你避免監聽區塊鏈事件、解碼事件引數或者處理token小數點問題,開發效率和系統穩定性都會得到很大提高。

相關文章