Skip to content

Commit

Permalink
feat: CNS-942: remove stake entry index usage (#1370)
Browse files Browse the repository at this point in the history
* CNS-942: remove stake entry index usage

* CNS-942: lint fix

* CNS-942: make GetStakeEntryByAddressFromStorage a StakeStorage method

* CNS-942: PR fix

---------

Co-authored-by: Elad Gildnur <6321801+shleikes@users.noreply.github.com>
  • Loading branch information
oren-lava and shleikes authored Apr 17, 2024
1 parent 6d06aea commit 176507c
Show file tree
Hide file tree
Showing 32 changed files with 396 additions and 458 deletions.
10 changes: 10 additions & 0 deletions utils/address.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package utils

import (
sdk "github.com/cosmos/cosmos-sdk/types"
)

func IsBech32Address(addr string) bool {
_, err := sdk.AccAddressFromBech32(addr)
return err == nil
}
12 changes: 6 additions & 6 deletions x/conflict/keeper/conflict.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ func (k Keeper) ValidateResponseConflict(ctx sdk.Context, conflictData *types.Re
return fmt.Errorf("conflict data 1: %s", err)
}
// 3. validate providers signatures and stakeEntry for that epoch
providerAddressFromRelayReplyAndVerifyStakeEntry := func(requestData *pairingtypes.RelayPrivateData, reply *types.ReplyMetadata, first bool) (providerAddress sdk.AccAddress, err error) {
providerAddressFromRelayReplyAndVerifyStakeEntry := func(reply *types.ReplyMetadata, first bool) (providerAddress sdk.AccAddress, err error) {
print_st := "first"
if !first {
print_st = "second"
Expand All @@ -103,17 +103,17 @@ func (k Keeper) ValidateResponseConflict(ctx sdk.Context, conflictData *types.Re
if err != nil {
return nil, fmt.Errorf("AccAddressFromHex %s provider: %w", print_st, err)
}
_, err = k.epochstorageKeeper.GetStakeEntryForProviderEpoch(ctx, chainID, providerAddress, epochStart)
if err != nil {
return nil, fmt.Errorf("did not find a stake entry for %s provider %s on epoch %d, chainID %s error: %s", print_st, providerAddress, epochStart, chainID, err.Error())
_, found := k.epochstorageKeeper.GetStakeEntryForProviderEpoch(ctx, chainID, providerAddress.String(), epochStart)
if !found {
return nil, fmt.Errorf("did not find a stake entry for %s provider %s on epoch %d, chainID %s", print_st, providerAddress, epochStart, chainID)
}
return providerAddress, nil
}
providerAccAddress0, err := providerAddressFromRelayReplyAndVerifyStakeEntry(conflictData.ConflictRelayData0.Request.RelayData, conflictData.ConflictRelayData0.Reply, true)
providerAccAddress0, err := providerAddressFromRelayReplyAndVerifyStakeEntry(conflictData.ConflictRelayData0.Reply, true)
if err != nil {
return err
}
providerAccAddress1, err := providerAddressFromRelayReplyAndVerifyStakeEntry(conflictData.ConflictRelayData1.Request.RelayData, conflictData.ConflictRelayData1.Reply, false)
providerAccAddress1, err := providerAddressFromRelayReplyAndVerifyStakeEntry(conflictData.ConflictRelayData1.Reply, false)
if err != nil {
return err
}
Expand Down
27 changes: 6 additions & 21 deletions x/conflict/keeper/vote.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,17 +89,9 @@ func (k Keeper) HandleAndCloseVote(ctx sdk.Context, conflictVote types.ConflictV
}

for _, vote := range conflictVote.Votes {
accAddress, err := sdk.AccAddressFromBech32(vote.Address)
if err != nil {
utils.LavaFormatWarning("invalid vote address", err,
utils.Attribute{Key: "voteAddress", Value: vote.Address},
)
ConsensusVote = false
continue
}
entry, err := k.epochstorageKeeper.GetStakeEntryForProviderEpoch(ctx, conflictVote.ChainID, accAddress, epochVoteStart)
if err != nil {
utils.LavaFormatWarning("failed to get stake entry for provider in voter list", err,
entry, found := k.epochstorageKeeper.GetStakeEntryForProviderEpoch(ctx, conflictVote.ChainID, vote.Address, epochVoteStart)
if !found {
utils.LavaFormatWarning("failed to get stake entry for provider in voter list", fmt.Errorf("stake entry not found"),
utils.Attribute{Key: "voteID", Value: conflictVote.Index},
utils.Attribute{Key: "voteChainID", Value: conflictVote.ChainID},
utils.Attribute{Key: "voteStartBlock", Value: conflictVote.VoteStartBlock},
Expand All @@ -122,12 +114,12 @@ func (k Keeper) HandleAndCloseVote(ctx sdk.Context, conflictVote types.ConflictV
providersWithoutVote = append(providersWithoutVote, vote.Address)
bail := stake
bail.Quo(sdk.NewIntFromUint64(BailStakeDiv))
err = k.pairingKeeper.JailEntry(ctx, accAddress, conflictVote.ChainID, conflictVote.VoteStartBlock, blocksToSave, sdk.NewCoin(k.stakingKeeper.BondDenom(ctx), bail))
err = k.pairingKeeper.JailEntry(ctx, vote.Address, conflictVote.ChainID, conflictVote.VoteStartBlock, blocksToSave, sdk.NewCoin(k.stakingKeeper.BondDenom(ctx), bail))
if err != nil {
utils.LavaFormatWarning("jailing failed at vote conflict", err)
// not skipping to continue to slash
}
slashed, err := k.pairingKeeper.SlashEntry(ctx, accAddress, conflictVote.ChainID, SlashStakePercent)
slashed, err := k.pairingKeeper.SlashEntry(ctx, vote.Address, conflictVote.ChainID, SlashStakePercent)
rewardPool = rewardPool.Add(slashed)
if err != nil {
utils.LavaFormatWarning("slashing failed at vote conflict", err)
Expand Down Expand Up @@ -177,14 +169,7 @@ func (k Keeper) HandleAndCloseVote(ctx sdk.Context, conflictVote types.ConflictV
if ConsensusVote && sdk.NewDecFromInt(winnerVotersStake).QuoInt(totalVotes).GTE(k.MajorityPercent(ctx)) {
for _, vote := range conflictVote.Votes {
if vote.Result != winner && !slices.Contains(providersWithoutVote, vote.Address) { // punish those who voted wrong, voters that didnt vote already got punished
accAddress, err := sdk.AccAddressFromBech32(vote.Address)
if err != nil {
utils.LavaFormatWarning("invalid vote address", err,
utils.Attribute{Key: "voteAddress", Value: vote.Address},
)
continue
}
slashed, err := k.pairingKeeper.SlashEntry(ctx, accAddress, conflictVote.ChainID, sdk.NewDecWithPrec(1, 0))
slashed, err := k.pairingKeeper.SlashEntry(ctx, vote.Address, conflictVote.ChainID, sdk.NewDecWithPrec(1, 0))
rewardPool = rewardPool.Add(slashed)
if err != nil {
utils.LavaFormatWarning("slashing failed at vote conflict", err)
Expand Down
12 changes: 6 additions & 6 deletions x/conflict/types/expected_keepers.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ type PairingKeeper interface {
FreezeProvider(ctx sdk.Context, provider string, chainIDs []string, reason string) error
CreditStakeEntry(ctx sdk.Context, chainID string, lookUpAddress sdk.AccAddress, creditAmount sdk.Coin) (bool, error)
VerifyPairingData(ctx sdk.Context, chainID string, block uint64) (epoch uint64, providersType spectypes.Spec_ProvidersTypes, errorRet error)
JailEntry(ctx sdk.Context, account sdk.AccAddress, chainID string, jailStartBlock, jailBlocks uint64, bail sdk.Coin) error
BailEntry(ctx sdk.Context, account sdk.AccAddress, chainID string, bail sdk.Coin) error
SlashEntry(ctx sdk.Context, account sdk.AccAddress, chainID string, percentage sdk.Dec) (sdk.Coin, error)
JailEntry(ctx sdk.Context, address string, chainID string, jailStartBlock, jailBlocks uint64, bail sdk.Coin) error
BailEntry(ctx sdk.Context, address string, chainID string, bail sdk.Coin) error
SlashEntry(ctx sdk.Context, address string, chainID string, percentage sdk.Dec) (sdk.Coin, error)
GetProjectData(ctx sdk.Context, developerKey sdk.AccAddress, chainID string, blockHeight uint64) (proj projectstypes.Project, errRet error)
}

Expand All @@ -26,10 +26,10 @@ type EpochstorageKeeper interface {
BlocksToSave(ctx sdk.Context, block uint64) (res uint64, err error)
GetEarliestEpochStart(ctx sdk.Context) uint64
GetEpochStartForBlock(ctx sdk.Context, block uint64) (epochStart, blockInEpoch uint64, err error)
GetStakeEntryForProviderEpoch(ctx sdk.Context, chainID string, selectedProvider sdk.AccAddress, epoch uint64) (entry *epochstoragetypes.StakeEntry, err error)
GetStakeEntryForProviderEpoch(ctx sdk.Context, chainID string, selectedProvider string, epoch uint64) (entry epochstoragetypes.StakeEntry, found bool)
GetStakeEntryForAllProvidersEpoch(ctx sdk.Context, chainID string, epoch uint64) (entrys *[]epochstoragetypes.StakeEntry, err error)
ModifyStakeEntryCurrent(ctx sdk.Context, chainID string, stakeEntry epochstoragetypes.StakeEntry, removeIndex uint64)
GetStakeEntryByAddressCurrent(ctx sdk.Context, chainID string, address sdk.AccAddress) (value epochstoragetypes.StakeEntry, found bool, index uint64)
ModifyStakeEntryCurrent(ctx sdk.Context, chainID string, stakeEntry epochstoragetypes.StakeEntry)
GetStakeEntryByAddressCurrent(ctx sdk.Context, chainID string, address string) (value epochstoragetypes.StakeEntry, found bool)
PushFixatedParams(ctx sdk.Context, block, limit uint64)
}

Expand Down
20 changes: 7 additions & 13 deletions x/dualstaking/keeper/delegate.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,15 +175,8 @@ func (k Keeper) decreaseDelegation(ctx sdk.Context, delegator, provider, chainID
}

// modifyStakeEntryDelegation modifies the (epochstorage) stake-entry of the provider for a chain based on the action (increase or decrease).
func (k Keeper) modifyStakeEntryDelegation(ctx sdk.Context, delegator, provider, chainID string, amount sdk.Coin, increase bool) error {
providerAddr, err := sdk.AccAddressFromBech32(provider)
if err != nil {
utils.LavaFormatPanic("modifyStakeEntryDelegation: invalid provider address", err,
utils.Attribute{Key: "provider", Value: provider},
)
}

stakeEntry, exists, index := k.epochstorageKeeper.GetStakeEntryByAddressCurrent(ctx, chainID, providerAddr)
func (k Keeper) modifyStakeEntryDelegation(ctx sdk.Context, delegator, provider, chainID string, amount sdk.Coin, increase bool) (err error) {
stakeEntry, exists := k.epochstorageKeeper.GetStakeEntryByAddressCurrent(ctx, chainID, provider)
if !exists {
if increase {
return epochstoragetypes.ErrProviderNotStaked
Expand Down Expand Up @@ -229,17 +222,18 @@ func (k Keeper) modifyStakeEntryDelegation(ctx sdk.Context, delegator, provider,
}

if stakeEntry.Stake.IsLT(k.GetParams(ctx).MinSelfDelegation) {
err = k.epochstorageKeeper.RemoveStakeEntryCurrent(ctx, chainID, index)
err = k.epochstorageKeeper.RemoveStakeEntryCurrent(ctx, chainID, stakeEntry.Address)
if err != nil {
return utils.LavaFormatError("can't remove stake Entry after decreasing provider self delegation", err,
utils.Attribute{Key: "index", Value: index},
utils.Attribute{Key: "provider", Value: stakeEntry.Address},
utils.Attribute{Key: "spec", Value: chainID},
)
}
details["min_self_delegation"] = k.GetParams(ctx).MinSelfDelegation.String()
utils.LogLavaEvent(ctx, k.Logger(ctx), types.UnstakeFromUnbond, details, "unstaking provider due to unbond that lowered its stake below min self delegation")
unstakeHoldBlocks := k.epochstorageKeeper.GetUnstakeHoldBlocks(ctx, stakeEntry.Chain)
return k.epochstorageKeeper.AppendUnstakeEntry(ctx, stakeEntry, unstakeHoldBlocks)
k.epochstorageKeeper.AppendUnstakeEntry(ctx, stakeEntry, unstakeHoldBlocks)
return nil
} else if stakeEntry.EffectiveStake().LT(k.specKeeper.GetMinStake(ctx, chainID).Amount) {
details["min_spec_stake"] = k.specKeeper.GetMinStake(ctx, chainID).String()
utils.LogLavaEvent(ctx, k.Logger(ctx), types.FreezeFromUnbond, details, "freezing provider due to stake below min spec stake")
Expand All @@ -248,7 +242,7 @@ func (k Keeper) modifyStakeEntryDelegation(ctx sdk.Context, delegator, provider,
stakeEntry.UnFreeze(k.epochstorageKeeper.GetCurrentNextEpoch(ctx) + 1)
}

k.epochstorageKeeper.ModifyStakeEntryCurrent(ctx, chainID, stakeEntry, index)
k.epochstorageKeeper.ModifyStakeEntryCurrent(ctx, chainID, stakeEntry)

return nil
}
Expand Down
Loading

0 comments on commit 176507c

Please sign in to comment.