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

[Merged by Bors] - Builder Specs v0.2.0 #3134

Closed

Conversation

realbigsean
Copy link
Member

@realbigsean realbigsean commented Mar 30, 2022

Issue Addressed

#3091

Extends #3062, adding pre-bellatrix block support on blinded endpoints and allowing the normal proposal flow (local payload construction) on blinded endpoints. This resulted in better fallback logic because the VC will not have to switch endpoints on failure in the BN <> Builder API, the BN can just fallback immediately and without repeating block processing that it shouldn't need to. We can also keep VC fallback from the VC<>BN API's blinded endpoint to full endpoint.

Proposed Changes

  • Pre-bellatrix blocks on blinded endpoints
  • Add a new PayloadCache to the execution layer
  • Better fallback-from-builder logic

Todos

  • Remove VC transition logic
  • Add logic to only enable builder flow after Merge transition finalization
  • Tests
  • Fix metrics
  • Rustdocs

@realbigsean realbigsean added work-in-progress PR is a work-in-progress bellatrix Required to support the Bellatrix Upgrade labels Mar 30, 2022
@realbigsean realbigsean mentioned this pull request Mar 30, 2022
14 tasks
@realbigsean realbigsean added ready-for-review The code is ready for review and removed work-in-progress PR is a work-in-progress labels Apr 7, 2022
@realbigsean
Copy link
Member Author

realbigsean commented Apr 7, 2022

This doesn't match the semantics of the upcoming changes to the builder API: flashbots/mev-boost#82

But I think it'd still be worth working towards merging this as is, rather than waiting on the stabilization of that spec if we plan to use the payload cache elsewhere. This also gets us in line with the standard API spec by making sure we can provide pre-bellatrix blocks on blinded endpoints.

@paulhauner
Copy link
Member

There's a conflict here :)

@realbigsean realbigsean added work-in-progress PR is a work-in-progress and removed ready-for-review The code is ready for review labels May 10, 2022
bors bot pushed a commit that referenced this pull request May 12, 2022
## Proposed Changes

Reduce post-merge disk usage by not storing finalized execution payloads in Lighthouse's database.

:warning: **This is achieved in a backwards-incompatible way for networks that have already merged** :warning:. Kiln users and shadow fork enjoyers will be unable to downgrade after running the code from this PR. The upgrade migration may take several minutes to run, and can't be aborted after it begins.

The main changes are:

- New column in the database called `ExecPayload`, keyed by beacon block root.
- The `BeaconBlock` column now stores blinded blocks only.
- Lots of places that previously used full blocks now use blinded blocks, e.g. analytics APIs, block replay in the DB, etc.
- On finalization:
    - `prune_abanonded_forks` deletes non-canonical payloads whilst deleting non-canonical blocks.
    - `migrate_db` deletes finalized canonical payloads whilst deleting finalized states.
- Conversions between blinded and full blocks are implemented in a compositional way, duplicating some work from Sean's PR #3134.
- The execution layer has a new `get_payload_by_block_hash` method that reconstructs a payload using the EE's `eth_getBlockByHash` call.
   - I've tested manually that it works on Kiln, using Geth and Nethermind.
   - This isn't necessarily the most efficient method, and new engine APIs are being discussed to improve this: ethereum/execution-apis#146.
   - We're depending on the `ethers` master branch, due to lots of recent changes. We're also using a workaround for gakonst/ethers-rs#1134.
- Payload reconstruction is used in the HTTP API via `BeaconChain::get_block`, which is now `async`. Due to the `async` fn, the `blocking_json` wrapper has been removed.
- Payload reconstruction is used in network RPC to serve blocks-by-{root,range} responses. Here the `async` adjustment is messier, although I think I've managed to come up with a reasonable compromise: the handlers take the `SendOnDrop` by value so that they can drop it on _task completion_ (after the `fn` returns). Still, this is introducing disk reads onto core executor threads, which may have a negative performance impact (thoughts appreciated).

## Additional Info

