Skip to content

Conversation

@fakedev9999
Copy link
Member

@fakedev9999 fakedev9999 commented Oct 3, 2025

1. Aligns the skip with the verifier’s actual trusted set.

In Tendermint light-client semantics the block you trust at height h carries forward the validator set for height h+1. When verifier evaluates the next header, it compares the commit against that next_validators set.

If the skip samples validators from height h instead of h+1, it can approve a transition that the verifier will reject, because the verifier never considers the height h set.

See the light client verifier code here.

2. Filter non-commit votes.

A commit’s voting power is defined only by signatures with BlockIdFlag::Commit. BlockIdFlagAbsent and BlockIdFlagNil votes don’t contribute. If the skip counts every signature including nil or absent, the tallied power can appear to hit 2/3 even though fewer than 2/3 of validators actually signed the block which will cause the verifier to later rejects it with NotEnoughTrust error and panic.

3. Check threshold for trusted validators

The original loop didn't compare the threshold against the trusted validator set's voting power.

The function still returned true as long as enough of the target set happened to be in the old validator set which causes the verifier to later rejects it with NotEnoughTrust error and panic.

@fakedev9999 fakedev9999 merged commit d6ed390 into main Oct 3, 2025
0 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants