diff --git a/packages/ledgerstate/ledgerstate.go b/packages/ledgerstate/ledgerstate.go index 2969a41eb218fccb5cc8d67d8ca8dfc1ee4b1a27..2270c86f1a03b9d641d1643ec0a9bdd2cfdbef45 100644 --- a/packages/ledgerstate/ledgerstate.go +++ b/packages/ledgerstate/ledgerstate.go @@ -204,6 +204,10 @@ func (ledgerState *LedgerState) GenerateRealityVisualization(pngFilename string) realityNode.Attr("fillcolor", "#DAE8FC") } + if reality.GetLiked() { + realityNode.Attr("penwidth", "3.0") + } + realityNodes[reality.id] = realityNode } diff --git a/packages/ledgerstate/outputs1.png b/packages/ledgerstate/outputs1.png index b0e8fa0a96f6efa92bb38dc0ae81c0fc6f55832c..fbb292ef06d60e9e6ddf1bf269990516a389fcb7 100644 Binary files a/packages/ledgerstate/outputs1.png and b/packages/ledgerstate/outputs1.png differ diff --git a/packages/ledgerstate/outputs2.png b/packages/ledgerstate/outputs2.png index cf0f4eae66fd41ae148f2647d4b21a1f6a7214bd..e179b2b414762ab36539dfaf7cc665670586d5bb 100644 Binary files a/packages/ledgerstate/outputs2.png and b/packages/ledgerstate/outputs2.png differ diff --git a/packages/ledgerstate/realities1.png b/packages/ledgerstate/realities1.png index 1bbd7dbd470da4c71f5b47b4a21b743f79bc3f6a..07550192e27c9ec302e2e8dd01d90c3883fd6141 100644 Binary files a/packages/ledgerstate/realities1.png and b/packages/ledgerstate/realities1.png differ diff --git a/packages/ledgerstate/realities2.png b/packages/ledgerstate/realities2.png index 7989fa7230e1225473ef0716392f98a766db93b4..f9c9fbd75bff8bbe0a2106a225f2f529ae0c7d0f 100644 Binary files a/packages/ledgerstate/realities2.png and b/packages/ledgerstate/realities2.png differ diff --git a/packages/ledgerstate/reality.go b/packages/ledgerstate/reality.go index fc6b085d3909aa03053b30107375b35455e78263..a1ff45dfcc2302f91cf8f85cbad5de8f03eff5e9 100644 --- a/packages/ledgerstate/reality.go +++ b/packages/ledgerstate/reality.go @@ -21,6 +21,8 @@ type Reality struct { conflictIds ConflictIdSet conflictIdsMutex sync.RWMutex transferOutputCount uint32 + liked bool + likedMutex sync.RWMutex storageKey []byte ledgerState *LedgerState @@ -43,6 +45,35 @@ func newReality(id RealityId, parentRealities ...RealityId) *Reality { return result } +func (reality *Reality) GetLiked() (liked bool) { + reality.likedMutex.RLock() + liked = reality.liked + reality.likedMutex.RUnlock() + + return +} + +func (reality *Reality) SetLiked(liked ...bool) (likedStatusChanged bool) { + newLikedStatus := len(liked) == 0 || liked[0] + + reality.likedMutex.RLock() + if reality.liked != newLikedStatus { + reality.likedMutex.RUnlock() + + reality.likedMutex.Lock() + if reality.liked != newLikedStatus { + reality.liked = newLikedStatus + + reality.SetModified() + } + reality.likedMutex.Unlock() + } else { + reality.likedMutex.RUnlock() + } + + return +} + // Returns the id of this Reality. Since the id never changes, we do not need a mutex to protect this property. func (reality *Reality) GetId() RealityId { return reality.id @@ -448,6 +479,7 @@ func (reality *Reality) createRealityForPreviouslyUnconflictingConsumers(consume if cachedElevatedReality, realityErr := reality.ledgerState.realities.ComputeIfAbsent(elevatedRealityId[:], func(key []byte) (object objectstorage.StorableObject, e error) { newReality := newReality(elevatedRealityId, reality.id) newReality.ledgerState = reality.ledgerState + newReality.SetLiked() reality.RegisterSubReality(elevatedRealityId) @@ -527,6 +559,14 @@ func (reality *Reality) elevateTransferOutputOfCurrentReality(transferOutput *Tr // endregion /////////////////////////////////////////////////////////////////////////////////////////////////////////// +func (reality *Reality) GetSubRealityIdCount() (subRealityIdCount int) { + reality.subRealityIdsMutex.RLock() + subRealityIdCount = len(reality.subRealityIds) + reality.subRealityIdsMutex.RUnlock() + + return +} + func (reality *Reality) UnregisterSubReality(realityId RealityId) { reality.subRealityIdsMutex.RLock() if _, subRealityIdExists := reality.subRealityIds[realityId]; subRealityIdExists { @@ -601,10 +641,10 @@ func (reality *Reality) bookTransferOutput(transferOutput *TransferOutput) (err transferOutputReality := object.(*Reality) // decrease transferOutputCount and remove reality if it is empty - if transferOutputReality.DecreaseTransferOutputCount() == 0 && len(transferOutputReality.subRealityIds) == 0 { - for parentRealityId := range transferOutputReality.parentRealityIds { - reality.ledgerState.GetReality(parentRealityId).Consume(func(obj objectstorage.StorableObject) { - obj.(*Reality).UnregisterSubReality(transferOutputRealityId) + if transferOutputReality.DecreaseTransferOutputCount() == 0 && transferOutputReality.GetSubRealityIdCount() == 0 { + for _, cachedParentReality := range transferOutputReality.GetParentRealities() { + cachedParentReality.Consume(func(parentReality objectstorage.StorableObject) { + parentReality.(*Reality).UnregisterSubReality(transferOutputRealityId) }) } transferOutputReality.Delete() diff --git a/packages/ledgerstate/reality.objectstorage.go b/packages/ledgerstate/reality.objectstorage.go index 6ab58486ed81ccb5d690372a8cfbf9ca2e437ad3..a43ae432b8edf747726eaf19567b0233022d8888 100644 --- a/packages/ledgerstate/reality.objectstorage.go +++ b/packages/ledgerstate/reality.objectstorage.go @@ -26,7 +26,7 @@ func (reality *Reality) MarshalBinary() ([]byte, error) { parentRealityCount := len(reality.parentRealityIds) subRealityCount := len(reality.subRealityIds) - marshaledReality := make([]byte, 4+4+4+parentRealityCount*realityIdLength+subRealityCount*realityIdLength) + marshaledReality := make([]byte, 4+4+4+1+parentRealityCount*realityIdLength+subRealityCount*realityIdLength) offset := 0 @@ -49,6 +49,13 @@ func (reality *Reality) MarshalBinary() ([]byte, error) { offset += realityIdLength } + if reality.liked { + marshaledReality[offset] = 1 + } else { + marshaledReality[offset] = 0 + } + //offset += 1 + reality.parentRealityIdsMutex.RUnlock() return marshaledReality, nil @@ -93,5 +100,8 @@ func (reality *Reality) UnmarshalBinary(serializedObject []byte) error { reality.subRealityIds[restoredRealityId] = void } + reality.liked = serializedObject[offset] == 1 + //offset += 1 + return nil }