diff --git a/app/extend_vote.go b/app/extend_vote.go index ca7a5f8a7..8021b34c7 100644 --- a/app/extend_vote.go +++ b/app/extend_vote.go @@ -51,6 +51,7 @@ type BridgeKeeper interface { type StakingKeeper interface { GetValidatorByConsAddr(ctx context.Context, consAddr sdk.ConsAddress) (validator stakingtypes.Validator, err error) + GetBondedValidatorsByPower(ctx context.Context) ([]stakingtypes.Validator, error) } type VoteExtHandler struct { diff --git a/app/proposal_handler.go b/app/proposal_handler.go index 3019f4c08..892faf5fd 100644 --- a/app/proposal_handler.go +++ b/app/proposal_handler.go @@ -63,7 +63,19 @@ func NewProposalHandler(logger log.Logger, valStore baseapp.ValidatorStore, appC } func (h *ProposalHandler) PrepareProposalHandler(ctx sdk.Context, req *abci.RequestPrepareProposal) (*abci.ResponsePrepareProposal, error) { - err := baseapp.ValidateVoteExtensions(ctx, h.valStore, req.Height, ctx.ChainID(), req.LocalLastCommit) + // Verify number of votes doesn't exceed bonded validators + bondedVals, err := h.stakingKeeper.GetBondedValidatorsByPower(ctx) + if err != nil { + h.logger.Error("PrepareProposalHandler: failed to get bonded validators", "error", err) + return nil, err + } + if len(req.LocalLastCommit.Votes) > len(bondedVals) { + h.logger.Error("PrepareProposalHandler: number of votes exceeds bonded validators", + "votes", len(req.LocalLastCommit.Votes), + "bonded_validators", len(bondedVals)) + return nil, errors.New("number of votes exceeds bonded validators") + } + err = baseapp.ValidateVoteExtensions(ctx, h.valStore, req.Height, ctx.ChainID(), req.LocalLastCommit) if err != nil { h.logger.Info("PrepareProposalHandler: failed to validate vote extensions", "error", err, "votes", req.LocalLastCommit.Votes) return nil, err @@ -126,7 +138,16 @@ func (h *ProposalHandler) ProcessProposalHandler(ctx sdk.Context, req *abci.Requ h.logger.Error("ProcessProposalHandler: rejecting proposal, failed to validate vote extension", "error", err) return &abci.ResponseProcessProposal{Status: abci.ResponseProcessProposal_REJECT}, nil } - + // Verify number of votes doesn't exceed bonded validators + bondedVals, err := h.stakingKeeper.GetBondedValidatorsByPower(ctx) + if err != nil { + h.logger.Error("ProcessProposalHandler: failed to get bonded validators", "error", err) + return nil, err + } + if len(injectedVoteExtTx.ExtendedCommitInfo.Votes) > len(bondedVals) { + h.logger.Error("ProcessProposalHandler: number of votes exceeds bonded validators", "votes", len(injectedVoteExtTx.ExtendedCommitInfo.Votes), "bonded_validators", len(bondedVals)) + return &abci.ResponseProcessProposal{Status: abci.ResponseProcessProposal_REJECT}, nil + } operatorAddresses, evmAddresses := h.CheckInitialSignaturesFromLastCommit(ctx, injectedVoteExtTx.ExtendedCommitInfo) if !reflect.DeepEqual(operatorAddresses, injectedVoteExtTx.OpAndEVMAddrs.OperatorAddresses) {