diff --git a/domain/consensus/database/binaryserialization/utxo_collection.go b/domain/consensus/database/binaryserialization/utxo_collection.go index d44467539..83404fc81 100644 --- a/domain/consensus/database/binaryserialization/utxo_collection.go +++ b/domain/consensus/database/binaryserialization/utxo_collection.go @@ -8,21 +8,45 @@ import ( "io" ) +// SerializeUTXOCollection serializes the given utxoCollection into the given writer func SerializeUTXOCollection(writer io.Writer, utxoCollection model.UTXOCollection) error { length := uint64(utxoCollection.Len()) err := binaryserializer.PutUint64(writer, length) if err != nil { return err } + + utxoIterator := utxoCollection.Iterator() + for ok := utxoIterator.First(); ok; ok = utxoIterator.Next() { + outpoint, utxoEntry, err := utxoIterator.Get() + if err != nil { + return err + } + err = utxo.SerializeUTXOIntoWriter(writer, utxoEntry, outpoint) + if err != nil { + return err + } + } + return nil } +// DeserializeUTXOCollection deserializes a utxoCollection out of the given reader func DeserializeUTXOCollection(reader io.Reader) (model.UTXOCollection, error) { length, err := binaryserializer.Uint64(reader) if err != nil { return nil, err } + utxoMap := make(map[externalapi.DomainOutpoint]externalapi.UTXOEntry, length) + for i := uint64(0); i < length; i++ { + utxoEntry, outpoint, err := utxo.DeserializeUTXOOutOfReader(reader) + if err != nil { + return nil, err + } + utxoMap[*outpoint] = utxoEntry + } + utxoCollection := utxo.NewUTXOCollection(utxoMap) return utxoCollection, nil } diff --git a/domain/consensus/database/binaryserialization/utxo_diff.go b/domain/consensus/database/binaryserialization/utxo_diff.go index 9bc28e7d2..1b262b0f1 100644 --- a/domain/consensus/database/binaryserialization/utxo_diff.go +++ b/domain/consensus/database/binaryserialization/utxo_diff.go @@ -6,6 +6,7 @@ import ( "io" ) +// SerializeUTXODiff serializes the given utxoDiff into the given writer func SerializeUTXODiff(writer io.Writer, utxoDiff model.UTXODiff) error { err := SerializeUTXOCollection(writer, utxoDiff.ToAdd()) if err != nil { @@ -14,6 +15,7 @@ func SerializeUTXODiff(writer io.Writer, utxoDiff model.UTXODiff) error { return SerializeUTXOCollection(writer, utxoDiff.ToRemove()) } +// DeserializeUTXODiff deserializes a utxoDiff out of the given reader func DeserializeUTXODiff(reader io.Reader) (model.UTXODiff, error) { toAdd, err := DeserializeUTXOCollection(reader) if err != nil { diff --git a/domain/consensus/utils/utxo/serialization.go b/domain/consensus/utils/utxo/serialization.go index 478447072..31ba13ac1 100644 --- a/domain/consensus/utils/utxo/serialization.go +++ b/domain/consensus/utils/utxo/serialization.go @@ -14,12 +14,7 @@ import ( func SerializeUTXO(entry externalapi.UTXOEntry, outpoint *externalapi.DomainOutpoint) ([]byte, error) { w := &bytes.Buffer{} - err := serializeOutpoint(w, outpoint) - if err != nil { - return nil, err - } - - err = serializeUTXOEntry(w, entry) + err := SerializeUTXOIntoWriter(w, entry, outpoint) if err != nil { return nil, err } @@ -27,15 +22,30 @@ func SerializeUTXO(entry externalapi.UTXOEntry, outpoint *externalapi.DomainOutp return w.Bytes(), nil } +// SerializeUTXOIntoWriter serializes the byte-slice representation for given UTXOEntry-outpoint pair into the given writer +func SerializeUTXOIntoWriter(writer io.Writer, entry externalapi.UTXOEntry, outpoint *externalapi.DomainOutpoint) error { + err := serializeOutpoint(writer, outpoint) + if err != nil { + return err + } + + return serializeUTXOEntry(writer, entry) +} + // DeserializeUTXO deserializes the given byte slice to UTXOEntry-outpoint pair func DeserializeUTXO(utxoBytes []byte) (entry externalapi.UTXOEntry, outpoint *externalapi.DomainOutpoint, err error) { r := bytes.NewReader(utxoBytes) - outpoint, err = deserializeOutpoint(r) + return DeserializeUTXOOutOfReader(r) +} + +// DeserializeUTXOOutOfReader deserializes a UTXOEntry-outpoint pair out of the given reader +func DeserializeUTXOOutOfReader(reader io.Reader) (entry externalapi.UTXOEntry, outpoint *externalapi.DomainOutpoint, err error) { + outpoint, err = deserializeOutpoint(reader) if err != nil { return nil, nil, err } - entry, err = deserializeUTXOEntry(r) + entry, err = deserializeUTXOEntry(reader) if err != nil { return nil, nil, err }