gRPC: fix server reflection (#8945)
* add: gogoreflection * fix: server reflection * fix: make tests resolve imports in a transitive way * chore: cleanup getMessageType * chore: lint * add: extensions reflection * chore: update interact-node.md docs * chore: update CHANGELOG.md * Update server/grpc/gogoreflection/fix_registration.go Co-authored-by: Robert Zaremba <robert@zaremba.ch> Co-authored-by: Jonathan Gimeno <jgimeno@gmail.com> Co-authored-by: Alessio Treglia <alessio@tendermint.com> Co-authored-by: Robert Zaremba <robert@zaremba.ch>
This commit is contained in:
co-authored by
Robert Zaremba
Jonathan Gimeno
Alessio Treglia
parent
e9e978d543
commit
ac48ffe748
@@ -60,7 +60,7 @@ Since the code generation library largely depends on your own tech stack, we wil
|
||||
|
||||
### grpcurl
|
||||
|
||||
[grpcurl])https://github.com/fullstorydev/grpcurl is like `curl` but for gRPC. It is also available as a Go library, but we will use it only as a CLI command for debugging and testing purposes. Follow the instructions in the previous link to install it.
|
||||
[grpcurl](https://github.com/fullstorydev/grpcurl) is like `curl` but for gRPC. It is also available as a Go library, but we will use it only as a CLI command for debugging and testing purposes. Follow the instructions in the previous link to install it.
|
||||
|
||||
Assuming you have a local node running (either a localnet, or connected a live network), you should be able to run the following command to list the Protobuf services available (you can replace `localhost:9000` by the gRPC server endpoint of another node, which is configured under the `grpc.address` field inside [`app.toml`](../run-node/run-node.md#configuring-the-node-using-apptoml)):
|
||||
|
||||
@@ -70,27 +70,19 @@ grpcurl -plaintext localhost:9090 list
|
||||
|
||||
You should see a list of gRPC services, like `cosmos.bank.v1beta1.Query`. This is called reflection, which is a Protobuf endpoint returning a description of all available endpoints. Each of these represents a different Protobuf service, and each service exposes multiple RPC methods you can query against.
|
||||
|
||||
In the Cosmos SDK, we use [gogoprotobuf](https://github.com/gogo/protobuf) for code generation, and [grpc-go](https://github.com/grpc/grpc-go) for creating the gRPC server. Unfortunately, these two don't play well together, and more in-depth reflection (such as using grpcurl's `describe`) is not possible. See [this issue](https://github.com/grpc/grpc-go/issues/1873) for more info.
|
||||
|
||||
Instead, we need to manually pass the reference to relevant `.proto` files. For example:
|
||||
In order to get a description of the service you can run the following command:
|
||||
|
||||
```bash
|
||||
grpcurl \
|
||||
-import-path ./proto \ # Import these proto files too
|
||||
-import-path ./third_party/proto \ # Import these proto files too
|
||||
-proto ./proto/cosmos/bank/v1beta1/query.proto \ # That's the proto file with the description of your service
|
||||
localhost:9090 \
|
||||
describe cosmos.bank.v1beta1.Query # Service we want to inspect
|
||||
```
|
||||
|
||||
Once the Protobuf definitions are given, making a gRPC query is then straightforward, by calling the correct `Query` service RPC method, and by passing the request argument as data (`-d` flag):
|
||||
It's also possible to execute an RPC call to query the node for information:
|
||||
|
||||
```bash
|
||||
grpcurl \
|
||||
-plaintext
|
||||
-import-path ./proto \
|
||||
-import-path ./third_party/proto \
|
||||
-proto ./proto/cosmos/bank/v1beta1/query.proto \
|
||||
-d '{"address":"$MY_VALIDATOR"}' \
|
||||
localhost:9090 \
|
||||
cosmos.bank.v1beta1.Query/AllBalances
|
||||
@@ -104,10 +96,7 @@ You may also query for historical data by passing some [gRPC metadata](https://g
|
||||
|
||||
```bash
|
||||
grpcurl \
|
||||
-plaintext
|
||||
-import-path ./proto \
|
||||
-import-path ./third_party/proto \
|
||||
-proto ./proto/cosmos/bank/v1beta1/query.proto \
|
||||
-plaintext \
|
||||
-H "x-cosmos-block-height: 279256" \
|
||||
-d '{"address":"$MY_VALIDATOR"}' \
|
||||
localhost:9090 \
|
||||
|
||||
Reference in New Issue
Block a user