From dbe173e794b22aaf5d674fb32a73d428ecff0112 Mon Sep 17 00:00:00 2001 From: Daniel Liu <139250065@qq.com> Date: Wed, 25 Jun 2025 16:17:05 +0800 Subject: [PATCH] core, trie: speed up some tests with quadratic processing flaw #21987 (#1057) --- core/state/sync_test.go | 30 ++++++++++++++---------------- trie/sync_test.go | 11 ++++------- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/core/state/sync_test.go b/core/state/sync_test.go index 2d596c7f29..607ab0a3a1 100644 --- a/core/state/sync_test.go +++ b/core/state/sync_test.go @@ -63,7 +63,8 @@ func makeTestState() (Database, common.Hash, []*testAccount) { } if i%5 == 0 { for j := byte(0); j < 5; j++ { - obj.SetState(db, crypto.Keccak256Hash([]byte{i, i, i, i, i, j, j}), crypto.Keccak256Hash([]byte{i, i, i, i, i, j, j})) + hash := crypto.Keccak256Hash([]byte{i, i, i, i, i, j, j}) + obj.SetState(db, hash, hash) } } state.updateStateObject(obj) @@ -401,15 +402,14 @@ func TestIncompleteStateSync(t *testing.T) { // Create a random state to copy srcDb, srcRoot, srcAccounts := makeTestState() - // isCode reports whether the hash is contract code hash. - isCode := func(hash common.Hash) bool { - for _, acc := range srcAccounts { - if hash == crypto.Keccak256Hash(acc.code) { - return true - } + /// isCodeLookup to save some hashing + var isCode = make(map[common.Hash]struct{}) + for _, acc := range srcAccounts { + if len(acc.code) > 0 { + isCode[crypto.Keccak256Hash(acc.code)] = struct{}{} } - return false } + isCode[types.EmptyCodeHash] = struct{}{} checkTrieConsistency(srcDb.TrieDB().DiskDB().(ethdb.Database), srcRoot) // Create a destination state and sync with the scheduler @@ -447,15 +447,13 @@ func TestIncompleteStateSync(t *testing.T) { batch.Write() for _, result := range results { added = append(added, result.Hash) - } - // Check that all known sub-tries added so far are complete or missing entirely. - for _, hash := range added { - if isCode(hash) { + // Check that all known sub-tries added so far are complete or missing entirely. + if _, ok := isCode[result.Hash]; ok { continue } // Can't use checkStateConsistency here because subtrie keys may have odd // length and crash in LeafKey. - if err := checkTrieConsistency(dstDb, hash); err != nil { + if err := checkTrieConsistency(dstDb, result.Hash); err != nil { t.Fatalf("state inconsistent: %v", err) } } @@ -466,9 +464,9 @@ func TestIncompleteStateSync(t *testing.T) { // Sanity check that removing any node from the database is detected for _, node := range added[1:] { var ( - key = node.Bytes() - code = isCode(node) - val []byte + key = node.Bytes() + _, code = isCode[node] + val []byte ) if code { val = rawdb.ReadCode(dstDb, node) diff --git a/trie/sync_test.go b/trie/sync_test.go index 5b50902c48..a3832c3937 100644 --- a/trie/sync_test.go +++ b/trie/sync_test.go @@ -378,14 +378,13 @@ func TestIncompleteSync(t *testing.T) { nodes, _, codes := sched.Missing(1) queue := append(append([]common.Hash{}, nodes...), codes...) - for len(queue) > 0 { // Fetch a batch of trie nodes results := make([]SyncResult, len(queue)) for i, hash := range queue { data, err := srcDb.Node(hash) if err != nil { - t.Fatalf("failed to retrieve Node data for %x: %v", hash, err) + t.Fatalf("failed to retrieve node data for %x: %v", hash, err) } results[i] = SyncResult{hash, data} } @@ -402,10 +401,8 @@ func TestIncompleteSync(t *testing.T) { batch.Write() for _, result := range results { added = append(added, result.Hash) - } - // Check that all known sub-tries in the synced trie are complete - for _, root := range added { - if err := checkTrieConsistency(triedb, root); err != nil { + // Check that all known sub-tries in the synced trie are complete + if err := checkTrieConsistency(triedb, result.Hash); err != nil { t.Fatalf("trie inconsistent: %v", err) } } @@ -413,7 +410,7 @@ func TestIncompleteSync(t *testing.T) { nodes, _, codes = sched.Missing(1) queue = append(append(queue[:0], nodes...), codes...) } - // Sanity check that removing any Node from the database is detected + // Sanity check that removing any node from the database is detected for _, node := range added[1:] { key := node.Bytes() value, _ := diskdb.Get(key)