diff --git a/docs/core/encoding.md b/docs/core/encoding.md index 7b6b1274ca2a..b5d862c35c00 100644 --- a/docs/core/encoding.md +++ b/docs/core/encoding.md @@ -197,7 +197,8 @@ The above `Profile` example is a fictive example used for educational purposes. - the `sdk.Msg` interface for encoding different `Msg`s in a transaction, - the `AccountI` interface for encodinig different types of accounts (similar to the above example) in the x/auth query responses, - the `Evidencei` interface for encoding different types of evidences in the x/evidence module, -- the `AuthorizationI` interface for encoding different types of x/authz authorizations. +- the `AuthorizationI` interface for encoding different types of x/authz authorizations, +- the [`Validator`](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/x/staking/types/staking.pb.go#L306-L337) struct that contains information about a validator. A real-life example of encoding the pubkey as `Any` inside the Validator struct in x/staking is shown in the following example: diff --git a/server/grpc/server_test.go b/server/grpc/server_test.go index e3bd71fe4feb..7f3c7a742cb4 100644 --- a/server/grpc/server_test.go +++ b/server/grpc/server_test.go @@ -12,6 +12,7 @@ import ( "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" + "google.golang.org/grpc" "google.golang.org/grpc/metadata" rpb "google.golang.org/grpc/reflection/grpc_reflection_v1alpha" @@ -20,6 +21,7 @@ import ( reflectionv1 "github.com/cosmos/cosmos-sdk/client/grpc/reflection" clienttx "github.com/cosmos/cosmos-sdk/client/tx" reflectionv2 "github.com/cosmos/cosmos-sdk/server/grpc/reflection/v2alpha1" + "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/testutil/network" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" @@ -29,11 +31,13 @@ import ( "github.com/cosmos/cosmos-sdk/types/tx/signing" authclient "github.com/cosmos/cosmos-sdk/x/auth/client" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) type IntegrationTestSuite struct { suite.Suite + app *simapp.SimApp cfg network.Config network *network.Network conn *grpc.ClientConn @@ -41,7 +45,7 @@ type IntegrationTestSuite struct { func (s *IntegrationTestSuite) SetupSuite() { s.T().Log("setting up integration test suite") - + s.app = simapp.Setup(false) s.cfg = network.DefaultConfig() s.cfg.NumValidators = 1 s.network = network.New(s.T(), s.cfg) @@ -213,6 +217,28 @@ func (s *IntegrationTestSuite) TestGRPCServerInvalidHeaderHeights() { } } +// TestGRPCUnpacker - tests the grpc endpoint for Validator and using the interface registry unpack and extract the +// ConsAddr. (ref: https://github.com/cosmos/cosmos-sdk/issues/8045) +func (s *IntegrationTestSuite) TestGRPCUnpacker() { + ir := s.app.InterfaceRegistry() + queryClient := stakingtypes.NewQueryClient(s.conn) + validator, err := queryClient.Validator(context.Background(), + &stakingtypes.QueryValidatorRequest{ValidatorAddr: s.network.Validators[0].ValAddress.String()}) + require.NoError(s.T(), err) + + // no unpacked interfaces yet, so ConsAddr will be nil + nilAddr, err := validator.Validator.GetConsAddr() + require.Error(s.T(), err) + require.Nil(s.T(), nilAddr) + + // unpack the interfaces and now ConsAddr is not nil + err = validator.Validator.UnpackInterfaces(ir) + require.NoError(s.T(), err) + addr, err := validator.Validator.GetConsAddr() + require.NotNil(s.T(), addr) + require.NoError(s.T(), err) +} + // mkTxBuilder creates a TxBuilder containing a signed tx from validator 0. func (s IntegrationTestSuite) mkTxBuilder() client.TxBuilder { val := s.network.Validators[0]