github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/store/mpt/trie_prefetcher_test.go (about) 1 package mpt 2 3 import ( 4 "math/big" 5 "testing" 6 "time" 7 8 "github.com/ethereum/go-ethereum/common" 9 "github.com/ethereum/go-ethereum/core/rawdb" 10 ethstate "github.com/ethereum/go-ethereum/core/state" 11 ) 12 13 /* 14 * these tests are copied from the go-ethereum/core/state/trie_prefetcher_test.go 15 */ 16 func filledStateDB() (*ethstate.StateDB, ethstate.Database, common.Hash) { 17 db := ethstate.NewDatabase(rawdb.NewMemoryDatabase()) 18 originalRoot := common.Hash{} 19 state, _ := ethstate.New(originalRoot, db, nil) 20 21 // Create an account and check if the retrieved balance is correct 22 addr := common.HexToAddress("0xaffeaffeaffeaffeaffeaffeaffeaffeaffeaffe") 23 skey := common.HexToHash("aaa") 24 sval := common.HexToHash("bbb") 25 26 state.SetBalance(addr, big.NewInt(42)) // Change the account trie 27 state.SetCode(addr, []byte("hello")) // Change an external metadata 28 state.SetState(addr, skey, sval) // Change the storage trie 29 for i := 0; i < 100; i++ { 30 sk := common.BigToHash(big.NewInt(int64(i))) 31 state.SetState(addr, sk, sk) // Change the storage trie 32 } 33 return state, db, originalRoot 34 } 35 36 func TestCopyAndClose(t *testing.T) { 37 _, db, originalRoot := filledStateDB() 38 prefetcher := NewTriePrefetcher(db, originalRoot, "") 39 skey := common.HexToHash("aaa") 40 prefetcher.Prefetch(originalRoot, [][]byte{skey.Bytes()}) 41 prefetcher.Prefetch(originalRoot, [][]byte{skey.Bytes()}) 42 time.Sleep(1 * time.Second) 43 a := prefetcher.Trie(originalRoot) 44 prefetcher.Prefetch(originalRoot, [][]byte{skey.Bytes()}) 45 b := prefetcher.Trie(originalRoot) 46 cpy := prefetcher.Copy() 47 cpy.Prefetch(originalRoot, [][]byte{skey.Bytes()}) 48 cpy.Prefetch(originalRoot, [][]byte{skey.Bytes()}) 49 c := cpy.Trie(originalRoot) 50 prefetcher.Close() 51 cpy2 := cpy.Copy() 52 cpy2.Prefetch(originalRoot, [][]byte{skey.Bytes()}) 53 d := cpy2.Trie(originalRoot) 54 cpy.Close() 55 cpy2.Close() 56 if a.Hash() != b.Hash() || a.Hash() != c.Hash() || a.Hash() != d.Hash() { 57 t.Fatalf("Invalid trie, hashes should be equal: %v %v %v %v", a.Hash(), b.Hash(), c.Hash(), d.Hash()) 58 } 59 } 60 61 func TestUseAfterClose(t *testing.T) { 62 _, db, originalRoot := filledStateDB() 63 prefetcher := NewTriePrefetcher(db, originalRoot, "") 64 skey := common.HexToHash("aaa") 65 prefetcher.Prefetch(originalRoot, [][]byte{skey.Bytes()}) 66 a := prefetcher.Trie(originalRoot) 67 prefetcher.Close() 68 b := prefetcher.Trie(originalRoot) 69 if a == nil { 70 t.Fatal("Prefetching before close should not return nil") 71 } 72 if b != nil { 73 t.Fatal("Trie after close should return nil") 74 } 75 } 76 77 func TestCopyClose(t *testing.T) { 78 _, db, originalRoot := filledStateDB() 79 prefetcher := NewTriePrefetcher(db, originalRoot, "") 80 skey := common.HexToHash("aaa") 81 prefetcher.Prefetch(originalRoot, [][]byte{skey.Bytes()}) 82 cpy := prefetcher.Copy() 83 a := prefetcher.Trie(originalRoot) 84 b := cpy.Trie(originalRoot) 85 prefetcher.Close() 86 c := prefetcher.Trie(originalRoot) 87 d := cpy.Trie(originalRoot) 88 if a == nil { 89 t.Fatal("Prefetching before close should not return nil") 90 } 91 if b == nil { 92 t.Fatal("Copy trie should return nil") 93 } 94 if c != nil { 95 t.Fatal("Trie after close should return nil") 96 } 97 if d == nil { 98 t.Fatal("Copy trie should not return nil") 99 } 100 }