Cosmos gRPC
The Cosmos gRPC API provides efficient binary protocol access to chain state.
Endpoints
| Network | URL |
|---|---|
| Sprintnet | grpc.sprintnet.monolythium.com:9090 |
| Testnet | grpc.testnet.monolythium.com:9090 |
| Mainnet | grpc.monolythium.com:9090 |
Default port: 9090
Using gRPCurl
Installation
# macOS
brew install grpcurl
# Go install
go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest
List Services
grpcurl -plaintext localhost:9090 list
Query Examples
# Get balance
grpcurl -plaintext \
-d '{"address":"mono1abc..."}' \
localhost:9090 \
cosmos.bank.v1beta1.Query/Balance
# Get validators
grpcurl -plaintext \
localhost:9090 \
cosmos.staking.v1beta1.Query/Validators
Using in Code
Go
package main
import (
"context"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
)
func main() {
conn, err := grpc.Dial(
"localhost:9090",
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
if err != nil {
panic(err)
}
defer conn.Close()
client := banktypes.NewQueryClient(conn)
res, err := client.Balance(context.Background(), &banktypes.QueryBalanceRequest{
Address: "mono1abc...",
Denom: "alyth",
})
if err != nil {
panic(err)
}
fmt.Println(res.Balance)
}
JavaScript/TypeScript
import { createProtobufRpcClient, QueryClient } from "@cosmjs/stargate";
import { Tendermint34Client } from "@cosmjs/tendermint-rpc";
const tmClient = await Tendermint34Client.connect("http://localhost:26657");
const queryClient = new QueryClient(tmClient);
const rpcClient = createProtobufRpcClient(queryClient);
Python
import grpc
from cosmos.bank.v1beta1 import query_pb2, query_pb2_grpc
channel = grpc.insecure_channel('localhost:9090')
stub = query_pb2_grpc.QueryStub(channel)
request = query_pb2.QueryBalanceRequest(
address="mono1abc...",
denom="alyth"
)
response = stub.Balance(request)
print(response.balance)
Available Services
Bank
service Query {
rpc Balance(QueryBalanceRequest) returns (QueryBalanceResponse);
rpc AllBalances(QueryAllBalancesRequest) returns (QueryAllBalancesResponse);
rpc TotalSupply(QueryTotalSupplyRequest) returns (QueryTotalSupplyResponse);
}
Staking
service Query {
rpc Validators(QueryValidatorsRequest) returns (QueryValidatorsResponse);
rpc Validator(QueryValidatorRequest) returns (QueryValidatorResponse);
rpc Delegations(QueryDelegatorDelegationsRequest) returns (QueryDelegatorDelegationsResponse);
}
Distribution
service Query {
rpc DelegationRewards(QueryDelegationRewardsRequest) returns (QueryDelegationRewardsResponse);
rpc ValidatorCommission(QueryValidatorCommissionRequest) returns (QueryValidatorCommissionResponse);
}
Gov
service Query {
rpc Proposals(QueryProposalsRequest) returns (QueryProposalsResponse);
rpc Proposal(QueryProposalRequest) returns (QueryProposalResponse);
rpc Votes(QueryVotesRequest) returns (QueryVotesResponse);
}
Configuration
Enable gRPC in your node:
# app.toml
[grpc]
enable = true
address = "0.0.0.0:9090"
gRPC vs REST
| Aspect | gRPC | REST |
|---|---|---|
| Protocol | HTTP/2 + Protobuf | HTTP/1.1 + JSON |
| Performance | Faster | Slower |
| Typing | Strongly typed | Schema optional |
| Browser support | Limited | Native |
| Tooling | grpcurl, code gen | curl, browser |
Use gRPC for:
- High-performance applications
- Strongly typed code
- Streaming (where supported)
Use REST for:
- Browser-based apps
- Quick debugging
- Simple integrations
Related
- Cosmos REST - REST API
- EVM RPC - EVM JSON-RPC