Skip to content

Builder config flow: per-key config across the three specs - #1

Open
JasonVranek wants to merge 10 commits into
mainfrom
add-config-flow
Open

Builder config flow: per-key config across the three specs#1
JasonVranek wants to merge 10 commits into
mainfrom
add-config-flow

Conversation

@JasonVranek

@JasonVranek JasonVranek commented Jul 29, 2026

Copy link
Copy Markdown
Owner

An implementer-facing explainer of how per-key builder configuration flows across the keymanager, beacon (produceBlockV4), and builder-API specs, organized from the simplest config up.

The three PRs it traces:

Posted for review: comments on any line welcome.

Comment thread builder-config-flow.md Outdated
Comment on lines +54 to +59
A key that only ever builds locally. To guarantee this regardless of how the validator client is globally
configured, set `enabled: false` at the keymanager; it overrides any global builder setup for this key:

```jsonc
// keymanager POST body
{ "enabled": false }

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

what about p2p bids, there is currently no way for the validator client to communicate to the beacon node that it does not accept p2p bids, but I am unsure there should even be such an option

@nflaig nflaig left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Looks pretty good and complete to me, left few remarks, also to remind myself later

Comment thread builder-config-flow.md
Comment on lines +69 to +70
external payload under any circumstances also sets `min_bid` (the bid floor, detailed in Example 2) to its
maximum, so every bid dies at the floor even when the local build fails.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I still haven't gotten feedback from staking pools if that's something they will need, but yes, effectively setting min_bid=2**64 - 1 should disable p2p bids, and then operators can override for direct builders in builders. but I like this lever much better as what we had before, generally, and ideally, p2p bids should always be used as a fallback unless the global circuit breaker is active

Comment thread builder-config-flow.md
The staking software `POST`s this `BuilderConfig` to the VC at `/eth/v1/validator/{pubkey}/builders` (`202`). The submission **replaces** the key's
stored config in full; the server does not merge with what was there before. Note what is absent from the
entry: no `auth_data`, no `builder_pubkeys`, no per-entry `min_bid` or `builder_boost_factor`. These are
optional in the keymanager body, and the VC resolves each before anything reaches the beacon node.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I am suspecting every client will add this, but for most operators simply setting global values via CLI should be sufficient, eg. --builder.urls, --builder.minBid, --builder.boostFactor, etc., for more advanced use case the keymanager api can come in, or a more complex proposer settings file (to be standardized)

also client will have "baked in" defaults, so really only setting builder urls should work for most users

Comment thread builder-config-flow.md Outdated

- `min_bid`, `builder_boost_factor`: an omitted entry value inherits this key's `BuilderConfig` default, and
if that is unset too, the VC's own configuration.
- `max_execution_payment`, `auth_data`: an omitted entry value inherits the VC's own configuration directly;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

for auth_data shouldn't this just default to url as described above? I wouldn't know what auth_data a vc would set, so this doesn't make much sense unless I am misreading this

Comment thread builder-config-flow.md Outdated

When omitted, `auth_data` is VC-derived from the URL (the SHOULD convention from Example 3: UTF-8 bytes of the
URL exactly as advertised, hex-encoded). "Exactly as advertised" is the canonicalization rule (no
normalization); any divergence between what the VC signs and what the builder expects is a `400` at the

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

should it be a 401 in that case?

Suggested change
normalization); any divergence between what the VC signs and what the builder expects is a `400` at the
normalization); any divergence between what the VC signs and what the builder expects is a `401` at the

Comment thread builder-config-flow.md

### Omitted `auth_data`

When omitted, `auth_data` is VC-derived from the URL (the SHOULD convention from Example 3: UTF-8 bytes of the

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I didn't quite follow that discussion but there was a canonicalize , what was the reason for removing that?

ethereum/builder-specs@3dadb3a#diff-1ff3c0eb83225c30771ba8f5694ee3bfaf84f326a2638575b8b231aad9934255R178-R191

I don't think this will be a problem, but if there is a trailing / for example that shouldn't be there, could it cause auth issues?

Comment thread builder-config-flow.md
// three keymanager requests, one per stored state
{ } // omit builders: follow the VC's global config
{ "builders": [] } // builders: []: no builder-API bids, p2p only
{ "builders": [], "builder_boost_factor": "0" } // local-preferred (Example 1)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

could add another example for "local only"

{ "builders": [], "min_bid": "2**64 - 1" }

Comment thread builder-config-flow.md Outdated
Comment on lines +410 to +411
per-proposer-key. Which cap is communicated to a builder reachable at two URLs with two different caps is not
pinned; the per-entry cap is the authoritative BN backstop regardless.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

why is that a open question? if it's 2 different urls you just handle them as 2 different builders, each having their own max_execution_payment?

Comment thread builder-config-flow.md Outdated
Comment on lines +412 to +414
- **The local build's value.** Selection has a bid "compete with the local build" and the local build win a
tie, but how the BN derives the local build's value (and in what units it compares) is a BN-internal the
beacon spec does not pin.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

worth point out that this is on the execution apis spec

https://github.com/ethereum/execution-apis/blob/742d45db810b31265c8d3c075af324953330d1ed/src/engine/amsterdam.md?plain=1#L144

blockValue : QUANTITY, 256 Bits - The expected value to be received by the feeRecipient in wei

Comment thread builder-config-flow.md Outdated
Comment on lines +417 to +418
- **Boost overflow and builder-vs-builder ties.** The boost's overflow bound (saturate to what type?) and the
tie-break between two equal top *builder* bids are not pinned; only the local-vs-builder tie is.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

do we just pick the bid from the builder which was received first/earlier?

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