diff --git a/go.mod b/go.mod index 015e2823f021a6c53041edfe4e00aa49616055e8..63fdbf6535517e0b1da5b55154749e8dec3b65d0 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,6 @@ go 1.13 require ( github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 // indirect - github.com/apsdehal/go-logger v0.0.0-20190506062552-f85330a4b532 // indirect github.com/dgraph-io/badger v1.6.0 github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/emicklei/dot v0.10.1 @@ -25,8 +24,6 @@ require ( github.com/rivo/tview v0.0.0-20190829161255-f8bc69b90341 github.com/rivo/uniseg v0.1.0 // indirect github.com/sasha-s/go-deadlock v0.2.0 // indirect - github.com/spf13/pflag v1.0.5 - github.com/stretchr/objx v0.2.0 // indirect golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 golang.org/x/sys v0.0.0-20190904154756-749cb33beabd // indirect diff --git a/go.sum b/go.sum index 21013aaa10a237c3ee55af178ab8f640c205cbfb..1e1d9424f2c40e5e58505542caa9c35584af4513 100644 --- a/go.sum +++ b/go.sum @@ -9,7 +9,6 @@ github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/apsdehal/go-logger v0.0.0-20190506062552-f85330a4b532/go.mod h1:U3/8D6R9+bVpX0ORZjV+3mU9pQ86m7h1lESgJbXNvXA= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -39,7 +38,6 @@ github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/emicklei/dot v0.10.1 h1:bkzvwgIhhw/cuxxnJy5/5+ZL3GnhFxFfv0eolHtWE2w= github.com/emicklei/dot v0.10.1/go.mod h1:kZg82Ikwc4pqb31Ct2yb0B7RUqxh3JESIXw2uWSv/xY= -github.com/ethereum/go-ethereum v1.9.1/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY= github.com/ethereum/go-ethereum v1.9.3 h1:v3bE4abkXknLcyWCf4TRFn+Ecmm9thPtfLFvTEQ+1+U= github.com/ethereum/go-ethereum v1.9.3/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= @@ -68,8 +66,6 @@ github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/open-location-code/go v0.0.0-20190723034300-2c7115db77a3 h1:qI8YeX4bVZ2HrE+kEOn12L2io7Tw/2IffULguAh3M4Q= -github.com/google/open-location-code/go v0.0.0-20190723034300-2c7115db77a3/go.mod h1:eJfRN6aj+kR/rnua/rw9jAgYhqoMHldQkdTi+sePRKk= github.com/google/open-location-code/go v0.0.0-20190903173953-119bc96a3a51 h1:OdVal38kmXn0U3M3CYmPF4cpMLLvD4ioshwrooNfmxs= github.com/google/open-location-code/go v0.0.0-20190903173953-119bc96a3a51/go.mod h1:eJfRN6aj+kR/rnua/rw9jAgYhqoMHldQkdTi+sePRKk= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -84,24 +80,8 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/iotaledger/hive.go v0.0.0-20191112142249-92832505dd6d h1:6n1M4lkXVlclr1z3+Ee9iSjIdWz2L9Kx87WBurof/JU= -github.com/iotaledger/hive.go v0.0.0-20191112142249-92832505dd6d/go.mod h1:3u9aMALGTDHvpdmpODAkl6HAJ3GmDTfKIJIVSboXKLg= -github.com/iotaledger/hive.go v0.0.0-20191118130432-89eebe8fe8eb h1:nuS/LETRJ8obUyBIZeyxeei0ZPlyOMj8YPziOgSM4Og= -github.com/iotaledger/hive.go v0.0.0-20191118130432-89eebe8fe8eb/go.mod h1:1Thhlil4lHzuy53EVvmEbEvWBFY0Tasp4kCBfxBCPIk= -github.com/iotaledger/hive.go v0.0.0-20191125112048-8b1784dd1bce h1:QchbydsqgH7bXWXk8zLa1PvZ0fcWRddfIXCoXuWgzt4= -github.com/iotaledger/hive.go v0.0.0-20191125112048-8b1784dd1bce/go.mod h1:1Thhlil4lHzuy53EVvmEbEvWBFY0Tasp4kCBfxBCPIk= -github.com/iotaledger/hive.go v0.0.0-20191202111738-357cee7a1c37 h1:Vex6W5Oae7xXvVmnCrl7J4o+PCx0FW3paMzXxQDr8H4= -github.com/iotaledger/hive.go v0.0.0-20191202111738-357cee7a1c37/go.mod h1:1Thhlil4lHzuy53EVvmEbEvWBFY0Tasp4kCBfxBCPIk= -github.com/iotaledger/hive.go v0.0.0-20191205211001-eafba1daa31e h1:7F9mSTDfFwMlEwkllo2yoc0p2iolrvL0I6RgMcL4h4M= -github.com/iotaledger/hive.go v0.0.0-20191205211001-eafba1daa31e/go.mod h1:7iqun29a1x0lymTrn0UJ3Z/yy0sUzUpoOZ1OYMrYN20= -github.com/iotaledger/hive.go v0.0.0-20191205213014-6bee840fa69a h1:mI4GR5wcI5G6vjumuI2KH9r0mf5me3i6mWhDMtkKR04= -github.com/iotaledger/hive.go v0.0.0-20191205213014-6bee840fa69a/go.mod h1:7iqun29a1x0lymTrn0UJ3Z/yy0sUzUpoOZ1OYMrYN20= -github.com/iotaledger/hive.go v0.0.0-20191206001944-418a9127c1eb h1:iMYyaySL2gEjOcPRzWZYCn4+vXkanq1b9Pr9fKSzdrI= -github.com/iotaledger/hive.go v0.0.0-20191206001944-418a9127c1eb/go.mod h1:7iqun29a1x0lymTrn0UJ3Z/yy0sUzUpoOZ1OYMrYN20= github.com/iotaledger/hive.go v0.0.0-20191208004610-567900b261bd h1:hh8iusLOBylWNHeJNiZv6atCbO7vzjCLlg53pNAMkFk= github.com/iotaledger/hive.go v0.0.0-20191208004610-567900b261bd/go.mod h1:7iqun29a1x0lymTrn0UJ3Z/yy0sUzUpoOZ1OYMrYN20= -github.com/iotaledger/iota.go v1.0.0-beta.7 h1:OaUNahPvOdQz2nKcgeAfcUdxlEDlEV3xwLIkwzZ1B/U= -github.com/iotaledger/iota.go v1.0.0-beta.7/go.mod h1:dMps6iMVU1pf5NDYNKIw4tRsPeC8W3ZWjOvYHOO1PMg= github.com/iotaledger/iota.go v1.0.0-beta.9 h1:c654s9pkdhMBkABUvWg+6k91MEBbdtmZXP1xDfQpajg= github.com/iotaledger/iota.go v1.0.0-beta.9/go.mod h1:F6WBmYd98mVjAmmPVYhnxg8NNIWCjjH8VWT9qvv3Rc8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -117,7 +97,6 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg= github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s= -github.com/labstack/gommon v0.2.9/go.mod h1:E8ZTmW9vw5az5/ZyHWCp0Lw4OH2ecsaBP1C/NKavGG4= github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/lucasb-eyer/go-colorful v1.0.2 h1:mCMFu6PgSozg9tDNMMK3g18oJBX7oYGrC09mS6CXfO4= @@ -162,7 +141,6 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rivo/tview v0.0.0-20190721135419-23dc8a0944e4/go.mod h1:+rKjP5+h9HMwWRpAfhIkkQ9KE3m3Nz5rwn7YtUpwgqk= github.com/rivo/tview v0.0.0-20190829161255-f8bc69b90341 h1:d2Z5U4d3fenPRFFweaMCogbXiRywM5kgYtu20/hol3M= github.com/rivo/tview v0.0.0-20190829161255-f8bc69b90341/go.mod h1:+rKjP5+h9HMwWRpAfhIkkQ9KE3m3Nz5rwn7YtUpwgqk= github.com/rivo/uniseg v0.0.0-20190513083848-b9f5b9457d44/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -191,7 +169,6 @@ github.com/spf13/viper v1.5.0 h1:GpsTwfsQ27oS/Aha/6d1oD7tpKIqWnOA6tgOX9HHkt4= github.com/spf13/viper v1.5.0/go.mod h1:AkYRkVJF8TkSG/xet6PzXX+l39KhhXa2pdqVSxnTcn4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= @@ -219,9 +196,6 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472 h1:Gv7RPwsi3eZ2Fgewe3CBsuOebPwO27PoXzRpJPsvSSM= -golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf h1:fnPsqIDRbCSgumaMCRpoIoF2s4qxv0xSSS0BVZUE/ss= golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -234,14 +208,12 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -254,10 +226,8 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd h1:DBH9mDw0zluJT/R+nGuV3jWFWLFaHyYZWD4tOT+cjn0= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/packages/ledgerstate/ledgerstate.go b/packages/ledgerstate/ledgerstate.go index 0af177c674f4ce1fcf7023d91ba981fcbaeb3119..2969a41eb218fccb5cc8d67d8ca8dfc1ee4b1a27 100644 --- a/packages/ledgerstate/ledgerstate.go +++ b/packages/ledgerstate/ledgerstate.go @@ -125,6 +125,14 @@ func (ledgerState *LedgerState) CreateReality(id RealityId) { newReality := newReality(id, MAIN_REALITY_ID) newReality.ledgerState = ledgerState + if mainReality, mainRealityErr := ledgerState.realities.Load(MAIN_REALITY_ID[:]); mainRealityErr != nil { + panic(mainRealityErr) + } else { + mainReality.Consume(func(object objectstorage.StorableObject) { + object.(*Reality).RegisterSubReality(id) + }) + } + ledgerState.realities.Store(newReality).Release() } @@ -182,14 +190,14 @@ func (ledgerState *LedgerState) GenerateRealityVisualization(pngFilename string) realityNode, exists := realityNodes[reality.id] if !exists { if reality.IsAggregated() { - realityNode = graph.Node("AGGREGATED REALITY\n\n" + strings.Trim(reality.id.String(), "\x00") + " (" + strconv.Itoa(int(reality.GetTransferOutputCount())) + ")") + realityNode = graph.Node("AGGREGATED REALITY\n\n" + strings.Trim(reality.id.String(), "\x00") + " (" + strconv.Itoa(int(reality.GetTransferOutputCount())) + " / " + strconv.Itoa(len(reality.subRealityIds)) + ")") realityNode.Attr("style", "filled") realityNode.Attr("shape", "rect") realityNode.Attr("color", "#9673A6") realityNode.Attr("fillcolor", "#DAE8FC") realityNode.Attr("penwidth", "2.0") } else { - realityNode = graph.Node("REALITY\n\n" + strings.Trim(reality.id.String(), "\x00") + " (" + strconv.Itoa(int(reality.GetTransferOutputCount())) + ")") + realityNode = graph.Node("REALITY\n\n" + strings.Trim(reality.id.String(), "\x00") + " (" + strconv.Itoa(int(reality.GetTransferOutputCount())) + " / " + strconv.Itoa(len(reality.subRealityIds)) + ")") realityNode.Attr("style", "filled") realityNode.Attr("shape", "rect") realityNode.Attr("color", "#6C8EBF") @@ -319,10 +327,16 @@ func (ledgerState *LedgerState) AggregateRealities(realityIds ...RealityId) *obj aggregatedRealityId := ledgerState.generateAggregatedRealityId(ledgerState.sortRealityIds(parentConflictRealities)) newAggregatedRealityCreated := false - if cachedAggregatedReality, err := ledgerState.realities.ComputeIfAbsent(aggregatedRealityId[:], func(key []byte) (object objectstorage.StorableObject, e error) { + if newCachedAggregatedReality, err := ledgerState.realities.ComputeIfAbsent(aggregatedRealityId[:], func(key []byte) (object objectstorage.StorableObject, e error) { aggregatedReality := newReality(aggregatedRealityId, aggregatedRealityParentIds...) aggregatedReality.ledgerState = ledgerState + for _, parentRealityId := range aggregatedRealityParentIds { + ledgerState.GetReality(parentRealityId).Consume(func(object objectstorage.StorableObject) { + object.(*Reality).RegisterSubReality(aggregatedRealityId) + }) + } + aggregatedReality.SetModified() newAggregatedRealityCreated = true @@ -332,14 +346,18 @@ func (ledgerState *LedgerState) AggregateRealities(realityIds ...RealityId) *obj panic(err) } else { if !newAggregatedRealityCreated { - aggregatedReality := cachedAggregatedReality.Get().(*Reality) + aggregatedReality := newCachedAggregatedReality.Get().(*Reality) for _, realityId := range aggregatedRealityParentIds { - aggregatedReality.AddParentReality(realityId) + if aggregatedReality.AddParentReality(realityId) { + ledgerState.GetReality(realityId).Consume(func(object objectstorage.StorableObject) { + object.(*Reality).RegisterSubReality(aggregatedRealityId) + }) + } } } - return cachedAggregatedReality + return newCachedAggregatedReality } } } diff --git a/packages/ledgerstate/ledgerstate_test.go b/packages/ledgerstate/ledgerstate_test.go index 330db72c55b0d57d63f52bff481cfd5d79d499ea..65b4e9fdc4eb0e69ae7878d1cb6f6f33acf807da 100644 --- a/packages/ledgerstate/ledgerstate_test.go +++ b/packages/ledgerstate/ledgerstate_test.go @@ -6,9 +6,8 @@ import ( "testing" "time" - "github.com/iotaledger/hive.go/parameter" - "github.com/iotaledger/hive.go/objectstorage" + "github.com/iotaledger/hive.go/parameter" ) var ( @@ -237,7 +236,7 @@ func TestAggregateAggregatedRealities(t *testing.T) { objectstorage.WaitForWritesToFlush() - ledgerState.GenerateRealityVisualization("realities1.png") + fmt.Println(ledgerState.GenerateRealityVisualization("realities1.png")) NewVisualizer(ledgerState).RenderTransferOutputs("outputs1.png") multiSpend(ledgerState, 2, outputs0[0], outputs1[0]) diff --git a/packages/ledgerstate/outputs1.png b/packages/ledgerstate/outputs1.png index fd026eeb600bf9eeb11a272f134118d3a4a61f2d..b0e8fa0a96f6efa92bb38dc0ae81c0fc6f55832c 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 bda3cdf6945c579e4f8c47ff80fe033527c19bc3..cf0f4eae66fd41ae148f2647d4b21a1f6a7214bd 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 73be1b7f5e854ce26112b3021b8a03c534dff7f9..1bbd7dbd470da4c71f5b47b4a21b743f79bc3f6a 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 08f4b00d7bd979f5503fbfcbc0c2a62e636ab170..7989fa7230e1225473ef0716392f98a766db93b4 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 9bf3a9d9dce0067c02e0915a9c7db3e67473a18a..fc6b085d3909aa03053b30107375b35455e78263 100644 --- a/packages/ledgerstate/reality.go +++ b/packages/ledgerstate/reality.go @@ -33,6 +33,7 @@ func newReality(id RealityId, parentRealities ...RealityId) *Reality { result := &Reality{ id: id, parentRealityIds: NewRealityIdSet(parentRealities...), + subRealityIds: NewRealityIdSet(), conflictIds: NewConflictIdSet(), storageKey: make([]byte, len(id)), @@ -57,7 +58,7 @@ func (reality *Reality) GetParentRealityIds() (realityIdSet RealityIdSet) { } // Adds a new parent Reality to this Reality (it is used for aggregating aggregated Realities). -func (reality *Reality) AddParentReality(realityId RealityId) { +func (reality *Reality) AddParentReality(realityId RealityId) (realityAdded bool) { reality.parentRealityIdsMutex.RLock() if _, exists := reality.parentRealityIds[realityId]; !exists { reality.parentRealityIdsMutex.RUnlock() @@ -67,11 +68,15 @@ func (reality *Reality) AddParentReality(realityId RealityId) { reality.parentRealityIds[realityId] = void reality.SetModified() + + realityAdded = true } reality.parentRealityIdsMutex.Unlock() } else { reality.parentRealityIdsMutex.RUnlock() } + + return } // Utility function that replaces the parent of a reality. @@ -241,6 +246,8 @@ func (reality *Reality) CreateReality(id RealityId) *objectstorage.CachedObject newReality := newReality(id, reality.id) newReality.ledgerState = reality.ledgerState + reality.RegisterSubReality(id) + return reality.ledgerState.realities.Store(newReality) } @@ -442,6 +449,8 @@ func (reality *Reality) createRealityForPreviouslyUnconflictingConsumers(consume newReality := newReality(elevatedRealityId, reality.id) newReality.ledgerState = reality.ledgerState + reality.RegisterSubReality(elevatedRealityId) + newReality.Persist() newReality.SetModified() @@ -518,10 +527,27 @@ func (reality *Reality) elevateTransferOutputOfCurrentReality(transferOutput *Tr // endregion /////////////////////////////////////////////////////////////////////////////////////////////////////////// +func (reality *Reality) UnregisterSubReality(realityId RealityId) { + reality.subRealityIdsMutex.RLock() + if _, subRealityIdExists := reality.subRealityIds[realityId]; subRealityIdExists { + reality.subRealityIdsMutex.RUnlock() + + reality.subRealityIdsMutex.Lock() + if _, subRealityIdExists := reality.subRealityIds[realityId]; subRealityIdExists { + delete(reality.subRealityIds, realityId) + + reality.SetModified() + } + reality.subRealityIdsMutex.Unlock() + } else { + reality.subRealityIdsMutex.RUnlock() + } +} + func (reality *Reality) RegisterSubReality(realityId RealityId) { reality.subRealityIdsMutex.RLock() if _, subRealityIdExists := reality.subRealityIds[realityId]; !subRealityIdExists { - reality.subRealityIdsMutex.RLock() + reality.subRealityIdsMutex.RUnlock() reality.subRealityIdsMutex.Lock() if _, subRealityIdExists := reality.subRealityIds[realityId]; !subRealityIdExists { @@ -572,9 +598,16 @@ func (reality *Reality) bookTransferOutput(transferOutput *TransferOutput) (err transferOutput.SetRealityId(realityId) reality.ledgerState.GetReality(transferOutputRealityId).Consume(func(object objectstorage.StorableObject) { + transferOutputReality := object.(*Reality) + // decrease transferOutputCount and remove reality if it is empty - if object.(*Reality).DecreaseTransferOutputCount() == 0 { - // delete reality if 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) + }) + } + transferOutputReality.Delete() } }) diff --git a/packages/ledgerstate/reality.objectstorage.go b/packages/ledgerstate/reality.objectstorage.go index 7ccdc5edbcd6d2e52dca8c8ed05b5b597782d08f..6ab58486ed81ccb5d690372a8cfbf9ca2e437ad3 100644 --- a/packages/ledgerstate/reality.objectstorage.go +++ b/packages/ledgerstate/reality.objectstorage.go @@ -24,17 +24,29 @@ func (reality *Reality) MarshalBinary() ([]byte, error) { reality.parentRealityIdsMutex.RLock() parentRealityCount := len(reality.parentRealityIds) + subRealityCount := len(reality.subRealityIds) - marshaledReality := make([]byte, 4+4+parentRealityCount*realityIdLength) + marshaledReality := make([]byte, 4+4+4+parentRealityCount*realityIdLength+subRealityCount*realityIdLength) + + offset := 0 binary.LittleEndian.PutUint32(marshaledReality, uint32(reality.GetTransferOutputCount())) + offset += 4 - binary.LittleEndian.PutUint32(marshaledReality[4:], uint32(parentRealityCount)) - i := 0 + binary.LittleEndian.PutUint32(marshaledReality[offset:], uint32(parentRealityCount)) + offset += 4 for parentRealityId := range reality.parentRealityIds { - copy(marshaledReality[4+4+i*realityIdLength:], parentRealityId[:]) + copy(marshaledReality[offset:], parentRealityId[:]) + + offset += realityIdLength + } + + binary.LittleEndian.PutUint32(marshaledReality[offset:], uint32(subRealityCount)) + offset += 4 + for subRealityId := range reality.subRealityIds { + copy(marshaledReality[offset:], subRealityId[:]) - i++ + offset += realityIdLength } reality.parentRealityIdsMutex.RUnlock() @@ -48,18 +60,38 @@ func (reality *Reality) UnmarshalBinary(serializedObject []byte) error { } reality.parentRealityIds = NewRealityIdSet() + reality.subRealityIds = NewRealityIdSet() + + offset := 0 reality.transferOutputCount = binary.LittleEndian.Uint32(serializedObject) + offset += 4 + + parentRealityCount := int(binary.LittleEndian.Uint32(serializedObject[offset:])) + offset += 4 - parentRealityCount := int(binary.LittleEndian.Uint32(serializedObject[4:])) for i := 0; i < parentRealityCount; i++ { var restoredRealityId RealityId - if err := restoredRealityId.UnmarshalBinary(serializedObject[4+4+i*realityIdLength:]); err != nil { + if err := restoredRealityId.UnmarshalBinary(serializedObject[offset:]); err != nil { return err } + offset += realityIdLength reality.parentRealityIds[restoredRealityId] = void } + subRealityCount := int(binary.LittleEndian.Uint32(serializedObject[offset:])) + offset += 4 + + for i := 0; i < subRealityCount; i++ { + var restoredRealityId RealityId + if err := restoredRealityId.UnmarshalBinary(serializedObject[offset:]); err != nil { + return err + } + offset += realityIdLength + + reality.subRealityIds[restoredRealityId] = void + } + return nil }