From 7e9683d29b6207b91f5f786f07f46bc2f4f6cee2 Mon Sep 17 00:00:00 2001 From: Leon <156270887+leonz789@users.noreply.github.com> Date: Sat, 11 May 2024 14:31:24 +0800 Subject: [PATCH] fix: skip cache commit when refill cache on node restart (#52) * fix(oracle):skip cache commit when refill cache on node restart * text: add comments * fix(oracle):set recentParams when commit cached params * typo(oracle):lint * fix:CVE-2024-3817, update getter to 1.7.4 --------- Co-authored-by: cloud8little <34291844+cloud8little@users.noreply.github.com> --- go.mod | 2 ++ go.sum | 2 -- x/oracle/keeper/cache/caches.go | 19 ++++++++++++++++--- x/oracle/keeper/recent_msg.go | 1 + x/oracle/keeper/recent_params.go | 2 ++ x/oracle/keeper/single.go | 7 +++++-- x/oracle/module.go | 4 +++- 7 files changed, 29 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 0a794391e..fa3c6f35a 100644 --- a/go.mod +++ b/go.mod @@ -249,6 +249,8 @@ replace ( github.com/evmos/evmos/v14 => github.com/ExocoreNetwork/evmos/v14 v14.1.1-0.20240408040728-a6f685cfebb9 // Security Advisory https://github.com/advisories/GHSA-h395-qcrw-5vmq github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.9.1 + + github.com/hashicorp/go-getter v1.7.1 => github.com/hashicorp/go-getter v1.7.4 // indirect // replace broken goleveldb github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 //fix cosmos-sdk error diff --git a/go.sum b/go.sum index 4394e6c2a..edd430d16 100644 --- a/go.sum +++ b/go.sum @@ -1090,8 +1090,6 @@ github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.1 h1:SWiSWN/42qdpR0MdhaOc/bLR48PLuP1ZQtYLRlM69uY= -github.com/hashicorp/go-getter v1.7.1/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-getter v1.7.4 h1:3yQjWuxICvSpYwqSayAdKRFcvBl1y/vogCxczWSmix0= github.com/hashicorp/go-getter v1.7.4/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= diff --git a/x/oracle/keeper/cache/caches.go b/x/oracle/keeper/cache/caches.go index 400849077..67549a136 100644 --- a/x/oracle/keeper/cache/caches.go +++ b/x/oracle/keeper/cache/caches.go @@ -125,21 +125,28 @@ func (c *cacheParams) add(p *common.Params) { func (c *cacheParams) commit(ctx sdk.Context, k common.KeeperOracle) { block := uint64(ctx.BlockHeight()) index, _ := k.GetIndexRecentParams(ctx) - for i, b := range index.Index { + i := 0 + for ; i < len(index.Index); i++ { + b := index.Index[i] if b >= block-common.MaxNonce { index.Index = index.Index[i:] break } k.RemoveRecentParams(ctx, b) } + index.Index = index.Index[i:] // remove and append for KVStore - k.SetIndexRecentParams(ctx, index) index.Index = append(index.Index, block) k.SetIndexRecentParams(ctx, index) + + p := types.Params(*c.params) + k.SetRecentParams(ctx, types.RecentParams{ + Block: block, + Params: &p, + }) } // memory cache -// func (c *Cache) AddCache(i any, k common.KeeperOracle) { func (c *Cache) AddCache(i any) { switch item := i.(type) { case *ItemM: @@ -190,6 +197,12 @@ func (c *Cache) GetCache(i any) bool { return true } +// SkipCommit skip real commit by setting the updage flag to false +func (c *Cache) SkipCommit() { + c.validators.update = false + c.params.update = false +} + func (c *Cache) CommitCache(ctx sdk.Context, reset bool, k common.KeeperOracle) { if len(c.msg) > 0 { c.msg.commit(ctx, k) diff --git a/x/oracle/keeper/recent_msg.go b/x/oracle/keeper/recent_msg.go index e559b1457..9fd9c7ab4 100644 --- a/x/oracle/keeper/recent_msg.go +++ b/x/oracle/keeper/recent_msg.go @@ -65,6 +65,7 @@ func (k Keeper) GetAllRecentMsgAsMap(ctx sdk.Context) (result map[int64][]*types iterator := sdk.KVStorePrefixIterator(store, []byte{}) defer iterator.Close() + result = make(map[int64][]*types.MsgItem) for ; iterator.Valid(); iterator.Next() { var val types.RecentMsg diff --git a/x/oracle/keeper/recent_params.go b/x/oracle/keeper/recent_params.go index e2e1a36c9..d9d39ff21 100644 --- a/x/oracle/keeper/recent_params.go +++ b/x/oracle/keeper/recent_params.go @@ -66,6 +66,8 @@ func (k Keeper) GetAllRecentParamsAsMap(ctx sdk.Context) (result map[int64]*type defer iterator.Close() + result = make(map[int64]*types.Params) + for ; iterator.Valid(); iterator.Next() { var val types.RecentParams k.cdc.MustUnmarshal(iterator.Value(), &val) diff --git a/x/oracle/keeper/single.go b/x/oracle/keeper/single.go index 1019c50c1..842eb2009 100644 --- a/x/oracle/keeper/single.go +++ b/x/oracle/keeper/single.go @@ -35,6 +35,9 @@ func GetAggregatorContext(ctx sdk.Context, k Keeper) *aggregator.AggregatorConte if ok := recacheAggregatorContext(ctx, agc, k, c); !ok { // this is the very first time oracle has been started, fill relalted info as initialization initAggregatorContext(ctx, agc, k, c) + } else { + // this is when a node restart and use the persistent state to refill cache, we don't need to commit these data again + c.SkipCommit() } return agc } @@ -45,7 +48,7 @@ func recacheAggregatorContext(ctx sdk.Context, agc *aggregator.AggregatorContext h, ok := k.GetValidatorUpdateBlock(ctx) recentParamsMap := k.GetAllRecentParamsAsMap(ctx) - if !ok || recentParamsMap == nil { + if !ok || len(recentParamsMap) == 0 { // no cache, this is the very first running, so go to initial process instead return false } @@ -66,7 +69,7 @@ func recacheAggregatorContext(ctx sdk.Context, agc *aggregator.AggregatorContext agc.SetValidatorPowers(validatorPowers) // TODO: test only if k.GetLastTotalPower(ctx).BigInt().Cmp(totalPower) != 0 { - panic("something wrong when get validatorsPower from staking module") + ctx.Logger().Error("something wrong when get validatorsPower from staking module") } // reset validators diff --git a/x/oracle/module.go b/x/oracle/module.go index ac5a376e3..2c4196906 100644 --- a/x/oracle/module.go +++ b/x/oracle/module.go @@ -167,6 +167,8 @@ func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.Val validator, _ := am.keeper.GetValidatorByConsAddr(ctx, sdk.GetConsAddress(pubKey)) validatorList[validator.OperatorAddress] = big.NewInt(vu.Power) } + // update validator set information in cache + cs.AddCache(cache.ItemV(validatorList)) validatorPowers := make(map[string]*big.Int) cs.GetCache(cache.ItemV(validatorPowers)) // update validatorPowerList in aggregatorContext @@ -214,6 +216,6 @@ func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.Val logger.Info("prepare for next oracle round of each tokenFeeder") agc.PrepareRound(ctx, 0) - cs.CommitCache(ctx, true, am.keeper) + cs.CommitCache(ctx, false, am.keeper) return []abci.ValidatorUpdate{} }