Skip to main content

Cosmos gRPC

The Cosmos gRPC API provides efficient binary protocol access to chain state.

Endpoints

NetworkURL
Sprintnetgrpc.sprintnet.monolythium.com:9090
Testnetgrpc.testnet.monolythium.com:9090
Mainnetgrpc.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

AspectgRPCREST
ProtocolHTTP/2 + ProtobufHTTP/1.1 + JSON
PerformanceFasterSlower
TypingStrongly typedSchema optional
Browser supportLimitedNative
Toolinggrpcurl, code gencurl, browser

Use gRPC for:

  • High-performance applications
  • Strongly typed code
  • Streaming (where supported)

Use REST for:

  • Browser-based apps
  • Quick debugging
  • Simple integrations