github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/store/mpt/instance.go (about) 1 package mpt 2 3 import ( 4 "encoding/binary" 5 "path/filepath" 6 "sync" 7 8 ethcmn "github.com/ethereum/go-ethereum/common" 9 "github.com/ethereum/go-ethereum/core/rawdb" 10 ethstate "github.com/ethereum/go-ethereum/core/state" 11 "github.com/ethereum/go-ethereum/trie" 12 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/flags" 13 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/mpt/types" 14 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 15 "github.com/spf13/viper" 16 ) 17 18 const ( 19 mptDataDir = "data" 20 mptSpace = "mpt" 21 ) 22 23 var ( 24 gMptDatabase ethstate.Database = nil 25 initMptOnce sync.Once 26 ) 27 28 func InstanceOfMptStore() ethstate.Database { 29 initMptOnce.Do(func() { 30 homeDir := viper.GetString(flags.FlagHome) 31 path := filepath.Join(homeDir, mptDataDir) 32 33 backend := viper.GetString(sdk.FlagDBBackend) 34 if backend == "" { 35 backend = string(types.GoLevelDBBackend) 36 } 37 38 kvstore, e := types.CreateKvDB(mptSpace, types.BackendType(backend), path) 39 if e != nil { 40 panic("fail to open database: " + e.Error()) 41 } 42 db := rawdb.NewDatabase(kvstore) 43 gMptDatabase = ethstate.NewDatabaseWithConfig(db, &trie.Config{ 44 Cache: int(TrieCacheSize), 45 Journal: "", 46 Preimages: true, 47 }) 48 }) 49 50 return gMptDatabase 51 } 52 53 // GetLatestStoredBlockHeight get latest mpt storage height 54 func (ms *MptStore) GetLatestStoredBlockHeight() uint64 { 55 rst, err := ms.db.TrieDB().DiskDB().Get(KeyPrefixAccLatestStoredHeight) 56 if err != nil || len(rst) == 0 { 57 return 0 58 } 59 return binary.BigEndian.Uint64(rst) 60 } 61 62 // SetLatestStoredBlockHeight sets the latest stored storage height 63 func (ms *MptStore) SetLatestStoredBlockHeight(height uint64) { 64 hhash := sdk.Uint64ToBigEndian(height) 65 ms.db.TrieDB().DiskDB().Put(KeyPrefixAccLatestStoredHeight, hhash) 66 } 67 68 // GetMptRootHash gets root mpt hash from block height 69 func (ms *MptStore) GetMptRootHash(height uint64) ethcmn.Hash { 70 hhash := sdk.Uint64ToBigEndian(height) 71 rst, err := ms.db.TrieDB().DiskDB().Get(append(KeyPrefixAccRootMptHash, hhash...)) 72 if err != nil || len(rst) == 0 { 73 return ethcmn.Hash{} 74 } 75 76 return ethcmn.BytesToHash(rst) 77 } 78 79 // SetMptRootHash sets the mapping from block height to root mpt hash 80 func (ms *MptStore) SetMptRootHash(height uint64, hash ethcmn.Hash) { 81 hhash := sdk.Uint64ToBigEndian(height) 82 ms.db.TrieDB().DiskDB().Put(append(KeyPrefixAccRootMptHash, hhash...), hash.Bytes()) 83 } 84 85 func (ms *MptStore) HasVersion(height int64) bool { 86 return ms.GetMptRootHash(uint64(height)) != ethcmn.Hash{} 87 }