GraphQL (BDS)
GraphQL in Xian is an optional convenience layer over the BDS Postgres database.
It is available only when the indexed service-node stack is running.
What It Runs On
The maintained stack uses PostGraphile v5 over the BDS database.
That means GraphQL is:
- generated from the indexed database schema
- useful for exploratory and history-heavy queries
- outside the deterministic consensus path
The maintained stack publishes it on port 5000 when enabled.
Deployment Posture
In the maintained xian-stack runtime:
- GraphQL is available only on service nodes
- it binds to
127.0.0.1by default - public exposure is explicit through
--public-queryorXIAN_PUBLIC_QUERY_ENABLED=1 - it runs against a dedicated read-only Postgres role, not the primary BDS owner account
What It Is Good For
GraphQL is most useful when you want:
- flexible filtering over indexed blocks, transactions, events, or state history
- one endpoint for explorer or analytics-style read patterns
- a developer-friendly schema browser through GraphiQL / introspection
What It Is Not
GraphQL is not:
- the authoritative source of current state
- required to run a validator
- a substitute for CometBFT RPC or direct ABCI query when you need the core node contract
Consistency Model
GraphQL inherits the indexed-read consistency model of BDS.
That means:
- blocks finalize first
- BDS indexes them asynchronously
- GraphQL reflects the indexed database once that work is done
So it is normal for GraphQL to lag slightly behind the very latest finalized block during catch-up or recovery.
Practical Guidance
- use CometBFT RPC and direct ABCI query for canonical state and submission flows
- use GraphQL when indexed querying is more important than absolute immediacy
- inspect the generated schema directly instead of hard-coding assumptions about every table-derived field name