github.com/cosmos/cosmos-sdk@v0.50.10/types/msgservice/msg_service.go (about)

     1  package msgservice
     2  
     3  import (
     4  	"bytes"
     5  	"compress/gzip"
     6  	"fmt"
     7  	"io"
     8  	"reflect"
     9  
    10  	"github.com/cosmos/gogoproto/proto"
    11  	"google.golang.org/grpc"
    12  	proto2 "google.golang.org/protobuf/proto"
    13  	"google.golang.org/protobuf/reflect/protodesc"
    14  	"google.golang.org/protobuf/reflect/protoreflect"
    15  	"google.golang.org/protobuf/types/descriptorpb"
    16  
    17  	codectypes "github.com/cosmos/cosmos-sdk/codec/types"
    18  	sdk "github.com/cosmos/cosmos-sdk/types"
    19  	"github.com/cosmos/cosmos-sdk/types/tx"
    20  )
    21  
    22  // RegisterMsgServiceDesc registers all type_urls from Msg services described
    23  // in `sd` into the registry.
    24  func RegisterMsgServiceDesc(registry codectypes.InterfaceRegistry, sd *grpc.ServiceDesc) {
    25  	fdBytesUnzipped := unzip(proto.FileDescriptor(sd.Metadata.(string)))
    26  	if fdBytesUnzipped == nil {
    27  		panic(fmt.Errorf("error unzipping file description for MsgService %s", sd.ServiceName))
    28  	}
    29  
    30  	fdRaw := &descriptorpb.FileDescriptorProto{}
    31  	err := proto2.Unmarshal(fdBytesUnzipped, fdRaw)
    32  	if err != nil {
    33  		panic(err)
    34  	}
    35  
    36  	fd, err := protodesc.FileOptions{
    37  		AllowUnresolvable: true,
    38  	}.New(fdRaw, nil)
    39  	if err != nil {
    40  		panic(err)
    41  	}
    42  
    43  	prefSd := fd.Services().ByName(protoreflect.FullName(sd.ServiceName).Name())
    44  	for i := 0; i < prefSd.Methods().Len(); i++ {
    45  		md := prefSd.Methods().Get(i)
    46  		requestDesc := md.Input()
    47  		responseDesc := md.Output()
    48  
    49  		reqTyp := proto.MessageType(string(requestDesc.FullName()))
    50  		respTyp := proto.MessageType(string(responseDesc.FullName()))
    51  
    52  		// Register sdk.Msg and sdk.MsgResponse to the registry.
    53  		registry.RegisterImplementations((*sdk.Msg)(nil), reflect.New(reqTyp).Elem().Interface().(proto.Message))
    54  		registry.RegisterImplementations((*tx.MsgResponse)(nil), reflect.New(respTyp).Elem().Interface().(proto.Message))
    55  	}
    56  }
    57  
    58  func unzip(b []byte) []byte {
    59  	if b == nil {
    60  		return nil
    61  	}
    62  	r, err := gzip.NewReader(bytes.NewReader(b))
    63  	if err != nil {
    64  		panic(err)
    65  	}
    66  
    67  	unzipped, err := io.ReadAll(r)
    68  	if err != nil {
    69  		panic(err)
    70  	}
    71  
    72  	return unzipped
    73  }