Browse Source

statesync: fix valset off-by-one causing consensus failures (#5311)

pull/5314/head
Erik Grinaker 4 years ago
committed by GitHub
parent
commit
686361ff3e
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 7 deletions
  1. +3
    -1
      CHANGELOG_PENDING.md
  2. +5
    -6
      statesync/stateprovider.go

+ 3
- 1
CHANGELOG_PENDING.md View File

@ -23,4 +23,6 @@ Friendly reminder, we have a [bug bounty program](https://hackerone.com/tendermi
- [statesync] \#5302 Fix genesis state propagation to state sync routine (@erikgrinaker)
- [light] [\#5307](https://github.com/tendermint/tendermint/pull/5307) persist correct proposer priority in light client validator sets (@cmwaters)
- [statesync] \#5311 Fix validator set off-by-one causing consensus failures (@erikgrinaker)
- [light] [\#5307](https://github.com/tendermint/tendermint/pull/5307) Persist correct proposer priority in light client validator sets (@cmwaters)

+ 5
- 6
statesync/stateprovider.go View File

@ -120,9 +120,8 @@ func (s *lightClientStateProvider) State(height uint64) (sm.State, error) {
state.InitialHeight = 1
}
// We need to verify up until h+2, to get the validator set. This also prefetches the headers
// for h and h+1 in the typical case where the trusted header is after the snapshot height.
_, err := s.lc.VerifyHeaderAtHeight(int64(height+2), time.Now())
// We need to verify the previous block to get the validator set.
_, err := s.lc.VerifyHeaderAtHeight(int64(height-1), time.Now())
if err != nil {
return sm.State{}, err
}
@ -140,15 +139,15 @@ func (s *lightClientStateProvider) State(height uint64) (sm.State, error) {
state.AppHash = nextHeader.AppHash
state.LastResultsHash = nextHeader.LastResultsHash
state.LastValidators, _, err = s.lc.TrustedValidatorSet(int64(height))
state.LastValidators, _, err = s.lc.TrustedValidatorSet(int64(height - 1))
if err != nil {
return sm.State{}, err
}
state.Validators, _, err = s.lc.TrustedValidatorSet(int64(height + 1))
state.Validators, _, err = s.lc.TrustedValidatorSet(int64(height))
if err != nil {
return sm.State{}, err
}
state.NextValidators, _, err = s.lc.TrustedValidatorSet(int64(height + 2))
state.NextValidators, _, err = s.lc.TrustedValidatorSet(int64(height + 1))
if err != nil {
return sm.State{}, err
}


Loading…
Cancel
Save