github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/wasm/watcher/store.go (about) 1 package watcher 2 3 import ( 4 "encoding/json" 5 "log" 6 "path/filepath" 7 "sync" 8 9 "github.com/fibonacci-chain/fbc/app/types" 10 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/flags" 11 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/dbadapter" 12 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/gaskv" 13 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/prefix" 14 stypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/types" 15 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 16 dbm "github.com/fibonacci-chain/fbc/libs/tm-db" 17 "github.com/fibonacci-chain/fbc/x/evm/watcher" 18 "github.com/spf13/viper" 19 ) 20 21 const ( 22 watchDBName = "wasm-watcher" 23 ) 24 25 var ( 26 checkOnce sync.Once 27 checked bool 28 enableWatcher bool 29 db dbm.DB 30 // used for parallel deliver txs mode 31 txCacheMtx sync.Mutex 32 txStateCache []*WatchMessage 33 blockStateCache = make(map[string]*WatchMessage) 34 35 accountKeyPrefix = []byte("wasm-account-") 36 ) 37 38 func Enable() bool { 39 checkOnce.Do(func() { 40 checked = true 41 if viper.GetBool(watcher.FlagFastQuery) { 42 enableWatcher = true 43 InitDB() 44 } 45 }) 46 return enableWatcher 47 } 48 49 func ensureChecked() { 50 if !checked { 51 panic("fast query should be checked at init") 52 } 53 } 54 55 func InitDB() { 56 homeDir := viper.GetString(flags.FlagHome) 57 dbPath := filepath.Join(homeDir, watcher.WatchDbDir) 58 59 var err error 60 db, err = sdk.NewDB(watchDBName, dbPath) 61 if err != nil { 62 panic(err) 63 } 64 go taskRoutine() 65 } 66 67 func AccountKey(addr []byte) []byte { 68 return append(accountKeyPrefix, addr...) 69 } 70 func GetAccount(addr sdk.AccAddress) (*types.EthAccount, error) { 71 if !Enable() { 72 return nil, nil 73 } 74 b, err := db.Get(AccountKey(addr.Bytes())) 75 if err != nil { 76 return nil, err 77 } 78 79 var acc types.EthAccount 80 err = json.Unmarshal(b, &acc) 81 if err != nil { 82 return nil, err 83 } 84 return &acc, nil 85 86 } 87 88 func SetAccount(acc *types.EthAccount) error { 89 if !Enable() { 90 return nil 91 } 92 b, err := json.Marshal(acc) 93 if err != nil { 94 return err 95 } 96 return db.Set(AccountKey(acc.Address.Bytes()), b) 97 } 98 99 func DeleteAccount(addr sdk.AccAddress) { 100 if !Enable() { 101 return 102 } 103 if err := db.Delete(AccountKey(addr.Bytes())); err != nil { 104 log.Println("wasm watchDB delete account error", addr.String()) 105 } 106 } 107 108 func NewReadStore(pre []byte) sdk.KVStore { 109 rs := &readStore{ 110 Store: dbadapter.Store{DB: db}, 111 } 112 if len(pre) != 0 { 113 return prefix.NewStore(rs, pre) 114 } 115 return rs 116 } 117 118 type Adapter struct{} 119 120 func (a Adapter) NewStore(gasMeter sdk.GasMeter, _ sdk.KVStore, pre []byte) sdk.KVStore { 121 store := NewReadStore(pre) 122 return gaskv.NewStore(store, gasMeter, stypes.KVGasConfig()) 123 } 124 125 type readStore struct { 126 dbadapter.Store 127 } 128 129 func (r *readStore) Set(key, value []byte) {} 130 func (r *readStore) Delete(key []byte) {}