Use SerializeUTXODiff and DeserializeUTXODiff in utxoDiffStore and implement TestUTXODiffSerializationAndDeserialization.

This commit is contained in:
stasatdaglabs 2021-01-28 14:19:06 +02:00
parent 8588774837
commit d5f2495522
2 changed files with 83 additions and 21 deletions

View File

@ -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) {

View File

@ -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 {