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

fix(baseapp): Reset GasMeter before deliverTX #18714

Merged

Conversation

Eric-Warehime
Copy link
Contributor

@Eric-Warehime Eric-Warehime commented Dec 12, 2023

Description

#18609
Closes: #18609

Resets the BlockGasMeter before deliverTx is called to ensure the AnteHandlers aren't relied upon for that.


Author Checklist

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.

I have...

  • included the correct type prefix in the PR title
  • confirmed ! in the type prefix if API or client breaking change
  • targeted the correct branch (see PR Targeting)
  • provided a link to the relevant issue or specification
  • reviewed "Files changed" and left comments if necessary
  • included the necessary unit and integration tests
  • added a changelog entry to CHANGELOG.md
  • updated the relevant documentation or specification, including comments for documenting Go code
  • confirmed all CI checks have passed

Reviewers Checklist

All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.

I have...

  • confirmed the correct type prefix in the PR title
  • confirmed all author checklist items have been addressed
  • reviewed state machine logic, API design and naming, documentation is accurate, tests and test coverage

baseapp/abci.go Outdated Show resolved Hide resolved
@Eric-Warehime Eric-Warehime marked this pull request as ready for review December 12, 2023 22:36
@Eric-Warehime Eric-Warehime requested a review from a team as a code owner December 12, 2023 22:36
Copy link
Contributor

coderabbitai bot commented Dec 12, 2023

Walkthrough

The changes address a bug in the Cosmos SDK's BaseApp related to gas consumption tracking during block execution. Specifically, the updates ensure that the blockGasMeter accurately reflects the gas used in BeginBlock, DeliverTx, and EndBlock, and that the gasMeter is correctly reset after BeginBlock to prevent incorrect attribution of gas usage to the first transaction's AnteHandler.

Changes

File Path Change Summary
CHANGELOG.md Bug fix related to gas consumption idiosyncrasies in BeginBlock and DeliverTx in the baseapp.
baseapp/abci.go Changes in the internalFinalizeBlock function to reset the gas meter and update the context with the new gas meter for finalizeBlockState and checkState.
baseapp/baseapp_test.go Modification of the NewBaseAppSuiteWithSnapshots function to include additional options and addition of the TestAnteHandlerGasMeter function to test the behavior of the gas meter within the AnteHandler.

Assessment against linked issues

Objective Addressed Explanation
Bug Description
Simplest Fix
Context
Additional Information

The code changes appear to address the key objectives outlined in the linked issue, ensuring that gas consumption is tracked and managed correctly within the Cosmos SDK's BaseApp during the block execution process.

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on X ?


Tips

Chat with CodeRabbit Bot (@coderabbitai)

  • You can reply to a review comment made by CodeRabbit.
  • You can tag CodeRabbit on specific lines of code or files in the PR by tagging @coderabbitai in a comment.
  • You can tag @coderabbitai in a PR comment and ask one-off questions about the PR and the codebase. Use quoted replies to pass the context for follow-up questions.

