From c2b9b1d4608f5d73397a0d523b4850cea7d8018e Mon Sep 17 00:00:00 2001 From: Cassandra Heart Date: Wed, 13 Nov 2024 00:10:22 -0600 Subject: [PATCH] resolve: - critbit trie bug - proof messages performing incorrect repeat --- .../data/data_clock_consensus_engine.go | 1 + node/consensus/data/main_data_loop.go | 5 ++++ node/tries/rolling_frecency_critbit_trie.go | 7 ++++++ .../rolling_frecency_critbit_trie_test.go | 23 +++++++++++++++++++ 4 files changed, 36 insertions(+) diff --git a/node/consensus/data/data_clock_consensus_engine.go b/node/consensus/data/data_clock_consensus_engine.go index 8f5cdcc..095c44c 100644 --- a/node/consensus/data/data_clock_consensus_engine.go +++ b/node/consensus/data/data_clock_consensus_engine.go @@ -121,6 +121,7 @@ type DataClockConsensusEngine struct { report *protobufs.SelfTestReport clients []protobufs.DataIPCServiceClient grpcRateLimiter *RateLimiter + previousFrameProven *protobufs.ClockFrame previousTree *mt.MerkleTree clientReconnectTest int } diff --git a/node/consensus/data/main_data_loop.go b/node/consensus/data/main_data_loop.go index c981770..c9619f0 100644 --- a/node/consensus/data/main_data_loop.go +++ b/node/consensus/data/main_data_loop.go @@ -149,6 +149,10 @@ func (e *DataClockConsensusEngine) processFrame( break } } else { + if e.previousFrameProven.FrameNumber == latestFrame.FrameNumber { + return latestFrame + } + h, err := poseidon.HashBytes(e.pubSub.GetPeerID()) if err != nil { panic(err) @@ -232,6 +236,7 @@ func (e *DataClockConsensusEngine) processFrame( ) return latestFrame } + e.previousFrameProven = latestFrame e.previousTree = proofTree sig, err := e.pubSub.SignMessage( diff --git a/node/tries/rolling_frecency_critbit_trie.go b/node/tries/rolling_frecency_critbit_trie.go index 0ce94de..e4b9759 100644 --- a/node/tries/rolling_frecency_critbit_trie.go +++ b/node/tries/rolling_frecency_critbit_trie.go @@ -274,6 +274,13 @@ func (t *RollingFrecencyCritbitTrie) Remove(address []byte) { return } + if t.Root.External != nil { + if bytes.Equal(t.Root.External.Key, address) { + t.Root = nil + } + return + } + blen := uint32(len(address)) var gp *Node p := t.Root diff --git a/node/tries/rolling_frecency_critbit_trie_test.go b/node/tries/rolling_frecency_critbit_trie_test.go index c312f29..90c5d7d 100644 --- a/node/tries/rolling_frecency_critbit_trie_test.go +++ b/node/tries/rolling_frecency_critbit_trie_test.go @@ -2,6 +2,7 @@ package tries_test import ( "crypto/rand" + "fmt" "math/big" "testing" @@ -52,6 +53,28 @@ func TestSerializers(t *testing.T) { } } +func TestCritbitReinit(t *testing.T) { + tree := &tries.RollingFrecencyCritbitTrie{} + set := [][]byte{} + for i := 0; i < 1024; i++ { + seed := make([]byte, 32) + rand.Read(seed) + set = append(set, seed) + tree.Add(seed, 14) + tree.Remove(seed) + } + for i := 0; i < 1024; i++ { + tree.Add(set[i], 14) + } + for i := 0; i < 1024; i++ { + tree.Remove(set[i]) + } + near := tree.FindNearestAndApproximateNeighbors(make([]byte, 32)) + for _, n := range near { + fmt.Println(n.External.Key) + } +} + func TestCritbit(t *testing.T) { tree := &tries.RollingFrecencyCritbitTrie{}