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

feat: consensus messages #351

Merged
merged 15 commits into from
Oct 21, 2024
Merged

feat: consensus messages #351

merged 15 commits into from
Oct 21, 2024

Conversation

faultytolly
Copy link
Contributor

@faultytolly faultytolly commented Sep 26, 2024

Description

ADR link https://www.notion.so/dymension/ADR-x-Sequencer-Messages-34f95e2b579e458e8bb4252da19324bd

Closes https://github.com/dymensionxyz/epics/issues/1


All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow-up issues.

PR review checkboxes:

I have...

  • Added a relevant changelog entry to the Unreleased section in CHANGELOG.md
  • Targeted PR against the correct branch
  • included the correct type prefix in the PR title
  • Linked to the GitHub issue with discussion and accepted design
  • Targets only one GitHub issue
  • Wrote unit and integration tests
  • Wrote relevant migration scripts if necessary
  • All CI checks have passed
  • Added relevant godoc comments
  • Updated the scripts for local run, e.g genesis_config_commands.sh if the PR changes parameters
  • Add an issue in the e2e-tests repo if necessary

SDK Checklist

  • Import/Export Genesis
  • Registered Invariants
  • Registered Events
  • Updated openapi.yaml
  • No usage of go map
  • No usage of time.Now()
  • Used fixed point arithmetic and not float arithmetic
  • Avoid panicking in Begin/End block as much as possible
  • No unexpected math Overflow
  • Used sendCoin and not SendCoins
  • Out-of-block compute is bounded
  • No serialized ID at the end of store keys
  • UInt to byte conversion should use BigEndian

Full security checklist here

----;

For Reviewer:

  • Confirmed the correct type prefix in the PR title
  • Reviewers assigned
  • Confirmed all author checklist items have been addressed

---;

After reviewer approval:

  • In case the PR targets the main branch, PR should not be squash merge in order to keep meaningful git history.
  • In case the PR targets a release branch, PR must be rebased.

@faultytolly faultytolly marked this pull request as draft September 26, 2024 16:59
@keruch keruch self-requested a review October 2, 2024 18:51
@keruch keruch marked this pull request as ready for review October 2, 2024 18:51
Copy link
Contributor

@keruch keruch left a comment

Choose a reason for hiding this comment

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

LGTM! left a few remark

app/app.go Outdated Show resolved Hide resolved
app/app.go Outdated Show resolved Hide resolved
app/app.go Outdated Show resolved Hide resolved
app/app.go Outdated

theType, err := proto.Marshal(resp)
if err != nil {
return nil
Copy link
Contributor

Choose a reason for hiding this comment

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

why return nil? don't you need to append to responses and continue?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

not sure about this, if the message passed but the resp is not correct?

Copy link
Contributor

Choose a reason for hiding this comment

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

related to my previous question - should we maybe run it with cached context and if the message changed the state but the response is incorrect than simply uncommit the context? what happens in the same case if a tx runs? (i.e the response can't be marshalled?)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I changed this code, but it will be a weird case when the message passes, but the response is not correct.

It looks like there will be a bug, and we end reverting the full tx.

app/app_test.go Outdated Show resolved Hide resolved
Comment on lines +88 to +89
_, isError := response.Response.(*abci.ConsensusMessageResponse_Error)
require.True(t, isError, "Expected an error response but got a success")
Copy link
Contributor

Choose a reason for hiding this comment

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

i'd also suggest verifying the returned error string

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@danwt did not like to check the strings of errors

app/test_helpers.go Outdated Show resolved Hide resolved
app/app.go Outdated Show resolved Hide resolved
app/app.go Outdated Show resolved Hide resolved
app/app.go Outdated
if err != nil {
responses = append(responses, &abci.ConsensusMessageResponse{
Response: &abci.ConsensusMessageResponse_Error{
Error: fmt.Errorf("failed to execute consensus message: %w", err).Error(),
Copy link
Contributor

Choose a reason for hiding this comment

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

app/app.go Outdated Show resolved Hide resolved
app/app.go Outdated
continue
}

resp, err := app.MsgServiceRouter().Handler(msg)(ctx, msg)
Copy link
Contributor

Choose a reason for hiding this comment

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

shouldn't we here pass cache ctx and than abort in case of errors?
deliver tx provides it for us automatically but afair in begin block we need to handle it manually.
i.e - if the handler fails, how does the state changes get reverted?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

totally, I think the abort in case of errors is not what was expected. If there is an error the context is not written and we move to next message. Only the error message is appended in the response. Check the writeCache() that is done at the end of the loop. Only if everything is perfect it is written to state.

app/app.go Outdated

theType, err := proto.Marshal(resp)
if err != nil {
return nil
Copy link
Contributor

Choose a reason for hiding this comment

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

related to my previous question - should we maybe run it with cached context and if the message changed the state but the response is incorrect than simply uncommit the context? what happens in the same case if a tx runs? (i.e the response can't be marshalled?)

omritoptix
omritoptix previously approved these changes Oct 8, 2024
Copy link
Contributor

@omritoptix omritoptix left a comment

Choose a reason for hiding this comment

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

Still have answered questions but approving to unblock

app/app.go Outdated Show resolved Hide resolved
@omritoptix omritoptix merged commit 147382a into main Oct 21, 2024
84 of 109 checks passed
@omritoptix omritoptix deleted the feat/consensus-messages branch October 21, 2024 08:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants