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...