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)     {}