Querier designates a function that processes
queriers are specific to the module in which they are defined, and only process
queries defined within said module. They are called from
# Pre-requisite Readings
querier type defined in the Cosmos SDK specifies the typical structure of a
Let us break it down:
pathis an array of
strings that contains the type of the query, and that can also contain
queriesfor more information.
reqitself is primarily used to retrieve arguments if they are too large to fit in the
path. This is done using the
Contextcontains all the necessary information needed to process the
query, as well as a cache-wrapped copy of the latest state. It is primarily used by the
keeperto access the state.
- The result
baseapp, marhsalled using the application's
# Implementation of a module
queriers are typically implemented in a
./internal/keeper/querier.go file inside the module's folder. The module manager is used to add the module's
queriers to the application's
queryRouter via the
NewQuerier() method. Typically, the manager's
NewQuerier() method simply calls a
NewQuerier() method defined in
keeper/querier.go, which looks like the following:
This simple switch returns a
querier function specific to the type of the received
query. At this point of the query lifecycle, the first element of the
path) contains the type of the query. The following elements are either empty or contain arguments needed to process the query.
querier functions themselves are pretty straighforward. They generally fetch a value or values from the state using the
keeper. Then, they marshall the value(s) using the
codec and return the
byte obtained as result.
For a deeper look at
queriers, see this example implementation of a
querier function from the nameservice tutorial.