Geth GraphQL簡明教程

2021-09-28 11:23:36 字數 4448 閱讀 4698

geth v1.9.x增加了graphql的支援,開發者可以在經典的json rpc api和graphql api之間根據自己的去中心化應用具體需求進行選擇。本文將介紹geth 1.9新增graphql api的原因,並介紹其使用方法。

web3j以太坊開發詳解

php以太坊開發詳解

python以太坊開發詳解

c#以太坊開發詳解

flutter以太坊開發詳解

erc721以太坊通證實戰

讓我們先了解下經典的json-rpc api存在什麼問題。

正如其名稱所示,json-rpc是一種遠端過程呼叫協議,它被設計用來呼叫遠端的函式並返回計算結果。json-rpc是相當寬泛的協議,你需要在它之上設計自己的呼叫介面。

但是json-rpc的問題在於它不支援靈活的查詢,這會導致計算資源和資料傳輸方面的雙重浪費:

對於以太坊的json-rpc api,由於區塊鏈資料的結構特點,上面的問題被進一步放大了,多次執行乙個查詢(例如eth_getbalance)需要確保查詢是同一世界狀態甚至是在同乙個節點上:當你使用多個節點進行負載均衡處理時,不同的後台節點可能有不同的同步延遲,從而可能對相同的rpc請求返回不同的內容。

為了解決這些問題,以太坊eip 1767提出了以太坊節點的graphql介面建議,geth在1.9.0版本中引入了對eip 1767的支援,實現了完整的原生graphql支援。

graphsql是為了解決rest api存在的問題而提出的一種新的查詢語言。graphql將資料物件關係 對映到乙個圖(graph),並設計了一種查詢語言(query language)來遍歷圖中關係 —— 這也是graphql 名稱的**。

這篇文章非常適合不熟悉graphql的開發者快速理解graphql的基本概念,以及如何利用nodejs技術棧實現graphql的服務端與客戶端:從sql到graphql。

geth 1.9.0引入的對graphql的原生支援。在啟動geth時,使用--graphql命令列標誌就可以開啟graphql api介面了。例如,執行下面的命令來接入以太坊görli測試鏈並開啟graphql api支援:

~$ geth --goerli --graphql
一旦開啟了geth的graphql支援,就可以通過geth預置的graphql瀏覽器來進行測試,graphql服務預設在8547埠監聽,api訪問路徑為/graphql。可以使用如下url訪問geth的graphql瀏覽器:

http://localhost:8547
介面如下所示,最左邊就是輸入的graphql查詢:

為了便於檢視,這裡列出左邊的graphql查詢語句:

) 

block}}}

你可以這樣理解上面的graphql語句:

假設我們要查詢最新的10個區塊的礦工賬號以及這些賬號的餘額,使用json-rpc的實現**如下:

async function main() 

blockres.number = i

blockres.miner = {}

blockres.miner.address = block.miner

blockres.miner.balance = await web3.eth.getbalance(block.miner)

result.push(blockres)

} console.log(result);

}

我們需要進行10次迴圈,逐個查詢每個區塊的礦工賬號及其餘額。在每次迴圈中,我們需要呼叫兩次rpc api,分別查詢區塊資料和賬戶餘額,因此總共需要10*2 = 20 次呼叫。

下面是獲取同樣資料的graphql查詢:

}}

你可以在geth graphql瀏覽器中輸入並執行上面的查詢語句。令人震驚的是,我們只進行1次呼叫就完成了之前採用json-rpc時20次呼叫才完成的任務!

在geth源**中,schema.go檔案中包含了當前的graphql語法支援。下表列出了geth graphql目前的實現狀態,其中簡要說明欄目描述了json-rpc對應的geth graphql語句:

json-rpc

graphql狀態

簡要說明

eth_blocknumber

已實現}

eth_call

已實現) }

eth_estimategas

已實現) }

eth_gasprice

已實現

eth_getbalance

已實現}

eth_getblockbyhash

已實現}

eth_getblockbynumber

已實現}

eth_getblocktransactioncountbyhash

已實現}

eth_getblocktransactioncountbynumber

已實現}

eth_getcode

已實現}

eth_getlogs

已實現) }or) } }

eth_getstorageat

已實現}

eth_gettransactionbyblockhashandindex

已實現} }

eth_gettransactionbyblocknumberandindex

已實現} }

eth_gettransactionbyhash

已實現}

eth_gettransactioncount

已實現}

eth_gettransactionreceipt

已實現}

eth_getunclebyblockhashandindex

已實現} }

eth_getunclebyblocknumberandindex

已實現} }

eth_getunclecountbyblockhash

已實現}

eth_getunclecountbyblocknumber

已實現}

eth_protocolversion

已實現

eth_sendrawtransaction

已實現mutation

eth_syncing

已實現}

eth_getcompilers

未實現json-rpc已廢棄編譯器功能

eth_compilelll

未實現json-rpc已廢棄編譯器功能

eth_compilesolidity

未實現json-rpc已廢棄編譯器功能

eth_compileserpent

未實現json-rpc已廢棄編譯器功能

eth_newfilter

未實現過濾器功能可能在未來eip中約定

eth_newblockfilter

未實現過濾器功能可能在未來eip中約定

eth_newpendingtransactionfilter

未實現過濾器功能可能在未來eip中約定

eth_uninstallfilter

未實現過濾器功能可能在未來eip中約定

eth_getfilterchanges

未實現過濾器功能可能在未來eip中約定

eth_getfilterlogs

未實現過濾器功能可能在未來eip中約定

eth_accounts

未實現賬戶功能不屬於節點核心api

eth_sign

未實現賬戶功能不屬於節點核心api

eth_sendtransaction

未實現賬戶功能不屬於節點核心api

eth_coinbase

未實現挖礦相關功能將單獨定義

eth_getwork

未實現挖礦相關功能將單獨定義

eth_hashrate

未實現挖礦相關功能將單獨定義

eth_mining

未實現挖礦相關功能將單獨定義

eth_submithashrate

未實現挖礦相關功能將單獨定義

eth_submitwork

未實現挖礦相關功能將單獨定義

Visual Unit 簡明教程

visual unit,簡稱vu,是新一代單元測試工具,功能強大,使用簡單,完全視覺化,不需編寫測試 vu的測試結果使程式行為一目了然,有助於整理程式設計思路,提高程式設計效率和正確性,並能快速排錯 vu還增強偵錯程式功能 如自由後退 用例切換 提高除錯的效率 vu能達到空前的測試完整性,輕鬆完成語...

MYSQL簡明教程

dos進入mysql命令 c mysql h 127.0.0.1 u root p enter password mysql 進入完成 建立資料庫 create database databasename 使用指定資料庫進行操作 方法1 use database databasename 方法2 m...

Struts Hibernate簡明教程

jboss 資助的開源專案,當前比較流行的持久層框架,是一種先進的 jdbc 封裝框架。優點 提高了資料訪問層的開發效率,使我們不必直接呼叫 jdbc 來訪問關係型資料庫。hibernate 建立在物件導向的基礎之上,開發人員只需針對物件進行操作,不必再關心資料庫的連線關閉,sql的執行,以及 re...