Repository: kaspanet/kaspad
Pull request #1550 (2021-02-23 12:53:50)

Remove virtual diff parents
This fixes https://github.com/kaspanet/kaspad/issues/1417

The gist: There’s only 1 virtualDiffParent at any time: the selectedTip.

Practically:
1. Whenever newBlock is being UTXO-Verified, when setting it’s diffChild:
2. If newBlock is going to be the new selectedTip:
2.1. Set oldSelectedTip.DiffChild = newBlock
2.2. newBlock.DiffChild = virtual (as has been done previously)
3. Else:
3.1. Set newBlock.DiffChild = selectedTip

This allows us to get rid of the whole virtualDiffParent mechanisms, simplifying the code tremendously.

There is one downside to this:
In re-orgs, all the blocks in the new selectedChain (excluding the tip) are going to have the oldSelectedTip as their DiffChild, which might incur a (very) large diff.
For now this situation is acceptable, and much better then previous situation in the average case. There are a few proposed solutions, to be decided upon and implemented later down the line.

codecov[bot]: # [Codecov](https://codecov.io/gh/kaspanet/kaspad/pull/1550?src=pr&el=h1) Report
> Merging [#1550](https://codecov.io/gh/kaspanet/kaspad/pull/1550?src=pr&el=desc) (e04e7ab) into [v0.9.0-dev](https://codecov.io/gh/kaspanet/kaspad/commit/bee0893660e26bd9ee2abc739c146172244fff44?el=desc) (bee0893) will **increase** coverage by `0.05%`.
> The diff coverage is `77.35%`.

[![Impacted file tree graph](https://codecov.io/gh/kaspanet/kaspad/pull/1550/graphs/tree.svg?width=650&height=150&src=pr&token=2FBIEEJTNU)](https://codecov.io/gh/kaspanet/kaspad/pull/1550?src=pr&el=tree)

```diff
@@              Coverage Diff               @@
##           v0.9.0-dev    #1550      +/-   ##
==============================================
+ Coverage       61.86%   61.92%   +0.05%     
==============================================
  Files             508      506       -2     
  Lines           19338    19252      -86     
==============================================
- Hits            11964    11922      -42     
+ Misses           5678     5646      -32     
+ Partials         1696     1684      -12     
```


| [Impacted Files](https://codecov.io/gh/kaspanet/kaspad/pull/1550?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [...uctures/consensusstatestore/consensusstatestore.go](https://codecov.io/gh/kaspanet/kaspad/pull/1550/diff?src=pr&el=tree#diff-ZG9tYWluL2NvbnNlbnN1cy9kYXRhc3RydWN0dXJlcy9jb25zZW5zdXNzdGF0ZXN0b3JlL2NvbnNlbnN1c3N0YXRlc3RvcmUuZ28=) | `57.14% <ø> (+4.51%)` | :arrow_up: |
| [...nsus/processes/consensusstatemanager/utxo\_diffs.go](https://codecov.io/gh/kaspanet/kaspad/pull/1550/diff?src=pr&el=tree#diff-ZG9tYWluL2NvbnNlbnN1cy9wcm9jZXNzZXMvY29uc2Vuc3Vzc3RhdGVtYW5hZ2VyL3V0eG9fZGlmZnMuZ28=) | `100.00% <ø> (+16.66%)` | :arrow_up: |
| [...nsensus/processes/pruningmanager/pruningmanager.go](https://codecov.io/gh/kaspanet/kaspad/pull/1550/diff?src=pr&el=tree#diff-ZG9tYWluL2NvbnNlbnN1cy9wcm9jZXNzZXMvcHJ1bmluZ21hbmFnZXIvcHJ1bmluZ21hbmFnZXIuZ28=) | `58.27% <ø> (+0.05%)` | :arrow_up: |
| [...sses/consensusstatemanager/resolve\_block\_status.go](https://codecov.io/gh/kaspanet/kaspad/pull/1550/diff?src=pr&el=tree#diff-ZG9tYWluL2NvbnNlbnN1cy9wcm9jZXNzZXMvY29uc2Vuc3Vzc3RhdGVtYW5hZ2VyL3Jlc29sdmVfYmxvY2tfc3RhdHVzLmdv) | `72.09% <74.35%> (-0.43%)` | :arrow_down: |
| [.../processes/consensusstatemanager/update\_virtual.go](https://codecov.io/gh/kaspanet/kaspad/pull/1550/diff?src=pr&el=tree#diff-ZG9tYWluL2NvbnNlbnN1cy9wcm9jZXNzZXMvY29uc2Vuc3Vzc3RhdGVtYW5hZ2VyL3VwZGF0ZV92aXJ0dWFsLmdv) | `70.14% <83.33%> (+3.95%)` | :arrow_up: |
| [...s/consensusstatemanager/import\_pruning\_utxo\_set.go](https://codecov.io/gh/kaspanet/kaspad/pull/1550/diff?src=pr&el=tree#diff-ZG9tYWluL2NvbnNlbnN1cy9wcm9jZXNzZXMvY29uc2Vuc3Vzc3RhdGVtYW5hZ2VyL2ltcG9ydF9wcnVuaW5nX3V0eG9fc2V0Lmdv) | `58.82% <100.00%> (+0.28%)` | :arrow_up: |
| [...ensus/processes/consensusstatemanager/multisets.go](https://codecov.io/gh/kaspanet/kaspad/pull/1550/diff?src=pr&el=tree#diff-ZG9tYWluL2NvbnNlbnN1cy9wcm9jZXNzZXMvY29uc2Vuc3Vzc3RhdGVtYW5hZ2VyL211bHRpc2V0cy5nbw==) | `69.81% <100.00%> (-0.56%)` | :arrow_down: |
| [app/protocol/flows/blockrelay/handle\_relay\_invs.go](https://codecov.io/gh/kaspanet/kaspad/pull/1550/diff?src=pr&el=tree#diff-YXBwL3Byb3RvY29sL2Zsb3dzL2Jsb2NrcmVsYXkvaGFuZGxlX3JlbGF5X2ludnMuZ28=) | `70.00% <0.00%> (+1.25%)` | :arrow_up: |
| [infrastructure/network/netadapter/netconnection.go](https://codecov.io/gh/kaspanet/kaspad/pull/1550/diff?src=pr&el=tree#diff-aW5mcmFzdHJ1Y3R1cmUvbmV0d29yay9uZXRhZGFwdGVyL25ldGNvbm5lY3Rpb24uZ28=) | `91.89% <0.00%> (+1.41%)` | :arrow_up: |
| [infrastructure/network/addressmanager/store.go](https://codecov.io/gh/kaspanet/kaspad/pull/1550/diff?src=pr&el=tree#diff-aW5mcmFzdHJ1Y3R1cmUvbmV0d29yay9hZGRyZXNzbWFuYWdlci9zdG9yZS5nbw==) | `78.50% <0.00%> (+1.86%)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/kaspanet/kaspad/pull/1550?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/kaspanet/kaspad/pull/1550?src=pr&el=footer). Last update [bee0893...e04e7ab](https://codecov.io/gh/kaspanet/kaspad/pull/1550?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).


Patch:
diff --git a/domain/consensus/database/serialization/dbobjects.pb.go b/domain/consensus/database/serialization/dbobjects.pb.go
index 2fa9f88d..d562f8ea 100644
--- a/domain/consensus/database/serialization/dbobjects.pb.go
+++ b/domain/consensus/database/serialization/dbobjects.pb.go
@@ -1520,53 +1520,6 @@ func (x *DbTips) GetTips() []*DbHash {
 	return nil
 }
 
-type DbVirtualDiffParents struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	VirtualDiffParents []*DbHash `protobuf:"bytes,1,rep,name=virtualDiffParents,proto3" json:"virtualDiffParents,omitempty"`
-}
-
-func (x *DbVirtualDiffParents) Reset() {
-	*x = DbVirtualDiffParents{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_dbobjects_proto_msgTypes[25]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *DbVirtualDiffParents) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*DbVirtualDiffParents) ProtoMessage() {}
-
-func (x *DbVirtualDiffParents) ProtoReflect() protoreflect.Message {
-	mi := &file_dbobjects_proto_msgTypes[25]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use DbVirtualDiffParents.ProtoReflect.Descriptor instead.
-func (*DbVirtualDiffParents) Descriptor() ([]byte, []int) {
-	return file_dbobjects_proto_rawDescGZIP(), []int{25}
-}
-
-func (x *DbVirtualDiffParents) GetVirtualDiffParents() []*DbHash {
-	if x != nil {
-		return x.VirtualDiffParents
-	}
-	return nil
-}
-
 type DbBlockCount struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1578,7 +1531,7 @@ type DbBlockCount struct {
 func (x *DbBlockCount) Reset() {
 	*x = DbBlockCount{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_dbobjects_proto_msgTypes[26]
+		mi := &file_dbobjects_proto_msgTypes[25]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1591,7 +1544,7 @@ func (x *DbBlockCount) String() string {
 func (*DbBlockCount) ProtoMessage() {}
 
 func (x *DbBlockCount) ProtoReflect() protoreflect.Message {
-	mi := &file_dbobjects_proto_msgTypes[26]
+	mi := &file_dbobjects_proto_msgTypes[25]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1604,7 +1557,7 @@ func (x *DbBlockCount) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DbBlockCount.ProtoReflect.Descriptor instead.
 func (*DbBlockCount) Descriptor() ([]byte, []int) {
-	return file_dbobjects_proto_rawDescGZIP(), []int{26}
+	return file_dbobjects_proto_rawDescGZIP(), []int{25}
 }
 
 func (x *DbBlockCount) GetCount() uint64 {
@@ -1625,7 +1578,7 @@ type DbBlockHeaderCount struct {
 func (x *DbBlockHeaderCount) Reset() {
 	*x = DbBlockHeaderCount{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_dbobjects_proto_msgTypes[27]
+		mi := &file_dbobjects_proto_msgTypes[26]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1638,7 +1591,7 @@ func (x *DbBlockHeaderCount) String() string {
 func (*DbBlockHeaderCount) ProtoMessage() {}
 
 func (x *DbBlockHeaderCount) ProtoReflect() protoreflect.Message {
-	mi := &file_dbobjects_proto_msgTypes[27]
+	mi := &file_dbobjects_proto_msgTypes[26]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1651,7 +1604,7 @@ func (x *DbBlockHeaderCount) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DbBlockHeaderCount.ProtoReflect.Descriptor instead.
 func (*DbBlockHeaderCount) Descriptor() ([]byte, []int) {
-	return file_dbobjects_proto_rawDescGZIP(), []int{27}
+	return file_dbobjects_proto_rawDescGZIP(), []int{26}
 }
 
 func (x *DbBlockHeaderCount) GetCount() uint64 {
@@ -1891,21 +1844,15 @@ var file_dbobjects_proto_rawDesc = []byte{
 	0x62, 0x54, 0x69, 0x70, 0x73, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x69, 0x70, 0x73, 0x18, 0x01, 0x20,
 	0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74,
 	0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x62, 0x48, 0x61, 0x73, 0x68, 0x52, 0x04, 0x74, 0x69, 0x70, 0x73,
-	0x22, 0x5d, 0x0a, 0x14, 0x44, 0x62, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x44, 0x69, 0x66,
-	0x66, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x45, 0x0a, 0x12, 0x76, 0x69, 0x72, 0x74,
-	0x75, 0x61, 0x6c, 0x44, 0x69, 0x66, 0x66, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01,
-	0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x62, 0x48, 0x61, 0x73, 0x68, 0x52, 0x12, 0x76, 0x69, 0x72,
-	0x74, 0x75, 0x61, 0x6c, 0x44, 0x69, 0x66, 0x66, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x22,
-	0x24, 0x0a, 0x0c, 0x44, 0x62, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12,
-	0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05,
-	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2a, 0x0a, 0x12, 0x44, 0x62, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
-	0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63,
-	0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e,
-	0x74, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
-	0x6b, 0x61, 0x73, 0x70, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x2f,
-	0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x22, 0x24, 0x0a, 0x0c, 0x44, 0x62, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74,
+	0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52,
+	0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2a, 0x0a, 0x12, 0x44, 0x62, 0x42, 0x6c, 0x6f, 0x63,
+	0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05,
+	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75,
+	0x6e, 0x74, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
+	0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x64,
+	0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -1920,7 +1867,7 @@ func file_dbobjects_proto_rawDescGZIP() []byte {
 	return file_dbobjects_proto_rawDescData
 }
 
-var file_dbobjects_proto_msgTypes = make([]protoimpl.MessageInfo, 28)
+var file_dbobjects_proto_msgTypes = make([]protoimpl.MessageInfo, 27)
 var file_dbobjects_proto_goTypes = []interface{}{
 	(*DbBlock)(nil),                     // 0: serialization.DbBlock
 	(*DbBlockHeader)(nil),               // 1: serialization.DbBlockHeader
@@ -1947,9 +1894,8 @@ var file_dbobjects_proto_goTypes = []interface{}{
 	(*DbReachabilityInterval)(nil),      // 22: serialization.DbReachabilityInterval
 	(*DbUtxoDiff)(nil),                  // 23: serialization.DbUtxoDiff
 	(*DbTips)(nil),                      // 24: serialization.DbTips
-	(*DbVirtualDiffParents)(nil),        // 25: serialization.DbVirtualDiffParents
-	(*DbBlockCount)(nil),                // 26: serialization.DbBlockCount
-	(*DbBlockHeaderCount)(nil),          // 27: serialization.DbBlockHeaderCount
+	(*DbBlockCount)(nil),                // 25: serialization.DbBlockCount
+	(*DbBlockHeaderCount)(nil),          // 26: serialization.DbBlockHeaderCount
 }
 var file_dbobjects_proto_depIdxs = []int32{
 	1,  // 0: serialization.DbBlock.header:type_name -> serialization.DbBlockHeader
@@ -1988,12 +1934,11 @@ var file_dbobjects_proto_depIdxs = []int32{
 	18, // 33: serialization.DbUtxoDiff.toAdd:type_name -> serialization.DbUtxoCollectionItem
 	18, // 34: serialization.DbUtxoDiff.toRemove:type_name -> serialization.DbUtxoCollectionItem
 	2,  // 35: serialization.DbTips.tips:type_name -> serialization.DbHash
-	2,  // 36: serialization.DbVirtualDiffParents.virtualDiffParents:type_name -> serialization.DbHash
-	37, // [37:37] is the sub-list for method output_type
-	37, // [37:37] is the sub-list for method input_type
-	37, // [37:37] is the sub-list for extension type_name
-	37, // [37:37] is the sub-list for extension extendee
-	0,  // [0:37] is the sub-list for field type_name
+	36, // [36:36] is the sub-list for method output_type
+	36, // [36:36] is the sub-list for method input_type
+	36, // [36:36] is the sub-list for extension type_name
+	36, // [36:36] is the sub-list for extension extendee
+	0,  // [0:36] is the sub-list for field type_name
 }
 
 func init() { file_dbobjects_proto_init() }
@@ -2303,18 +2248,6 @@ func file_dbobjects_proto_init() {
 			}
 		}
 		file_dbobjects_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DbVirtualDiffParents); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_dbobjects_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*DbBlockCount); i {
 			case 0:
 				return &v.state
@@ -2326,7 +2259,7 @@ func file_dbobjects_proto_init() {
 				return nil
 			}
 		}
-		file_dbobjects_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+		file_dbobjects_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*DbBlockHeaderCount); i {
 			case 0:
 				return &v.state
@@ -2345,7 +2278,7 @@ func file_dbobjects_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_dbobjects_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   28,
+			NumMessages:   27,
 			NumExtensions: 0,
 			NumServices:   0,
 		},
diff --git a/domain/consensus/database/serialization/dbobjects.proto b/domain/consensus/database/serialization/dbobjects.proto
index f338e83c..80742556 100644
--- a/domain/consensus/database/serialization/dbobjects.proto
+++ b/domain/consensus/database/serialization/dbobjects.proto
@@ -143,10 +143,6 @@ message DbTips {
   repeated DbHash tips = 1;
 }
 
-message DbVirtualDiffParents {
-  repeated DbHash virtualDiffParents = 1;
-}
-
 message DbBlockCount {
   uint64 count = 1;
 }
diff --git a/domain/consensus/database/serialization/virtual_diff_parents.go b/domain/consensus/database/serialization/virtual_diff_parents.go
deleted file mode 100644
index 9d933d41..00000000
--- a/domain/consensus/database/serialization/virtual_diff_parents.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package serialization
-
-import (
-	"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
-)
-
-// VirtualDiffParentsToDBHeaderVirtualDiffParents converts a slice of hashes to DbVirtualDiffParents
-func VirtualDiffParentsToDBHeaderVirtualDiffParents(tips []*externalapi.DomainHash) *DbVirtualDiffParents {
-	return &DbVirtualDiffParents{
-		VirtualDiffParents: DomainHashesToDbHashes(tips),
-	}
-}
-
-// DBVirtualDiffParentsToVirtualDiffParents converts DbHeaderTips to a slice of hashes
-func DBVirtualDiffParentsToVirtualDiffParents(dbVirtualDiffParents *DbVirtualDiffParents) ([]*externalapi.DomainHash, error) {
-	return DbHashesToDomainHashes(dbVirtualDiffParents.VirtualDiffParents)
-}
diff --git a/domain/consensus/processes/consensusstatemanager/import_pruning_utxo_set.go b/domain/consensus/processes/consensusstatemanager/import_pruning_utxo_set.go
index 61af1b85..8c26c7c9 100644
--- a/domain/consensus/processes/consensusstatemanager/import_pruning_utxo_set.go
+++ b/domain/consensus/processes/consensusstatemanager/import_pruning_utxo_set.go
@@ -77,14 +77,8 @@ func (csm *consensusStateManager) importPruningPoint(newPruningPoint *externalap
 		return err
 	}
 
-	log.Debugf("Deleting all existing virtual diff parents")
-	csm.consensusStateStore.StageVirtualDiffParents(nil)
-
 	log.Debugf("Updating the new pruning point to be the new virtual diff parent with an empty diff")
-	err = csm.stageDiff(newPruningPointHash, utxo.NewUTXODiff(), nil)
-	if err != nil {
-		return err
-	}
+	csm.stageDiff(newPruningPointHash, utxo.NewUTXODiff(), nil)
 
 	log.Debugf("Staging the new pruning point %s", newPruningPointHash)
 	csm.pruningStore.StagePruningPoint(newPruningPointHash)
diff --git a/domain/consensus/processes/consensusstatemanager/multisets.go b/domain/consensus/processes/consensusstatemanager/multisets.go
index 5960dcc1..eda36475 100644
--- a/domain/consensus/processes/consensusstatemanager/multisets.go
+++ b/domain/consensus/processes/consensusstatemanager/multisets.go
@@ -38,8 +38,7 @@ func (csm *consensusStateManager) calculateMultiset(
 			isCoinbase := i == 0
 			log.Tracef("Is transaction %s a coinbase transaction: %t", transactionID, isCoinbase)
 
-			var err error
-			err = addTransactionToMultiset(ms, transaction, blockGHOSTDAGData.BlueScore(), isCoinbase)
+			err := addTransactionToMultiset(ms, transaction, blockGHOSTDAGData.BlueScore(), isCoinbase)
 			if err != nil {
 				return nil, err
 			}
diff --git a/domain/consensus/processes/consensusstatemanager/resolve_block_status.go b/domain/consensus/processes/consensusstatemanager/resolve_block_status.go
index 37ae943c..81e95d84 100644
--- a/domain/consensus/processes/consensusstatemanager/resolve_block_status.go
+++ b/domain/consensus/processes/consensusstatemanager/resolve_block_status.go
@@ -1,14 +1,18 @@
 package consensusstatemanager
 
 import (
+	"fmt"
+
+	"github.com/kaspanet/kaspad/domain/consensus/model"
 	"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
 	"github.com/kaspanet/kaspad/domain/consensus/ruleerrors"
+	"github.com/kaspanet/kaspad/infrastructure/logger"
 	"github.com/pkg/errors"
 )
 
 func (csm *consensusStateManager) resolveBlockStatus(blockHash *externalapi.DomainHash) (externalapi.BlockStatus, error) {
-	log.Debugf("resolveBlockStatus start for block %s", blockHash)
-	defer log.Debugf("resolveBlockStatus end for block %s", blockHash)
+	onEnd := logger.LogAndMeasureExecutionTime(log, fmt.Sprintf("resolveBlockStatus for %s", blockHash))
+	defer onEnd()
 
 	log.Debugf("Getting a list of all blocks in the selected "+
 		"parent chain of %s that have no yet resolved their status", blockHash)
@@ -55,7 +59,8 @@ func (csm *consensusStateManager) resolveBlockStatus(blockHash *externalapi.Doma
 
 		csm.blockStatusStore.Stage(unverifiedBlockHash, blockStatus)
 		selectedParentStatus = blockStatus
-		log.Debugf("Block %s status resolved to `%s`, finished %d/%d of unverified blocks", unverifiedBlockHash, blockStatus, len(unverifiedBlocks)-i, len(unverifiedBlocks))
+		log.Debugf("Block %s status resolved to `%s`, finished %d/%d of unverified blocks",
+			unverifiedBlockHash, blockStatus, len(unverifiedBlocks)-i, len(unverifiedBlocks))
 	}
 
 	return blockStatus, nil
@@ -120,8 +125,8 @@ func (csm *consensusStateManager) getUnverifiedChainBlocks(
 }
 
 func (csm *consensusStateManager) resolveSingleBlockStatus(blockHash *externalapi.DomainHash) (externalapi.BlockStatus, error) {
-	log.Debugf("resolveSingleBlockStatus start for block %s", blockHash)
-	defer log.Debugf("resolveSingleBlockStatus end for block %s", blockHash)
+	onEnd := logger.LogAndMeasureExecutionTime(log, fmt.Sprintf("resolveSingleBlockStatus for %s", blockHash))
+	defer onEnd()
 
 	log.Tracef("Calculating pastUTXO and acceptance data and multiset for block %s", blockHash)
 	pastUTXODiff, acceptanceData, multiset, err := csm.CalculatePastUTXOAndAcceptanceData(blockHash)
@@ -151,72 +156,63 @@ func (csm *consensusStateManager) resolveSingleBlockStatus(blockHash *externalap
 	log.Tracef("Staging the multiset of block %s", blockHash)
 	csm.multisetStore.Stage(blockHash, multiset)
 
-	log.Tracef("Staging the utxoDiff of block %s", blockHash)
-	err = csm.stageDiff(blockHash, pastUTXODiff, nil)
-	if err != nil {
-		return 0, err
+	if csm.genesisHash.Equal(blockHash) {
+		log.Tracef("Staging the utxoDiff of genesis")
+		csm.stageDiff(blockHash, pastUTXODiff, nil)
+		return externalapi.StatusUTXOValid, nil
 	}
 
-	log.Tracef("Remove block ancestors from virtual diff parents and assign %s as their diff child", blockHash)
-	err = csm.removeAncestorsFromVirtualDiffParentsAndAssignDiffChild(blockHash, pastUTXODiff)
+	oldSelectedTip, err := csm.selectedTip()
 	if err != nil {
 		return 0, err
 	}
 
-	return externalapi.StatusUTXOValid, nil
-}
-
-func (csm *consensusStateManager) removeAncestorsFromVirtualDiffParentsAndAssignDiffChild(
-	blockHash *externalapi.DomainHash, pastUTXODiff externalapi.UTXODiff) error {
-
-	log.Tracef("removeAncestorsFromVirtualDiffParentsAndAssignDiffChild start for block %s", blockHash)
-	defer log.Tracef("removeAncestorsFromVirtualDiffParentsAndAssignDiffChild end for block %s", blockHash)
-
-	if blockHash.Equal(csm.genesisHash) {
-		log.Tracef("Genesis block doesn't have ancestors to remove from the virtual diff parents")
-		return nil
+	isNewSelectedTip, err := csm.isNewSelectedTip(blockHash, oldSelectedTip)
+	if err != nil {
+		return 0, err
 	}
-
-	virtualDiffParents, err := csm.consensusStateStore.VirtualDiffParents(csm.databaseContext)
+	oldSelectedTipUTXOSet, err := csm.restorePastUTXO(oldSelectedTip)
 	if err != nil {
-		return err
+		return 0, err
 	}
-
-	for _, virtualDiffParent := range virtualDiffParents {
-		if virtualDiffParent.Equal(blockHash) {
-			log.Tracef("Skipping updating virtual diff parent %s "+
-				"because it was updated before.", virtualDiffParent)
-			continue
+	if isNewSelectedTip {
+		log.Debugf("Block %s is the new SelectedTip, therefore setting it as old selectedTip's diffChild", blockHash)
+		oldSelectedTipUTXOSet, err := pastUTXODiff.DiffFrom(oldSelectedTipUTXOSet.ToImmutable())
+		if err != nil {
+			return 0, err
 		}
+		csm.stageDiff(oldSelectedTip, oldSelectedTipUTXOSet, blockHash)
 
-		isAncestorOfBlock, err := csm.dagTopologyManager.IsAncestorOf(virtualDiffParent, blockHash)
+		log.Tracef("Staging the utxoDiff of block %s", blockHash)
+		csm.stageDiff(blockHash, pastUTXODiff, nil)
+	} else {
+		log.Debugf("Block %s is not the new SelectedTip, therefore setting old selectedTip as it's diffChild", blockHash)
+		pastUTXODiff, err = oldSelectedTipUTXOSet.DiffFrom(pastUTXODiff)
 		if err != nil {
-			return err
+			return 0, err
 		}
 
-		if !isAncestorOfBlock {
-			log.Tracef("Skipping block %s because it's not an "+
-				"ancestor of %s", virtualDiffParent, blockHash)
-			continue
-		}
+		log.Tracef("Staging the utxoDiff of block %s", blockHash)
+		csm.stageDiff(blockHash, pastUTXODiff, oldSelectedTip)
+	}
 
-		// parents that didn't have a utxo-diff child until now were actually virtual's diffParents.
-		// Update them to have the new block as their utxo-diff child
-		log.Tracef("Updating %s to be the diff child of %s", blockHash, virtualDiffParent)
-		currentDiff, err := csm.utxoDiffStore.UTXODiff(csm.databaseContext, virtualDiffParent)
-		if err != nil {
-			return err
-		}
-		newDiff, err := pastUTXODiff.DiffFrom(currentDiff)
-		if err != nil {
-			return err
-		}
+	return externalapi.StatusUTXOValid, nil
+}
 
-		err = csm.stageDiff(virtualDiffParent, newDiff, blockHash)
-		if err != nil {
-			return err
-		}
+func (csm *consensusStateManager) isNewSelectedTip(blockHash, oldSelectedTip *externalapi.DomainHash) (bool, error) {
+	newSelectedTip, err := csm.ghostdagManager.ChooseSelectedParent(blockHash, oldSelectedTip)
+	if err != nil {
+		return false, err
+	}
+
+	return blockHash.Equal(newSelectedTip), nil
+}
+
+func (csm *consensusStateManager) selectedTip() (*externalapi.DomainHash, error) {
+	virtualGHOSTDAGData, err := csm.ghostdagDataStore.Get(csm.databaseContext, model.VirtualBlockHash)
+	if err != nil {
+		return nil, err
 	}
 
-	return nil
+	return virtualGHOSTDAGData.SelectedParent(), nil
 }
diff --git a/domain/consensus/processes/consensusstatemanager/update_virtual.go b/domain/consensus/processes/consensusstatemanager/update_virtual.go
index 750dace7..bf48e46d 100644
--- a/domain/consensus/processes/consensusstatemanager/update_virtual.go
+++ b/domain/consensus/processes/consensusstatemanager/update_virtual.go
@@ -60,8 +60,8 @@ func (csm *consensusStateManager) updateVirtual(newBlockHash *externalapi.Domain
 	log.Debugf("Staging new UTXO diff for the virtual block")
 	csm.consensusStateStore.StageVirtualUTXODiff(virtualUTXODiff)
 
-	log.Debugf("Updating the virtual diff parents after adding %s to the DAG", newBlockHash)
-	err = csm.updateVirtualDiffParents(virtualUTXODiff)
+	log.Debugf("Updating the selected tip's utxo-diff after adding %s to the DAG", newBlockHash)
+	err = csm.updateSelectedTipUTXODiff(virtualUTXODiff)
 	if err != nil {
 		return nil, nil, err
 	}
@@ -86,32 +86,27 @@ func (csm *consensusStateManager) updateVirtual(newBlockHash *externalapi.Domain
 	return selectedParentChainChanges, virtualUTXODiff, nil
 }
 
-func (csm *consensusStateManager) updateVirtualDiffParents(virtualUTXODiff externalapi.UTXODiff) error {
-	log.Debugf("updateVirtualDiffParents start")
-	defer log.Debugf("updateVirtualDiffParents end")
+func (csm *consensusStateManager) updateSelectedTipUTXODiff(virtualUTXODiff externalapi.UTXODiff) error {
+	onEnd := logger.LogAndMeasureExecutionTime(log, "updateSelectedTipUTXODiff")
+	defer onEnd()
 
-	virtualDiffParents, err := csm.consensusStateStore.VirtualDiffParents(csm.databaseContext)
+	selectedTip, err := csm.selectedTip()
 	if err != nil {
 		return err
 	}
 
-	for _, virtualDiffParent := range virtualDiffParents {
-		log.Debugf("Calculating new UTXO diff for virtual diff parent %s", virtualDiffParent)
-		virtualDiffParentUTXODiff, err := csm.utxoDiffStore.UTXODiff(csm.databaseContext, virtualDiffParent)
-		if err != nil {
-			return err
-		}
-		newDiff, err := virtualUTXODiff.DiffFrom(virtualDiffParentUTXODiff)
-		if err != nil {
-			return err
-		}
-
-		log.Debugf("Staging new UTXO diff for virtual diff parent %s", virtualDiffParent)
-		err = csm.stageDiff(virtualDiffParent, newDiff, nil)
-		if err != nil {
-			return err
-		}
+	log.Debugf("Calculating new UTXO diff for virtual diff parent %s", selectedTip)
+	selectedTipUTXODiff, err := csm.utxoDiffStore.UTXODiff(csm.databaseContext, selectedTip)
+	if err != nil {
+		return err
 	}
+	newDiff, err := virtualUTXODiff.DiffFrom(selectedTipUTXODiff)
+	if err != nil {
+		return err
+	}
+
+	log.Debugf("Staging new UTXO diff for virtual diff parent %s", selectedTip)
+	csm.stageDiff(selectedTip, newDiff, nil)
 
 	return nil
 }
diff --git a/domain/consensus/processes/consensusstatemanager/utxo_diffs.go b/domain/consensus/processes/consensusstatemanager/utxo_diffs.go
index fd974665..91e7cccc 100644
--- a/domain/consensus/processes/consensusstatemanager/utxo_diffs.go
+++ b/domain/consensus/processes/consensusstatemanager/utxo_diffs.go
@@ -2,81 +2,14 @@ package consensusstatemanager
 
 import (
 	"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
-	"github.com/pkg/errors"
 )
 
 func (csm *consensusStateManager) stageDiff(blockHash *externalapi.DomainHash,
-	utxoDiff externalapi.UTXODiff, utxoDiffChild *externalapi.DomainHash) error {
+	utxoDiff externalapi.UTXODiff, utxoDiffChild *externalapi.DomainHash) {
 
 	log.Debugf("stageDiff start for block %s", blockHash)
 	defer log.Debugf("stageDiff end for block %s", blockHash)
 
 	log.Debugf("Staging block %s as the diff child of %s", utxoDiffChild, blockHash)
 	csm.utxoDiffStore.Stage(blockHash, utxoDiff, utxoDiffChild)
-
-	if utxoDiffChild == nil {
-		log.Debugf("Adding block %s to the virtual diff parents", blockHash)
-		return csm.addToVirtualDiffParents(blockHash)
-	}
-
-	log.Debugf("Removing block %s from the virtual diff parents", blockHash)
-	return csm.removeFromVirtualDiffParents(blockHash)
-}
-
-func (csm *consensusStateManager) addToVirtualDiffParents(blockHash *externalapi.DomainHash) error {
-	log.Debugf("addToVirtualDiffParents start for block %s", blockHash)
-	defer log.Debugf("addToVirtualDiffParents end for block %s", blockHash)
-
-	var oldVirtualDiffParents []*externalapi.DomainHash
-	if !blockHash.Equal(csm.genesisHash) {
-		var err error
-		oldVirtualDiffParents, err = csm.consensusStateStore.VirtualDiffParents(csm.databaseContext)
-		if err != nil {
-			return err
-		}
-	}
-
-	isInVirtualDiffParents := false
-	for _, diffParent := range oldVirtualDiffParents {
-		if diffParent.Equal(blockHash) {
-			isInVirtualDiffParents = true
-			break
-		}
-	}
-
-	if isInVirtualDiffParents {
-		log.Debugf("Block %s is already a virtual diff parent, so there's no need to add it", blockHash)
-		return nil
-	}
-
-	newVirtualDiffParents := append([]*externalapi.DomainHash{blockHash}, oldVirtualDiffParents...)
-	log.Debugf("Staging virtual diff parents after adding %s to it", blockHash)
-	csm.consensusStateStore.StageVirtualDiffParents(newVirtualDiffParents)
-	return nil
-}
-
-func (csm *consensusStateManager) removeFromVirtualDiffParents(blockHash *externalapi.DomainHash) error {
-	log.Debugf("removeFromVirtualDiffParents start for block %s", blockHash)
-	defer log.Debugf("removeFromVirtualDiffParents end for block %s", blockHash)
-
-	oldVirtualDiffParents, err := csm.consensusStateStore.VirtualDiffParents(csm.databaseContext)
-	if err != nil {
-		return err
-	}
-
-	newVirtualDiffParents := make([]*externalapi.DomainHash, 0, len(oldVirtualDiffParents)-1)
-	for _, diffParent := range oldVirtualDiffParents {
-		if !diffParent.Equal(blockHash) {
-			newVirtualDiffParents = append(newVirtualDiffParents, diffParent)
-		}
-	}
-
-	if len(newVirtualDiffParents) != len(oldVirtualDiffParents)-1 {
-		return errors.Errorf("expected to remove one member from virtual diff parents and "+
-			"have a length of %d but got length of %d", len(oldVirtualDiffParents)-1, len(newVirtualDiffParents))
-	}
-
-	log.Debugf("Staging virtual diff parents after removing %s from it", blockHash)
-	csm.consensusStateStore.StageVirtualDiffParents(newVirtualDiffParents)
-	return nil
 }
diff --git a/domain/consensus/processes/pruningmanager/pruningmanager.go b/domain/consensus/processes/pruningmanager/pruningmanager.go
index 18eb8aa5..e393b938 100644
--- a/domain/consensus/processes/pruningmanager/pruningmanager.go
+++ b/domain/consensus/processes/pruningmanager/pruningmanager.go
@@ -256,11 +256,6 @@ func (pm *pruningManager) deletePastBlocks(pruningPoint *externalapi.DomainHash)
 		return err
 	}
 
-	err = pm.pruneVirtualDiffParents(pruningPoint, virtualParents)
-	if err != nil {
-		return err
-	}
-
 	return nil
 }
 
@@ -292,26 +287,6 @@ func (pm *pruningManager) deleteBlocksDownward(queue model.BlockHeap) error {
 	return nil
 }
 
-func (pm *pruningManager) pruneVirtualDiffParents(pruningPoint *externalapi.DomainHash, virtualParents []*externalapi.DomainHash) error {
-	virtualDiffParents, err := pm.consensusStateStore.VirtualDiffParents(pm.databaseContext)
-	if err != nil {
-		return err
-	}
-	validVirtualDiffParents := make([]*externalapi.DomainHash, 0, len(virtualParents))
-	for _, parent := range virtualDiffParents {
-		isInPruningFutureOrInVirtualPast, err := pm.isInPruningFutureOrInVirtualPast(parent, pruningPoint, virtualParents)
-		if err != nil {
-			return err
-		}
-		if isInPruningFutureOrInVirtualPast {
-			validVirtualDiffParents = append(validVirtualDiffParents, parent)
-		}
-	}
-	pm.consensusStateStore.StageVirtualDiffParents(validVirtualDiffParents)
-
-	return nil
-}
-
 func (pm *pruningManager) pruneTips(pruningPoint *externalapi.DomainHash, virtualParents []*externalapi.DomainHash) (
 	prunedTips []*externalapi.DomainHash, err error) {
 


Test patch:
diff --git a/domain/consensus/datastructures/consensusstatestore/consensusstatestore.go b/domain/consensus/datastructures/consensusstatestore/consensusstatestore.go
index b7d71b7a..b627e929 100644
--- a/domain/consensus/datastructures/consensusstatestore/consensusstatestore.go
+++ b/domain/consensus/datastructures/consensusstatestore/consensusstatestore.go
@@ -8,14 +8,12 @@ import (
 
 // consensusStateStore represents a store for the current consensus state
 type consensusStateStore struct {
-	tipsStaging               []*externalapi.DomainHash
-	virtualDiffParentsStaging []*externalapi.DomainHash
-	virtualUTXODiffStaging    externalapi.UTXODiff
+	tipsStaging            []*externalapi.DomainHash
+	virtualUTXODiffStaging externalapi.UTXODiff
 
 	virtualUTXOSetCache *utxolrucache.LRUCache
 
-	tipsCache               []*externalapi.DomainHash
-	virtualDiffParentsCache []*externalapi.DomainHash
+	tipsCache []*externalapi.DomainHash
 }
 
 // New instantiates a new ConsensusStateStore
@@ -28,7 +26,6 @@ func New(utxoSetCacheSize int, preallocate bool) model.ConsensusStateStore {
 func (css *consensusStateStore) Discard() {
 	css.tipsStaging = nil
 	css.virtualUTXODiffStaging = nil
-	css.virtualDiffParentsStaging = nil
 }
 
 func (css *consensusStateStore) Commit(dbTx model.DBTransaction) error {
@@ -36,10 +33,6 @@ func (css *consensusStateStore) Commit(dbTx model.DBTransaction) error {
 	if err != nil {
 		return err
 	}
-	err = css.commitVirtualDiffParents(dbTx)
-	if err != nil {
-		return err
-	}
 
 	err = css.commitVirtualUTXODiff(dbTx)
 	if err != nil {
@@ -53,6 +46,5 @@ func (css *consensusStateStore) Commit(dbTx model.DBTransaction) error {
 
 func (css *consensusStateStore) IsStaged() bool {
 	return css.tipsStaging != nil ||
-		css.virtualDiffParentsStaging != nil ||
 		css.virtualUTXODiffStaging != nil
 }
diff --git a/domain/consensus/datastructures/consensusstatestore/virtual_diff_parents.go b/domain/consensus/datastructures/consensusstatestore/virtual_diff_parents.go
deleted file mode 100644
index 2baac4b0..00000000
--- a/domain/consensus/datastructures/consensusstatestore/virtual_diff_parents.go
+++ /dev/null
@@ -1,74 +0,0 @@
-package consensusstatestore
-
-import (
-	"github.com/golang/protobuf/proto"
-	"github.com/kaspanet/kaspad/domain/consensus/database"
-	"github.com/kaspanet/kaspad/domain/consensus/database/serialization"
-	"github.com/kaspanet/kaspad/domain/consensus/model"
-	"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
-)
-
-var virtualDiffParentsKey = database.MakeBucket(nil).Key([]byte("virtual-diff-parents"))
-
-func (css *consensusStateStore) VirtualDiffParents(dbContext model.DBReader) ([]*externalapi.DomainHash, error) {
-	if css.virtualDiffParentsStaging != nil {
-		return externalapi.CloneHashes(css.virtualDiffParentsStaging), nil
-	}
-
-	if css.virtualDiffParentsCache != nil {
-		return externalapi.CloneHashes(css.virtualDiffParentsCache), nil
-	}
-
-	virtualDiffParentsBytes, err := dbContext.Get(virtualDiffParentsKey)
-	if err != nil {
-		return nil, err
-	}
-
-	virtualDiffParents, err := css.deserializeVirtualDiffParents(virtualDiffParentsBytes)
-	if err != nil {
-		return nil, err
-	}
-	css.virtualDiffParentsCache = virtualDiffParents
-	return externalapi.CloneHashes(virtualDiffParents), nil
-}
-
-func (css *consensusStateStore) StageVirtualDiffParents(tipHashes []*externalapi.DomainHash) {
-	css.virtualDiffParentsStaging = externalapi.CloneHashes(tipHashes)
-}
-
-func (css *consensusStateStore) commitVirtualDiffParents(dbTx model.DBTransaction) error {
-	if css.virtualDiffParentsStaging == nil {
-		return nil
-	}
-
-	virtualDiffParentsBytes, err := css.serializeVirtualDiffParents(css.virtualDiffParentsStaging)
-	if err != nil {
-		return err
-	}
-	err = dbTx.Put(virtualDiffParentsKey, virtualDiffParentsBytes)
-	if err != nil {
-		return err
-	}
-	css.virtualDiffParentsCache = css.virtualDiffParentsStaging
-
-	// Note: we don't discard the staging here since that's
-	// being done at the end of Commit()
-	return nil
-}
-
-func (css *consensusStateStore) serializeVirtualDiffParents(virtualDiffParentsBytes []*externalapi.DomainHash) ([]byte, error) {
-	virtualDiffParents := serialization.VirtualDiffParentsToDBHeaderVirtualDiffParents(virtualDiffParentsBytes)
-	return proto.Marshal(virtualDiffParents)
-}
-
-func (css *consensusStateStore) deserializeVirtualDiffParents(virtualDiffParentsBytes []byte) ([]*externalapi.DomainHash,
-	error) {
-
-	dbVirtualDiffParents := &serialization.DbVirtualDiffParents{}
-	err := proto.Unmarshal(virtualDiffParentsBytes, dbVirtualDiffParents)
-	if err != nil {
-		return nil, err
-	}
-
-	return serialization.DBVirtualDiffParentsToVirtualDiffParents(dbVirtualDiffParents)
-}
diff --git a/domain/consensus/model/interface_datastructures_consensusstatestore.go b/domain/consensus/model/interface_datastructures_consensusstatestore.go
index b71883a2..f3cd442b 100644
--- a/domain/consensus/model/interface_datastructures_consensusstatestore.go
+++ b/domain/consensus/model/interface_datastructures_consensusstatestore.go
@@ -14,9 +14,6 @@ type ConsensusStateStore interface {
 	VirtualUTXOs(dbContext DBReader,
 		fromOutpoint *externalapi.DomainOutpoint, limit int) ([]*externalapi.OutpointAndUTXOEntryPair, error)
 
-	StageVirtualDiffParents(virtualDiffParents []*externalapi.DomainHash)
-	VirtualDiffParents(dbContext DBReader) ([]*externalapi.DomainHash, error)
-
 	StageTips(tipHashes []*externalapi.DomainHash)
 	Tips(dbContext DBReader) ([]*externalapi.DomainHash, error)