CodeRabbit Commands (invoked as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger a review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai help to get help.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • The JSON schema for the configuration file is available here.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/coderabbit-overrides.v2.json

@julienrbrt julienrbrt changed the title fix: Reset GasMeter before deliverTX fix(baseapp): Reset GasMeter before deliverTX Dec 12, 2023
baseapp/abci.go Outdated
// Reset the gas meter so that the AnteHandlers aren't required to
gasMeter = app.getBlockGasMeter(app.finalizeBlockState.ctx)
app.finalizeBlockState.ctx = app.finalizeBlockState.ctx.WithBlockGasMeter(gasMeter)
app.checkState.ctx = app.checkState.ctx.WithBlockGasMeter(gasMeter)
Copy link
Contributor

Choose a reason for hiding this comment

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

sorry, why are we setting CheckTx state here?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Good call out, there's no need to modify the checkTx state's meter here.

@@ -780,6 +780,11 @@ func (app *BaseApp) internalFinalizeBlock(ctx context.Context, req *abci.Request

events = append(events, beginBlock.Events...)

// Reset the gas meter so that the AnteHandlers aren't required to
gasMeter = app.getBlockGasMeter(app.finalizeBlockState.ctx)
app.finalizeBlockState.ctx = app.finalizeBlockState.ctx.WithBlockGasMeter(gasMeter)
Copy link
Contributor

Choose a reason for hiding this comment

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

LGTM

CHANGELOG.md Outdated Show resolved Hide resolved
@facundomedica
Copy link
Member

LGTM but I have some questions to fully understand this. This means that we can also remove the gas meter resetting in the ante handlers? Why was this done in ante handlers in the first place?

@alexanderbez
Copy link
Contributor

alexanderbez commented Dec 15, 2023

LGTM but I have some questions to fully understand this. This means that we can also remove the gas meter resetting in the ante handlers? Why was this done in ante handlers in the first place?

@facundomedica it is done in the AnteHandler, specifically the Setup decorator. However, this patch addresses two things:

  1. Handling the case where a chain doesn't use the Setup decorator (not sure why they wouldn't but it has happened)
  2. Addressing the fact that the 1st tx in a block may not be an sdk.Tx and so the ante-handler is never called for that 'data blob'.

@facundomedica facundomedica added this pull request to the merge queue Dec 15, 2023
Merged via the queue into cosmos:main with commit e7f5c2e Dec 15, 2023
54 of 56 checks passed
@julienrbrt
Copy link
Member

@alexanderbez is it a backportable fix?

@Eric-Warehime
Copy link
Contributor Author

@alexanderbez is it a backportable fix?

It should be--we found this issue when using 0.47. But the fix is in a different place so I'm thinking it makes sense for me to open a different PR for the backport instead of trying to have mergify/automation do it. I have a branch with changes staged already on my fork.

@julienrbrt
Copy link
Member

For v0.47 that makes sense not to use mergify. For v0.50, if we backport, that will be easier to use it.

@julienrbrt julienrbrt mentioned this pull request Dec 18, 2023
12 tasks
@julienrbrt
Copy link
Member

@Mergifyio backport release/v0.50.x

Copy link
Contributor

mergify bot commented Dec 18, 2023

backport release/v0.50.x

✅ Backports have been created

mergify bot pushed a commit that referenced this pull request Dec 18, 2023
(cherry picked from commit e7f5c2e)

# Conflicts:
#	CHANGELOG.md
@julienrbrt
Copy link
Member

julienrbrt commented Dec 19, 2023

@alexanderbez is it a backportable fix?

It should be--we found this issue when using 0.47. But the fix is in a different place so I'm thinking it makes sense for me to open a different PR for the backport instead of trying to have mergify/automation do it. I have a branch with changes staged already on my fork.

Are you willing to open a PR targeting v0.47?

@alexanderbez
Copy link
Contributor

@alexanderbez is it a backportable fix?

It should be--we found this issue when using 0.47. But the fix is in a different place so I'm thinking it makes sense for me to open a different PR for the backport instead of trying to have mergify/automation do it. I have a branch with changes staged already on my fork.

Are you willing to open a PR targeting v0.47?

++ @Eric-Warehime 🙏

@Eric-Warehime
Copy link
Contributor Author

@alexanderbez is it a backportable fix?

It should be--we found this issue when using 0.47. But the fix is in a different place so I'm thinking it makes sense for me to open a different PR for the backport instead of trying to have mergify/automation do it. I have a branch with changes staged already on my fork.

Are you willing to open a PR targeting v0.47?

++ @Eric-Warehime 🙏

Yes I can get it open probably in the next 24-48 hours.

@julienrbrt
Copy link
Member

Yes I can get it open probably in the next 24-48 hours.

Cool, that's our only blocker for v0.47.7 ;)

@Eric-Warehime
Copy link
Contributor Author

Opening 0.47.X backport in #18826

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.

[Bug]: Gas Consumption idiosyncracies in BeginBlock / DeliverTx
4 participants