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  }