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 }