diff --git a/packages/ledgerstate/ledgerstate_test.go b/packages/ledgerstate/ledgerstate_test.go index 61ad15e871a030a7192bf777a6dcd84975a2e79b..330db72c55b0d57d63f52bff481cfd5d79d499ea 100644 --- a/packages/ledgerstate/ledgerstate_test.go +++ b/packages/ledgerstate/ledgerstate_test.go @@ -237,13 +237,8 @@ func TestAggregateAggregatedRealities(t *testing.T) { objectstorage.WaitForWritesToFlush() - if err := ledgerState.GenerateRealityVisualization("realities1.png"); err != nil { - t.Error(err) - } - - if err := NewVisualizer(ledgerState).RenderTransferOutputs("outputs1.png"); err != nil { - t.Error(err) - } + ledgerState.GenerateRealityVisualization("realities1.png") + NewVisualizer(ledgerState).RenderTransferOutputs("outputs1.png") multiSpend(ledgerState, 2, outputs0[0], outputs1[0]) @@ -251,13 +246,8 @@ func TestAggregateAggregatedRealities(t *testing.T) { objectstorage.WaitForWritesToFlush() - if err := ledgerState.GenerateRealityVisualization("realities2.png"); err != nil { - t.Error(err) - } - - if err := NewVisualizer(ledgerState).RenderTransferOutputs("outputs2.png"); err != nil { - t.Error(err) - } + ledgerState.GenerateRealityVisualization("realities2.png") + NewVisualizer(ledgerState).RenderTransferOutputs("outputs2.png") } func TestElevateAggregatedReality(t *testing.T) { @@ -291,13 +281,8 @@ func TestElevateAggregatedReality(t *testing.T) { objectstorage.WaitForWritesToFlush() - if err := ledgerState.GenerateRealityVisualization("realities.png"); err != nil { - t.Error(err) - } - - if err := NewVisualizer(ledgerState).RenderTransferOutputs("outputs.png"); err != nil { - t.Error(err) - } + ledgerState.GenerateRealityVisualization("realities.png") + NewVisualizer(ledgerState).RenderTransferOutputs("outputs.png") } func TestElevate(t *testing.T) { diff --git a/packages/ledgerstate/outputs1.png b/packages/ledgerstate/outputs1.png index fbb292ef06d60e9e6ddf1bf269990516a389fcb7..fd026eeb600bf9eeb11a272f134118d3a4a61f2d 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 60319a10e56e7846b93dd8889d864649f4514ba3..bda3cdf6945c579e4f8c47ff80fe033527c19bc3 100644 Binary files a/packages/ledgerstate/outputs2.png and b/packages/ledgerstate/outputs2.png differ diff --git a/packages/ledgerstate/reality.go b/packages/ledgerstate/reality.go index b163d718083c2985e0dbf50a3e4180cc2212e6f5..9bf3a9d9dce0067c02e0915a9c7db3e67473a18a 100644 --- a/packages/ledgerstate/reality.go +++ b/packages/ledgerstate/reality.go @@ -16,6 +16,8 @@ type Reality struct { id RealityId parentRealityIds RealityIdSet parentRealityIdsMutex sync.RWMutex + subRealityIds RealityIdSet + subRealityIdsMutex sync.RWMutex conflictIds ConflictIdSet conflictIdsMutex sync.RWMutex transferOutputCount uint32 @@ -499,23 +501,40 @@ func (reality *Reality) elevateTransferOutput(transferOutputReference *TransferO // Private utility function that elevates the transfer output from the current reality to the new reality. func (reality *Reality) elevateTransferOutputOfCurrentReality(transferOutput *TransferOutput, newReality *Reality) (err error) { - if err = newReality.bookTransferOutput(transferOutput); err == nil { - for transferHash, addresses := range transferOutput.GetConsumers() { - for _, addressHash := range addresses { - if elevateErr := reality.elevateTransferOutput(NewTransferOutputReference(transferHash, addressHash), newReality); elevateErr != nil { - err = elevateErr + for transferHash, addresses := range transferOutput.GetConsumers() { + for _, addressHash := range addresses { + if elevateErr := reality.elevateTransferOutput(NewTransferOutputReference(transferHash, addressHash), newReality); elevateErr != nil { + err = elevateErr - return - } + return } } } + err = newReality.bookTransferOutput(transferOutput) + return } // endregion /////////////////////////////////////////////////////////////////////////////////////////////////////////// +func (reality *Reality) RegisterSubReality(realityId RealityId) { + reality.subRealityIdsMutex.RLock() + if _, subRealityIdExists := reality.subRealityIds[realityId]; !subRealityIdExists { + reality.subRealityIdsMutex.RLock() + + reality.subRealityIdsMutex.Lock() + if _, subRealityIdExists := reality.subRealityIds[realityId]; !subRealityIdExists { + reality.subRealityIds[realityId] = void + + reality.SetModified() + } + reality.subRealityIdsMutex.Unlock() + } else { + reality.subRealityIdsMutex.RUnlock() + } +} + func (reality *Reality) elevateTransferOutputOfNestedReality(transferOutput *TransferOutput, oldParentRealityId RealityId, newParentRealityId RealityId) (err error) { if !reality.IsAggregated() { reality.replaceParentReality(oldParentRealityId, newParentRealityId)