Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Correctly handle VSC packet with duplicate val updates on consumer #846

Merged
merged 5 commits into from
Apr 13, 2023

Conversation

shaspitz
Copy link
Contributor

Description

Fixes a bug seen in the Neutron testnet where tendermint was sent duplicate val updates for the same validator, with different powers. This is a consumer side fix, and a corresponding provider side fix (involving key assignment), should be made eventually.

Linked issues

Closes: #<issue>

Type of change

If you've checked more than one of the first three boxes, consider splitting this PR into multiple PRs!

  • Feature: Changes and/or adds code behavior, irrelevant to bug fixes
  • Fix: Changes and/or adds code behavior, specifically to fix a bug
  • Refactor: Changes existing code style, naming, structure, etc.
  • Testing: Adds testing
  • Docs: Adds documentation

Regression tests

Existing tests for OnRecvVSCPacket like TestOnRecvVSCPacket

New behavior tests

TestOnRecvVSCPacketDuplicateUpdates, which fails without the fix from relay.go

Versioning Implications

If the above box is checked, which version should be bumped?

  • MAJOR: Consensus breaking changes to both the provider and consumers(s), including updates/breaking changes to IBC communication between provider and consumer(s)
  • MINOR: Consensus breaking changes which affect either only the provider or only the consumer(s)
  • PATCH: Non consensus breaking changes

Targeting

  • This PR is relevant to main, and should also be back-ported to the v1.2.x branch!

Copy link
Contributor

@mpoke mpoke left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Comment on lines 53 to 58
if !exists {
pendingChanges = newChanges.ValidatorUpdates
// Still accumulate changes if no pending changes exist. New changes must be deduplicated
pendingChanges = utils.AccumulateChanges([]abci.ValidatorUpdate{}, newChanges.ValidatorUpdates)
} else {
pendingChanges = utils.AccumulateChanges(currentChanges.ValidatorUpdates, newChanges.ValidatorUpdates)
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about:

currentValUpdates := []abci.ValidatorUpdate{}
currentChanges, exists := k.GetPendingChanges(ctx)
if exists {
    currentValUpdates = currentChanges.ValidatorUpdates
}
pendingChanges = utils.AccumulateChanges(currentValUpdates, newChanges.ValidatorUpdates)

@sainoe sainoe merged commit 01fb333 into main Apr 13, 2023
@sainoe sainoe deleted the fix-dup-val-update-consumer branch April 13, 2023 13:12
sainoe added a commit that referenced this pull request Apr 13, 2023
)

* fix dup val update consumer

* gofumpt

* add small refactor to OnRecvVSCPacket

---------

Co-authored-by: Marius Poke <[email protected]>
Co-authored-by: Simon Noetzlin <[email protected]>
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.

4 participants