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(bank): fix gas invariant wrapper to actually charge gas #2140

Merged
merged 7 commits into from
Jan 6, 2025

Conversation

k-yang
Copy link
Member

@k-yang k-yang commented Jan 3, 2025

The bank keeper extension was charging zero gas for its operations.

Related: #2119

Summary by CodeRabbit

  • New Features

    • Added a method to synchronize state database with account balances.
    • Introduced a function to detect Ether balance changes.
  • Bug Fixes

    • Enhanced gas consumption logic to prevent panics during operations.
    • Adjusted expected gas consumption in specific test cases.
  • Tests

    • Updated gas consumption test cases with more precise assertions.
    • Added logging for gas consumption values.
    • Improved clarity of assertions related to gas consumption invariants.
  • Documentation

    • Updated changelog entries for clarity and organization, including new sections for recent changes.

@k-yang k-yang requested a review from a team as a code owner January 3, 2025 19:23
Copy link
Contributor

coderabbitai bot commented Jan 3, 2025

Walkthrough

The pull request introduces modifications to the EVM module's bank extension in the Nibiru blockchain. The changes focus on refining gas consumption tracking and state database synchronization. The ForceGasInvariant method now initializes the gas meter with an infinite gas meter instead of a limited one. A new method SyncStateDBWithAccount is added to synchronize account balances, and a helper function findEtherBalanceChangeFromCoins is introduced to detect Ether balance changes during various coin operations. Additionally, test cases have been updated to reflect changes in gas consumption expectations and validation.

Changes

File Change Summary
x/evm/keeper/bank_extension.go - Modified ForceGasInvariant method to use an infinite gas meter
- Added SyncStateDBWithAccount method
- Added findEtherBalanceChangeFromCoins helper function
x/evm/keeper/bank_extension_test.go - Updated TestGasConsumedInvariantSend with new log statement
- Modified gas consumption comparison logic
- Changed assertion from GreaterOrEqualf to Greaterf
app/ante/fixed_gas_test.go - Updated expected gas consumption in TestOraclePostPriceTransactionsHaveFixedPrice for "Other two messages"
CHANGELOG.md - Improved formatting and consistency of changelog entries

Possibly related PRs

  • refactor: simplify account retrieval #2141: The changes in the main PR involve modifications to the NibiruBankKeeper struct and its methods, which may interact with account retrieval processes, making this PR relevant as it simplifies account retrieval operations that could be related to the overall functionality of the bank keeper.

Suggested reviewers

  • onikonychev

Poem

🐰 Hop, hop, through the blockchain's maze,
Gas meters dance in digital ways,
Sync accounts with a rabbit's might,
Ether balances now shine so bright!
Code leaps forward with each new trace 🚀


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 51b8d06 and d0cdb32.

📒 Files selected for processing (1)
  • CHANGELOG.md (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (5)
  • GitHub Check: integration-tests
  • GitHub Check: unit-tests
  • GitHub Check: build
  • GitHub Check: e2e-evm
  • GitHub Check: lint
🔇 Additional comments (1)
CHANGELOG.md (1)

Line range hint 1-24: Well-structured changelog format

The changelog follows best practices with clear sections, proper documentation, and good organization. The format makes it easy to track changes across versions.


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 your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • 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/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

codecov bot commented Jan 4, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 64.96%. Comparing base (86d6b3f) to head (d0cdb32).
Report is 2 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2140      +/-   ##
==========================================
- Coverage   64.99%   64.96%   -0.04%     
==========================================
  Files         274      274              
  Lines       21767    21757      -10     
==========================================
- Hits        14148    14134      -14     
- Misses       6645     6650       +5     
+ Partials      974      973       -1     
Files with missing lines Coverage Δ
x/evm/keeper/bank_extension.go 77.12% <100.00%> (-0.44%) ⬇️

... and 2 files with indirect coverage changes

@k-yang k-yang changed the title fix(bank): update gas invariant to actually charge gas fix(bank): fix gas invariant wrapper to actually charge gas Jan 4, 2025
@Unique-Divine
Copy link
Member

Unique-Divine commented Jan 6, 2025

It is charging gas already. What the function does is only factor in the gas from using the underlying base bank keeper. I don't think you
should remove that. It means the gas cost is consistent regardless of whether the StateDB is nil

@Unique-Divine Unique-Divine enabled auto-merge (squash) January 6, 2025 06:54
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
x/evm/keeper/bank_extension.go (1)

171-173: Consider documenting the gas consumption guarantees

The implementation provides strong guarantees about deterministic gas consumption, which is crucial for blockchain operations. Consider adding documentation that explicitly states:

  1. The gas consumption remains deterministic regardless of StateDB status
  2. The base operation gas is accurately tracked and charged
  3. The infinite gas meter is used safely with proper reconciliation

Add a code comment explaining the gas reconciliation mechanism:

 	ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeter())
+
+	// Track base operation gas consumption separately and reconcile in defer block
+	// to ensure deterministic gas charging regardless of StateDB status

Also applies to: 176-182

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9c3aa0f and 51b8d06.

📒 Files selected for processing (2)
  • CHANGELOG.md (1 hunks)
  • x/evm/keeper/bank_extension.go (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • CHANGELOG.md
🧰 Additional context used
📓 Learnings (1)
x/evm/keeper/bank_extension.go (1)
Learnt from: Unique-Divine
PR: NibiruChain/nibiru#2119
File: x/evm/keeper/bank_extension.go:0-0
Timestamp: 2024-12-06T16:10:34.174Z
Learning: In `x/evm/keeper/bank_extension.go`, assigning a new `GasMeter` to the context within the `NibiruBankKeeper.ForceGasInvariant` function is intentional and acceptable. This ensures that subsequent operations do not affect the parent `ctx`'s gas consumption.
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: integration-tests
🔇 Additional comments (1)
x/evm/keeper/bank_extension.go (1)

171-173: LGTM: Gas meter change prevents panics while maintaining deterministic gas consumption

The switch to infinite gas meter is a valid fix that prevents potential panics during deferred execution while still ensuring deterministic gas consumption through the reconciliation in the defer block. This aligns with the PR objective to fix gas charging behavior.

Let's verify the gas consumption behavior:

✅ Verification successful

Verified: Gas consumption remains deterministic with infinite gas meter

The test suite comprehensively validates that:

  • Gas consumption is properly tracked and measured
  • Operations maintain consistent gas usage across different scenarios
  • The deferred gas reconciliation works correctly
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for any test cases validating gas consumption
rg -A 5 "TestGasConsumed.*" 

Length of output: 2091


Script:

#!/bin/bash
# Description: Check test implementations for gas consumption validation
ast-grep --pattern 'func (s *Suite) TestGasConsumedInvariant$$$($$$) {
  $$$
}'

# Also check the test struct definition
rg "type GasConsumedInvariantScenario struct" -A 10

Length of output: 823


Script:

#!/bin/bash
# Description: Check gas consumption measurement and test execution
rg "gasConsumed.*:=" -B 2 -A 5 x/evm/keeper/bank_extension_test.go
rg "WithGasMeter" -B 2 -A 5 x/evm/keeper/bank_extension_test.go

Length of output: 1602

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