Use GraphQL over HTTP
GraphQL can reduce the overhead needed for common queries. For example, instead of querying each receipt in a block, GraphQL can get the same result with a single query for the entire block.
The Besu GraphQL schema describes the GraphQL implementation for Ethereum. Enable the GraphQL service using command line options.
GraphQL is not supported over WebSocket.
Access the GraphQL endpoint at http://<HOST>:<PORT>/graphql
.
Configure <HOST>
and <PORT>
using graphql-http-host
and graphql-http-port
.
The default endpoint is http://127.0.0.1:8547/graphql
.
GraphQL requests with cURL
Hyperledger Besu JSON-RPC API methods with an equivalent GraphQL query include a GraphQL request and result in the method example.
For example, the following request returns the block number:
Request
curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block{number}}"}' http://localhost:8547/graphql
Response
{
"data" : {
"block" : {
"number" : "0x281"
}
}
}
The following request returns the gas price:
Request
curl -X POST -H "Content-Type: application/json" --data '{ "query": "{gasPrice}"}' http://localhost:8547/graphql
Response
{
"data" : {
"gasPrice" : "0x0"
}
}
The following syncing
request returns data about the
synchronization status:
Request
curl -X POST -H "Content-Type: application/json" --data '{ "query": "{syncing{startingBlock currentBlock highestBlock}}"}' http://localhost:8547/graphql
Response
{
"data" : {
"syncing" : {
"startingBlock" : 665,
"currentBlock" : 3190,
"highestBlock" : 26395
}
}
}
In some cases, for example, when your node is fully synced, the syncing request returns a null
response:
{
"data" : {
"syncing" : null
}
}
GraphQL requests with GraphiQL app
The third-party tool, GraphiQL, provides a tabbed interface for editing and testing GraphQL queries and mutations. GraphiQL also provides access to the Besu GraphQL schema from within the app.
Pending
transactionCount
and transactions
supports the Pending query.
Besu does not execute pending transactions so results from account
, call
, and estimateGas
for
Pending do not reflect pending transactions.
Pending transaction count
curl -X POST -H "Content-Type: application/json" --data '{ "query": "{pending {transactionCount}}"}' http://localhost:8547/graphql
Result
{
"data": {
"pending": {
"transactionCount": 2
}
}
}
Pending transactions
curl -X POST -H "Content-Type: application/json" --data '{ "query": "{pending {transactions{hash}}}"}' http://localhost:8547/graphql
Result
{
"data": {
"pending": {
"transactions": [
{
"hash": "0xbb3ab8e2113a4afdde9753782cb0680408c0d5b982572dda117a4c72fafbf3fa"
},
{
"hash": "0xf6bd6b1bccf765024bd482a71c6855428e2903895982090ab5dbb0feda717af6"
}
]
}
}
}