- [x] For performance it would be great to remove the cloning of full blocks when converting them to blinded blocks to write to disk. I'm going to experiment with a `put_block` API that takes the block by value, breaks it into a blinded block and a payload, stores the blinded block, and then re-assembles the full block for the caller.
- [x] We should measure the latency of blocks-by-root and blocks-by-range responses.
- [x] We should add integration tests that stress the payload reconstruction (basic tests done, issue for more extensive tests: #3159)
- [x] We should (manually) test the schema v9 migration from several prior versions, particularly as blocks have changed on disk and some migrations rely on being able to load blocks.

Co-authored-by: Paul Hauner <[email protected]>
Copy link
Member

@michaelsproul michaelsproul left a comment

Choose a reason for hiding this comment

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

The review updates so far look good! Once you're happy with it I think we should MERGE 🐼

@realbigsean
Copy link
Member Author

Working on docs and resolving this: #3134 (comment)

But will merge when those things are all set!

@realbigsean realbigsean added ready-for-merge This PR is ready to merge. and removed waiting-on-author The reviewer has suggested changes and awaits thier implementation. labels Jul 29, 2022
@realbigsean
Copy link
Member Author

Added docs and fixed the link check here 84e7f53

Resolved the dependency issue here eda5a5c

So I think we're good to go now 🎉

@paulhauner
Copy link
Member

bors r+

bors bot pushed a commit that referenced this pull request Jul 29, 2022
## Issue Addressed

#3091

Extends #3062, adding pre-bellatrix block support on blinded endpoints and allowing the normal proposal flow (local payload construction) on blinded endpoints. This resulted in better fallback logic because the VC will not have to switch endpoints on failure in the BN <> Builder API, the BN can just fallback immediately and without repeating block processing that it shouldn't need to. We can also keep VC fallback from the VC<>BN API's blinded endpoint to full endpoint.

## Proposed Changes

- Pre-bellatrix blocks on blinded endpoints
- Add a new `PayloadCache` to the execution layer
- Better fallback-from-builder logic

## Todos

- [x] Remove VC transition logic
- [x] Add logic to only enable builder flow after Merge transition finalization
- [x] Tests
- [x] Fix metrics
- [x] Rustdocs


Co-authored-by: Mac L <[email protected]>
Co-authored-by: realbigsean <[email protected]>
@bors
Copy link

bors bot commented Jul 30, 2022

This PR was included in a batch that timed out, it will be automatically retried

bors bot pushed a commit that referenced this pull request Jul 30, 2022
## Issue Addressed

#3091

Extends #3062, adding pre-bellatrix block support on blinded endpoints and allowing the normal proposal flow (local payload construction) on blinded endpoints. This resulted in better fallback logic because the VC will not have to switch endpoints on failure in the BN <> Builder API, the BN can just fallback immediately and without repeating block processing that it shouldn't need to. We can also keep VC fallback from the VC<>BN API's blinded endpoint to full endpoint.

## Proposed Changes

- Pre-bellatrix blocks on blinded endpoints
- Add a new `PayloadCache` to the execution layer
- Better fallback-from-builder logic

## Todos

- [x] Remove VC transition logic
- [x] Add logic to only enable builder flow after Merge transition finalization
- [x] Tests
- [x] Fix metrics
- [x] Rustdocs


Co-authored-by: Mac L <[email protected]>
Co-authored-by: realbigsean <[email protected]>
@paulhauner
Copy link
Member

bors r-

@bors
Copy link

bors bot commented Jul 30, 2022

Canceled.

@paulhauner
Copy link
Member

bors r+

bors bot pushed a commit that referenced this pull request Jul 30, 2022
## Issue Addressed

#3091

Extends #3062, adding pre-bellatrix block support on blinded endpoints and allowing the normal proposal flow (local payload construction) on blinded endpoints. This resulted in better fallback logic because the VC will not have to switch endpoints on failure in the BN <> Builder API, the BN can just fallback immediately and without repeating block processing that it shouldn't need to. We can also keep VC fallback from the VC<>BN API's blinded endpoint to full endpoint.

## Proposed Changes

- Pre-bellatrix blocks on blinded endpoints
- Add a new `PayloadCache` to the execution layer
- Better fallback-from-builder logic

## Todos

- [x] Remove VC transition logic
- [x] Add logic to only enable builder flow after Merge transition finalization
- [x] Tests
- [x] Fix metrics
- [x] Rustdocs


Co-authored-by: Mac L <[email protected]>
Co-authored-by: realbigsean <[email protected]>
@bors bors bot changed the title Builder Specs v0.2.0 [Merged by Bors] - Builder Specs v0.2.0 Jul 30, 2022
@bors bors bot closed this Jul 30, 2022
@realbigsean realbigsean deleted the pre-bellatrix-blinded-blocks branch November 21, 2023 16:16
@jimmygchen jimmygchen mentioned this pull request Nov 22, 2023
3 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bellatrix Required to support the Bellatrix Upgrade ready-for-merge This PR is ready to merge. v2.5.0 Required for Goerli merge release
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants