From d5f24955221d92d79f83b035be69b95c094b1152 Mon Sep 17 00:00:00 2001 From: stasatdaglabs Date: Thu, 28 Jan 2021 14:19:06 +0200 Subject: [PATCH] Use SerializeUTXODiff and DeserializeUTXODiff in utxoDiffStore and implement TestUTXODiffSerializationAndDeserialization. --- .../utxodiffstore/utxodiffstore.go | 22 ++--- .../utxodiffstore/utxodiffstore_test.go | 82 +++++++++++++++++-- 2 files changed, 83 insertions(+), 21 deletions(-) diff --git a/domain/consensus/datastructures/utxodiffstore/utxodiffstore.go b/domain/consensus/datastructures/utxodiffstore/utxodiffstore.go index caab31e3e..6b46e311e 100644 --- a/domain/consensus/datastructures/utxodiffstore/utxodiffstore.go +++ b/domain/consensus/datastructures/utxodiffstore/utxodiffstore.go @@ -1,8 +1,10 @@ package utxodiffstore import ( + "bytes" "github.com/golang/protobuf/proto" "github.com/kaspanet/kaspad/domain/consensus/database" + "github.com/kaspanet/kaspad/domain/consensus/database/binaryserialization" "github.com/kaspanet/kaspad/domain/consensus/database/serialization" "github.com/kaspanet/kaspad/domain/consensus/model" "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" @@ -188,27 +190,17 @@ func (uds *utxoDiffStore) utxoDiffChildHashAsKey(hash *externalapi.DomainHash) m } func (uds *utxoDiffStore) serializeUTXODiff(utxoDiff model.UTXODiff) ([]byte, error) { - dbUtxoDiff, err := serialization.UTXODiffToDBUTXODiff(utxoDiff) + writer := &bytes.Buffer{} + err := binaryserialization.SerializeUTXODiff(writer, utxoDiff) if err != nil { return nil, err } - - bytes, err := proto.Marshal(dbUtxoDiff) - if err != nil { - return nil, errors.WithStack(err) - } - - return bytes, nil + return writer.Bytes(), nil } func (uds *utxoDiffStore) deserializeUTXODiff(utxoDiffBytes []byte) (model.UTXODiff, error) { - dbUTXODiff := &serialization.DbUtxoDiff{} - err := proto.Unmarshal(utxoDiffBytes, dbUTXODiff) - if err != nil { - return nil, errors.WithStack(err) - } - - return serialization.DBUTXODiffToUTXODiff(dbUTXODiff) + reader := bytes.NewReader(utxoDiffBytes) + return binaryserialization.DeserializeUTXODiff(reader) } func (uds *utxoDiffStore) serializeUTXODiffChild(utxoDiffChild *externalapi.DomainHash) ([]byte, error) { diff --git a/domain/consensus/datastructures/utxodiffstore/utxodiffstore_test.go b/domain/consensus/datastructures/utxodiffstore/utxodiffstore_test.go index f1ac50ddc..5b479aea2 100644 --- a/domain/consensus/datastructures/utxodiffstore/utxodiffstore_test.go +++ b/domain/consensus/datastructures/utxodiffstore/utxodiffstore_test.go @@ -8,10 +8,74 @@ import ( "testing" ) +func TestUTXODiffSerializationAndDeserialization(t *testing.T) { + utxoDiffStore := New(0).(*utxoDiffStore) + + testUTXODiff, err := buildTestUTXODiff() + if err != nil { + t.Fatalf("Could not create UTXODiff from toAdd and toRemove collections: %s", err) + } + + serializedUTXODiff, err := utxoDiffStore.serializeUTXODiff(testUTXODiff) + if err != nil { + t.Fatalf("Could not serialize UTXO diff: %s", err) + } + deserializedUTXODiff, err := utxoDiffStore.deserializeUTXODiff(serializedUTXODiff) + if err != nil { + t.Fatalf("Could not deserialize UTXO diff: %s", err) + } + + if testUTXODiff.ToAdd().Len() != deserializedUTXODiff.ToAdd().Len() { + t.Fatalf("Unexpected toAdd length in deserialized utxoDiff. Want: %d, got: %d", + testUTXODiff.ToAdd().Len(), deserializedUTXODiff.ToAdd().Len()) + } + if testUTXODiff.ToRemove().Len() != deserializedUTXODiff.ToRemove().Len() { + t.Fatalf("Unexpected toRemove length in deserialized utxoDiff. Want: %d, got: %d", + testUTXODiff.ToRemove().Len(), deserializedUTXODiff.ToRemove().Len()) + } + + testToAddIterator := testUTXODiff.ToAdd().Iterator() + for ok := testToAddIterator.First(); ok; ok = testToAddIterator.Next() { + testOutpoint, testUTXOEntry, err := testToAddIterator.Get() + if err != nil { + t.Fatalf("Could not get an outpoint-utxoEntry pair out of the toAdd iterator: %s", err) + } + deserializedUTXOEntry, ok := deserializedUTXODiff.ToAdd().Get(testOutpoint) + if !ok { + t.Fatalf("Outpoint %s:%d not found in the deserialized toAdd collection", + testOutpoint.TransactionID, testOutpoint.Index) + } + if !testUTXOEntry.Equal(deserializedUTXOEntry) { + t.Fatalf("Deserialized UTXO entry is not equal to the original UTXO entry for outpoint %s:%d "+ + "in the toAdd collection", testOutpoint.TransactionID, testOutpoint.Index) + } + } + + testToRemoveIterator := testUTXODiff.ToRemove().Iterator() + for ok := testToRemoveIterator.First(); ok; ok = testToRemoveIterator.Next() { + testOutpoint, testUTXOEntry, err := testToRemoveIterator.Get() + if err != nil { + t.Fatalf("Could not get an outpoint-utxoEntry pair out of the toRemove iterator: %s", err) + } + deserializedUTXOEntry, ok := deserializedUTXODiff.ToRemove().Get(testOutpoint) + if !ok { + t.Fatalf("Outpoint %s:%d not found in the deserialized toRemove collection", + testOutpoint.TransactionID, testOutpoint.Index) + } + if !testUTXOEntry.Equal(deserializedUTXOEntry) { + t.Fatalf("Deserialized UTXO entry is not equal to the original UTXO entry for outpoint %s:%d "+ + "in the toRemove collection", testOutpoint.TransactionID, testOutpoint.Index) + } + } +} + func BenchmarkUTXODiffSerialization(b *testing.B) { utxoDiffStore := New(0).(*utxoDiffStore) - testUTXODiff := buildTestUTXODiff(b) + testUTXODiff, err := buildTestUTXODiff() + if err != nil { + b.Fatalf("Could not create UTXODiff from toAdd and toRemove collections: %s", err) + } b.ResetTimer() for i := 0; i < b.N; i++ { @@ -25,7 +89,10 @@ func BenchmarkUTXODiffSerialization(b *testing.B) { func BenchmarkUTXODiffDeserialization(b *testing.B) { utxoDiffStore := New(0).(*utxoDiffStore) - testUTXODiff := buildTestUTXODiff(b) + testUTXODiff, err := buildTestUTXODiff() + if err != nil { + b.Fatalf("Could not create UTXODiff from toAdd and toRemove collections: %s", err) + } serializedUTXODiff, err := utxoDiffStore.serializeUTXODiff(testUTXODiff) if err != nil { b.Fatalf("Could not serialize UTXO diff: %s", err) @@ -43,7 +110,10 @@ func BenchmarkUTXODiffDeserialization(b *testing.B) { func BenchmarkUTXODiffSerializationAndDeserialization(b *testing.B) { utxoDiffStore := New(0).(*utxoDiffStore) - testUTXODiff := buildTestUTXODiff(b) + testUTXODiff, err := buildTestUTXODiff() + if err != nil { + b.Fatalf("Could not create UTXODiff from toAdd and toRemove collections: %s", err) + } b.ResetTimer() for i := 0; i < b.N; i++ { @@ -58,15 +128,15 @@ func BenchmarkUTXODiffSerializationAndDeserialization(b *testing.B) { } } -func buildTestUTXODiff(b *testing.B) model.UTXODiff { +func buildTestUTXODiff() (model.UTXODiff, error) { toAdd := buildTestUTXOCollection() toRemove := buildTestUTXOCollection() utxoDiff, err := utxo.NewUTXODiffFromCollections(toAdd, toRemove) if err != nil { - b.Fatalf("Could not create UTXODiff from toAdd and toRemove collections: %s", err) + return nil, err } - return utxoDiff + return utxoDiff, nil } func buildTestUTXOCollection() model.UTXOCollection {