From 5bed3ae6de6982a4314a4853c3ed824f1827fb20 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 7 Nov 2023 18:13:45 +0100 Subject: [PATCH] fix: deterministic protov2 marshal (backport #18403) (#18406) Co-authored-by: Julien Robert --- baseapp/internal/protocompat/protocompat.go | 9 +++++---- codec/collections.go | 3 ++- codec/proto_codec.go | 3 ++- codec/types/any.go | 6 ++++-- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/baseapp/internal/protocompat/protocompat.go b/baseapp/internal/protocompat/protocompat.go index bad4787d4e..b2a97f8890 100644 --- a/baseapp/internal/protocompat/protocompat.go +++ b/baseapp/internal/protocompat/protocompat.go @@ -16,8 +16,9 @@ import ( ) var ( - gogoType = reflect.TypeOf((*gogoproto.Message)(nil)).Elem() - protov2Type = reflect.TypeOf((*proto2.Message)(nil)).Elem() + gogoType = reflect.TypeOf((*gogoproto.Message)(nil)).Elem() + protov2Type = reflect.TypeOf((*proto2.Message)(nil)).Elem() + protov2MarshalOpts = proto2.MarshalOptions{Deterministic: true} ) type Handler = func(ctx context.Context, request, response protoiface.MessageV1) error @@ -96,7 +97,7 @@ func makeProtoV2HybridHandler(prefMethod protoreflect.MethodDescriptor, cdc code // the response is a protov2 message, so we cannot just return it. // since the request came as gogoproto, we expect the response // to also be gogoproto. - respBytes, err := proto2.Marshal(resp.(proto2.Message)) + respBytes, err := protov2MarshalOpts.Marshal(resp.(proto2.Message)) if err != nil { return err } @@ -137,7 +138,7 @@ func makeGogoHybridHandler(prefMethod protoreflect.MethodDescriptor, cdc codec.B switch m := inReq.(type) { case proto2.Message: // we need to marshal and unmarshal the request. - requestBytes, err := proto2.Marshal(m) + requestBytes, err := protov2MarshalOpts.Marshal(m) if err != nil { return err } diff --git a/codec/collections.go b/codec/collections.go index 12f1c396d5..cded358c5c 100644 --- a/codec/collections.go +++ b/codec/collections.go @@ -104,7 +104,8 @@ type collValue2[T any, PT protoMessageV2[T]] struct { } func (c collValue2[T, PT]) Encode(value PT) ([]byte, error) { - return protov2.Marshal(value) + protov2MarshalOpts := protov2.MarshalOptions{Deterministic: true} + return protov2MarshalOpts.Marshal(value) } func (c collValue2[T, PT]) Decode(b []byte) (PT, error) { diff --git a/codec/proto_codec.go b/codec/proto_codec.go index 26259cf06f..11fa7859c1 100644 --- a/codec/proto_codec.go +++ b/codec/proto_codec.go @@ -345,7 +345,8 @@ type grpcProtoCodec struct { func (g grpcProtoCodec) Marshal(v interface{}) ([]byte, error) { switch m := v.(type) { case proto.Message: - return proto.Marshal(m) + protov2MarshalOpts := proto.MarshalOptions{Deterministic: true} + return protov2MarshalOpts.Marshal(m) case gogoproto.Message: return g.cdc.Marshal(m) default: diff --git a/codec/types/any.go b/codec/types/any.go index 0e743e89df..bef5441fd1 100644 --- a/codec/types/any.go +++ b/codec/types/any.go @@ -69,7 +69,8 @@ func NewAnyWithValue(v proto.Message) (*Any, error) { err error ) if msg, ok := v.(protov2.Message); ok { - bz, err = protov2.Marshal(msg) + protov2MarshalOpts := protov2.MarshalOptions{Deterministic: true} + bz, err = protov2MarshalOpts.Marshal(msg) } else { bz, err = proto.Marshal(v) } @@ -110,7 +111,8 @@ func (any *Any) pack(x proto.Message) error { err error ) if msg, ok := x.(protov2.Message); ok { - bz, err = protov2.Marshal(msg) + protov2MarshalOpts := protov2.MarshalOptions{Deterministic: true} + bz, err = protov2MarshalOpts.Marshal(msg) } else { bz, err = proto.Marshal(x) }