Skip to content
Snippets Groups Projects
Unverified Commit aa32ab70 authored by Luca Moser's avatar Luca Moser Committed by GitHub
Browse files

Vote-/UTXO-layer and branch unit tests (#430)


* Feat: initial commit

* Feat: added setPreferred to TransactionMetadata

* Feat: added a Conflicting() method to the transactionMetadata

* Fix: fixed logic bug

* Feat: refactored fcob

* Refactor: refactored additional code

* Fix: fixed a bug in ForeachConsumers

* Refactor: cleaned up code

* Feat: implemented FCOB consensus into the valuetransfer dapp

* Refactor: refactored FCOB

* Docs: added some additional comments

* Docs: fixed comments

* add branch manager conflict test

* cleans failing test

* Refactor: commit before branch change

* Fix: fixed bug in AggregateBranches

* assert aggr. branch IDs

* expands branch conflict detection test

* add visualisation of branch graph of test

* Feat: added PayloadLiked Event

* Refactor: fixed some missing comments + added liked to marshal

* Feat: reworked the preferred and liked propagation

* Refactor: cleaned up some logic

* Refactor: simplified code

* Refactor: cleaned up more stuff :P

* Refactor: refactor

* Feat: moved test + refactored fcob

* adds more tests

* fixes liked state not getting updated correctly of conflict members

* adds additional liked/preferred propagation test

* Fix: fixed missing preferred propagation to aggregated branches

* Fix: fixed a few bugs in liked propagation

* adapt to new hive.go version

* upgrade hive.go

* Feat: started implementing a wallet

* Feat: extended wallet files

* remove weird test

* use mem db for tests

* more tests

* did someone say more tests?

* Fix: fixed bug in findDeepestCommonDescendants

* simply test

* adds additional test

* use store backed sequence

* add option to use in-memory database

* address review comments

* Fix: fixed missing events in branchmanaer

* Feat: propagate changes from branch to transaction

* Feat: started implementing confirmed propagation

* Fix: fixed unreachable code

* Refactor: refactored some code according to wolfgangs review

* Refactor: cleaned up the code according to DRY

* Refactor: refactored according to wollac

* Refactor: refactored according to wollac

* Refactor: refactored according to wollac

* Refactor: refactored the code to make it more readable

* Refactor: added some doc comments + cleaned up some more code

* fix weird duplicated code

* fixes shadow dec.

* check modified flags

Co-authored-by: default avatarHans Moog <hm@mkjc.net>
Co-authored-by: default avatarWolfgang Welz <welzwo@gmail.com>
parent 99a43562
No related branches found
No related tags found
No related merge requests found
...@@ -214,7 +214,6 @@ func (branch *Branch) setPreferred(preferred bool) (modified bool) { ...@@ -214,7 +214,6 @@ func (branch *Branch) setPreferred(preferred bool) (modified bool) {
branch.preferred = preferred branch.preferred = preferred
branch.SetModified() branch.SetModified()
modified = true modified = true
return return
} }
...@@ -246,8 +245,7 @@ func (branch *Branch) setLiked(liked bool) (modified bool) { ...@@ -246,8 +245,7 @@ func (branch *Branch) setLiked(liked bool) (modified bool) {
branch.liked = liked branch.liked = liked
branch.SetModified() branch.SetModified()
modified = true modified = true
return
return branch.liked
} }
// Finalized returns true if the branch has been marked as finalized. // Finalized returns true if the branch has been marked as finalized.
......
...@@ -251,6 +251,8 @@ func (branchManager *BranchManager) BranchesConflicting(branchIds ...BranchID) ( ...@@ -251,6 +251,8 @@ func (branchManager *BranchManager) BranchesConflicting(branchIds ...BranchID) (
} }
if conflictMember.BranchID() == currentBranchID { if conflictMember.BranchID() == currentBranchID {
cachedConflictMember.Release()
continue continue
} }
...@@ -392,7 +394,7 @@ func (branchManager *BranchManager) setBranchPreferred(cachedBranch *CachedBranc ...@@ -392,7 +394,7 @@ func (branchManager *BranchManager) setBranchPreferred(cachedBranch *CachedBranc
if !preferred { if !preferred {
if modified = branch.setPreferred(false); modified { if modified = branch.setPreferred(false); modified {
branchManager.Events.BranchUnpreferred.Trigger(cachedBranch) branchManager.Events.BranchUnpreferred.Trigger(cachedBranch)
branchManager.propagatePreferredChangesToAggregatedChildBranches(branch.ID())
branchManager.propagateDislikeToFutureCone(cachedBranch.Retain()) branchManager.propagateDislikeToFutureCone(cachedBranch.Retain())
} }
...@@ -417,12 +419,63 @@ func (branchManager *BranchManager) setBranchPreferred(cachedBranch *CachedBranc ...@@ -417,12 +419,63 @@ func (branchManager *BranchManager) setBranchPreferred(cachedBranch *CachedBranc
} }
branchManager.Events.BranchPreferred.Trigger(cachedBranch) branchManager.Events.BranchPreferred.Trigger(cachedBranch)
branchManager.propagatePreferredChangesToAggregatedChildBranches(branch.ID())
err = branchManager.propagateLike(cachedBranch.Retain()) err = branchManager.propagateLike(cachedBranch.Retain())
return return
} }
// propagatePreferredChangesToAggregatedChildBranches recursively updates the preferred flag of all descendants of the
// given Branch.
func (branchManager *BranchManager) propagatePreferredChangesToAggregatedChildBranches(parentBranchID BranchID) {
// initialize stack with children of the passed in parent Branch
branchStack := list.New()
branchManager.ChildBranches(parentBranchID).Consume(func(childBranchReference *ChildBranch) {
branchStack.PushBack(childBranchReference.ChildID())
})
// iterate through child branches and propagate changes
for branchStack.Len() >= 1 {
// retrieve first element from the stack
currentEntry := branchStack.Front()
currentChildBranchID := currentEntry.Value.(BranchID)
branchStack.Remove(currentEntry)
// load branch from storage
cachedAggregatedChildBranch := branchManager.Branch(currentChildBranchID)
// only process branches that could be loaded and that are aggregated branches
if aggregatedChildBranch := cachedAggregatedChildBranch.Unwrap(); aggregatedChildBranch != nil && aggregatedChildBranch.IsAggregated() {
// determine if all parents are liked
allParentsPreferred := true
for _, parentID := range aggregatedChildBranch.ParentBranches() {
if allParentsPreferred {
allParentsPreferred = allParentsPreferred && branchManager.Branch(parentID).Consume(func(parentBranch *Branch) {
allParentsPreferred = allParentsPreferred && parentBranch.Preferred()
})
}
}
// trigger events and check children if the branch was updated
if aggregatedChildBranch.setPreferred(allParentsPreferred) {
if allParentsPreferred {
branchManager.Events.BranchPreferred.Trigger(cachedAggregatedChildBranch)
} else {
branchManager.Events.BranchUnpreferred.Trigger(cachedAggregatedChildBranch)
}
// schedule checks for children if preferred flag was updated
branchManager.ChildBranches(currentChildBranchID).Consume(func(childBranchReference *ChildBranch) {
branchStack.PushBack(childBranchReference.ChildID())
})
}
}
// release the branch when we are done
cachedAggregatedChildBranch.Release()
}
}
func (branchManager *BranchManager) setBranchLiked(cachedBranch *CachedBranch, liked bool) (modified bool, err error) { func (branchManager *BranchManager) setBranchLiked(cachedBranch *CachedBranch, liked bool) (modified bool, err error) {
defer cachedBranch.Release() defer cachedBranch.Release()
branch := cachedBranch.Unwrap() branch := cachedBranch.Unwrap()
...@@ -611,7 +664,7 @@ func (branchManager *BranchManager) determineAggregatedBranchDetails(deepestComm ...@@ -611,7 +664,7 @@ func (branchManager *BranchManager) determineAggregatedBranchDetails(deepestComm
continue continue
} }
if branch.IsAggregated() { if !branch.IsAggregated() {
aggregatedBranchConflictParents[branchID] = cachedBranch aggregatedBranchConflictParents[branchID] = cachedBranch
continue continue
...@@ -781,8 +834,6 @@ func (branchManager *BranchManager) findDeepestCommonDescendants(branches ...Bra ...@@ -781,8 +834,6 @@ func (branchManager *BranchManager) findDeepestCommonDescendants(branches ...Bra
cachedAggregatedBranch.Release() cachedAggregatedBranch.Release()
result[branchID] = cachedBranch result[branchID] = cachedBranch
return nil
} }
} }
......
dapps/valuetransfers/packages/branchmanager/imgs/sample_tree.png

66.5 KiB

dapps/valuetransfers/packages/branchmanager/imgs/testconflictdetection.PNG

100 KiB

dapps/valuetransfers/packages/branchmanager/imgs/testelevation.PNG

54.2 KiB

dapps/valuetransfers/packages/branchmanager/imgs/testlikepropagation.PNG

79.4 KiB

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment