diff --git a/v2/object/convert.go b/v2/object/convert.go index f9d5a06..84ae218 100644 --- a/v2/object/convert.go +++ b/v2/object/convert.go @@ -48,6 +48,14 @@ func ShortHeaderToGRPCMessage(h *ShortHeader) *object.ShortHeader { m.SetPayloadLength(h.GetPayloadLength()) + m.SetPayloadHash( + refs.ChecksumToGRPCMessage(h.GetPayloadHash()), + ) + + m.SetHomomorphicHash( + refs.ChecksumToGRPCMessage(h.GetHomomorphicHash()), + ) + return m } @@ -74,6 +82,14 @@ func ShortHeaderFromGRPCMessage(m *object.ShortHeader) *ShortHeader { h.SetPayloadLength(m.GetPayloadLength()) + h.SetPayloadHash( + refs.ChecksumFromGRPCMessage(m.GetPayloadHash()), + ) + + h.SetHomomorphicHash( + refs.ChecksumFromGRPCMessage(m.GetHomomorphicHash()), + ) + return h } diff --git a/v2/object/grpc/types.go b/v2/object/grpc/types.go index df1151a..9d86393 100644 --- a/v2/object/grpc/types.go +++ b/v2/object/grpc/types.go @@ -201,6 +201,20 @@ func (m *ShortHeader) SetPayloadLength(v uint64) { } } +// SetPayloadHash sets hash of the object payload. +func (m *ShortHeader) SetPayloadHash(v *refs.Checksum) { + if m != nil { + m.PayloadHash = v + } +} + +// SetHomomorphicHash sets homomorphic hash of the object payload. +func (m *ShortHeader) SetHomomorphicHash(v *refs.Checksum) { + if m != nil { + m.HomomorphicHash = v + } +} + // SetSplitId sets id of split hierarchy. func (m *SplitInfo) SetSplitId(v []byte) { if m != nil { diff --git a/v2/object/marshal.go b/v2/object/marshal.go index f08c71d..c321ed3 100644 --- a/v2/object/marshal.go +++ b/v2/object/marshal.go @@ -12,6 +12,8 @@ const ( shortHdrOwnerField = 3 shortHdrObjectTypeField = 4 shortHdrPayloadLength = 5 + shortHdrHashField = 6 + shortHdrHomoHashField = 7 attributeKeyField = 1 attributeValueField = 2 @@ -151,7 +153,21 @@ func (h *ShortHeader) StableMarshal(buf []byte) ([]byte, error) { offset += n - _, err = proto.UInt64Marshal(shortHdrPayloadLength, buf[offset:], h.payloadLen) + n, err = proto.UInt64Marshal(shortHdrPayloadLength, buf[offset:], h.payloadLen) + if err != nil { + return nil, err + } + + offset += n + + n, err = proto.NestedStructureMarshal(shortHdrHashField, buf[offset:], h.payloadHash) + if err != nil { + return nil, err + } + + offset += n + + n, err = proto.NestedStructureMarshal(shortHdrHomoHashField, buf[offset:], h.homoHash) if err != nil { return nil, err } @@ -169,6 +185,8 @@ func (h *ShortHeader) StableSize() (size int) { size += proto.NestedStructureSize(shortHdrOwnerField, h.ownerID) size += proto.EnumSize(shortHdrObjectTypeField, int32(h.typ)) size += proto.UInt64Size(shortHdrPayloadLength, h.payloadLen) + size += proto.NestedStructureSize(shortHdrHashField, h.payloadHash) + size += proto.NestedStructureSize(shortHdrHomoHashField, h.homoHash) return size } diff --git a/v2/object/marshal_test.go b/v2/object/marshal_test.go index cafe099..c2686dc 100644 --- a/v2/object/marshal_test.go +++ b/v2/object/marshal_test.go @@ -476,6 +476,8 @@ func generateShortHeader(id string) *object.ShortHeader { hdr.SetCreationEpoch(200) hdr.SetObjectType(object.TypeRegular) hdr.SetPayloadLength(10) + hdr.SetPayloadHash(generateChecksum("payload hash")) + hdr.SetHomomorphicHash(generateChecksum("homomorphic hash")) return hdr } diff --git a/v2/object/types.go b/v2/object/types.go index d192715..3c258eb 100644 --- a/v2/object/types.go +++ b/v2/object/types.go @@ -19,6 +19,8 @@ type ShortHeader struct { typ Type payloadLen uint64 + + payloadHash, homoHash *refs.Checksum } type Attribute struct { @@ -296,6 +298,34 @@ func (h *ShortHeader) SetPayloadLength(v uint64) { } } +func (h *ShortHeader) GetPayloadHash() *refs.Checksum { + if h != nil { + return h.payloadHash + } + + return nil +} + +func (h *ShortHeader) SetPayloadHash(v *refs.Checksum) { + if h != nil { + h.payloadHash = v + } +} + +func (h *ShortHeader) GetHomomorphicHash() *refs.Checksum { + if h != nil { + return h.homoHash + } + + return nil +} + +func (h *ShortHeader) SetHomomorphicHash(v *refs.Checksum) { + if h != nil { + h.homoHash = v + } +} + func (h *ShortHeader) getHeaderPart() {} func (a *Attribute) GetKey() string {