Skip to content

feat(cli)!: configure ProverServices with a prover block instead of type: remote - #1559

Merged
gjermundgaraba merged 7 commits into
mainfrom
gjermundgaraba/cli-prover-url
Oct 26, 2026
Merged

gjermundgaraba merged 7 commits into
mainfrom
gjermundgaraba/cli-prover-url

Conversation

@gjermundgaraba

@gjermundgaraba gjermundgaraba commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Description

Selecting a remote prover previously replaced the configured light-client type with remote, forcing deployment config merging to skip its client-type consistency check. This change keeps the declared client type and moves the prover endpoint into a separate remoteProver block, so the same manifest comparison applies to local and remote proving:

# before                            # after
type: "remote"                      type: "besu-qbft"   # or any type, e.g. "op-stack"
params:                             remoteProver:
  url: https://prover.example.com     url: https://prover.example.com
  tls:                                tls:
    caFile: /etc/ibc/tls/ca.crt         caFile: /etc/ibc/tls/ca.crt

Why this is useful

  • Consistent deployment checks. When merging an existing connection, ibc deploy render-config compares each declared client type with the deployment manifest and rejects a mismatch. Remote proving no longer needs an exemption. This compares configuration records; it does not verify the type against the chain or the ProverService.
  • Metrics keep the declared client type. Remotely proven ends carry their configured type instead of all being labelled type=remote.
  • Less config machinery. Removing params, whose only settings were the remote URL and TLS options, also removes the empty per-type structs, interface methods and decoder.
  • Shared endpoint handling. Provers reuse remote-attestor URL/TLS helpers: bare host:port uses HTTP, https:// enables TLS, and other URL schemes fail validation.

The prover interface, the ProverService proto and the relay pipeline are unchanged.

The docs generator now marks a key that is required inside a block the file can leave out as "required in <block>" (today only remoteProver.url), so the configuration reference no longer suggests every client end needs a remoteProver. Its unused OPAQUE_TYPES hook, which only served params, is removed.

Most important to review: cli/internal/config/relayer.go (fields and validation) and cli/internal/relay/prover/prover.go (newProver).

closes: FOU-1893

This came out of FOU-1699, which was closed without adopting its trusted-height parameter; this is the config cleanup from that work.

Breaking changes

  • type: remote with params is replaced by the client's declared light-client type plus a remoteProver block with the same url and tls keys. Without a remoteProver, type must be attestation or besu-qbft; with one, any non-empty type is accepted.
  • The params block is removed. An old params: key now fails to load as an unknown field.
  • A remoteProver.url with a scheme other than http or https is rejected.
  • The prover metrics type label for ProverService-backed ends is the declared client type instead of remote.

Validation

  • go test ./... in cli passes on this commit. refgen --check reports the docs up to date.
  • golangci-lint run (Go 1.26.9) reports no issues.
  • e2e: TestRemoteProver_* (3) pass on the latest commit. The Besu QBFT tests (TestDeployBesuQBFTConnection, TestTransferBesuQBFT_AutoRelay, TestTransferBesuQBFT_TimeoutRefund) passed in complete mode before the rebase onto feat: Add TLS support #1503 (TLS) and the later config edits. The fast suite has not been rerun since.
  • docs/6-ibc-cli/tools/test-refgen-e2e.py: 67 passed, including a new case for the "required in remoteProver" rendering.
  • docs/6-ibc-cli/tools/test-refgen.py: 88 passed, 1 failed. The failure is on TLSClientConfig, as on main since feat: Add TLS support #1503; nothing in this PR adds to it.

  • Linked to GitHub issue with discussion and accepted design, OR link to spec that describes this work. Linear FOU-1893.
  • Include changelog entry when appropriate (e.g. chores should be omitted from changelog). n/a: CHANGELOG.md does not track CLI changes yet.
  • Wrote unit and e2e tests if relevant. Config validation and prover setup unit tests; the e2e harness now writes a remoteProver block.
  • Updated documentation (docs/) if anything is changed. Configuration reference regenerated, with a hand-written paragraph on remoteProver below the connections table; Besu light client page and otel README updated.
  • Added godoc comments if relevant.
  • Self-reviewed Files changed in the GitHub PR explorer.
  • Provide a conventional commit message to follow the repository standards.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

Vulnerable dependencies

2 advisories across 2 libraries need attention, 2 accepted.

🚨 Needs attention

github.com/cosmos/evm

In use: v0.7.3 — reached from e2e

Advisory CVE Fixed in Summary
GO-2025-3684 — no fix yet Cosmos EVM Allows Partial Precompile State Writes in github.com/cosmos/evm

Go standard library

In use: go1.26.9 — reached from cli, e2e, gen/go/solidity-abi

Advisory CVE Fixed in Summary
GO-2026-6809 CVE-2026-111943 go1.26.10 Distrust compromised intermediate certificates in crypto/x509

Run make vulncheck for the call paths. Either upgrade the library, or add the
advisory to .govulncheck-ignore with a reason if no fix exists yet.

Accepted

Listed in .govulncheck-ignore with a reason.

github.com/pion/dtls/v2

In use: v2.2.12 — reached from cli

Advisory CVE Fixed in Summary
GO-2026-4479 CVE-2026-26014 no fix yet Usage of random nonce generation with AES GCM ciphers risks leaking the authentication key in github.com/pion/dtls

golang.org/x/crypto

In use: v0.57.0 — reached from cli, e2e

Advisory CVE Fixed in Summary
GO-2026-5932 — no fix yet The golang.org/x/crypto/openpgp package is unmaintained, unsafe by design, and has known security issues

From make vulncheck-json on this run: logs.

@linear-code

linear-code Bot commented Oct 14, 2026

Copy link
Copy Markdown

FOU-1893

@gjermundgaraba
gjermundgaraba force-pushed the gjermundgaraba/cli-prover-url branch from 06de56d to c06e76b Compare October 15, 2026 15:37
@gjermundgaraba gjermundgaraba changed the title feat(cli)!: configure ProverServices with proverUrl instead of type: remote feat(cli)!: configure ProverServices with a prover block instead of type: remote Oct 15, 2026

@gjermundgaraba gjermundgaraba left a comment •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

...

@gjermundgaraba
gjermundgaraba force-pushed the gjermundgaraba/cli-prover-url branch from 7061a67 to 0274e49 Compare October 20, 2026 06:58
@gjermundgaraba
gjermundgaraba marked this pull request as ready for review October 20, 2026 08:15
@gjermundgaraba
gjermundgaraba requested a review from a team as a code owner October 20, 2026 08:15
@greptile-apps

greptile-apps Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 5/5

[Medium impact] The PR appears safe to merge.

Summary

Moves remote proving from type: remote and params into remoteProver, while keeping the declared light-client type.

  • A client keeps its on-chain type while remoteProver chooses who generates its proofs.
  • Deployment config keeps and checks each client's declared type.
  • Prover metrics label work with the client's declared type.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[Client end] --> B{remoteProver present?}
  B -->|Yes| C[Resolve endpoint and TLS]
  C --> D[Remote ProverService]
  B -->|No| E[Select built-in prover by type]
  D --> F[Record metrics with declared client type]
  E --> F
Loading

Reviews (2) · Last reviewed commit: "refactor(cli)!: name the ProverService b..." · Reviewed by Greptile

@dianab-cl

Copy link
Copy Markdown
Contributor

DCO Sign-off not found

@gjermundgaraba
gjermundgaraba force-pushed the gjermundgaraba/cli-prover-url branch 3 times, most recently from 2414317 to 2695d15 Compare October 20, 2026 18:45
Comment thread cli/internal/config/relayer.go Outdated
dhfang
dhfang previously approved these changes Oct 21, 2026
@gjermundgaraba

Copy link
Copy Markdown
Contributor Author

@greptile review

dianab-cl
dianab-cl previously approved these changes Oct 22, 2026
@gjermundgaraba
gjermundgaraba added this pull request to the merge queue Oct 22, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 22, 2026
@gjermundgaraba
gjermundgaraba force-pushed the gjermundgaraba/cli-prover-url branch 2 times, most recently from 86ee9cf to 4908e10 Compare October 22, 2026 19:19
…remote

A client end's type now always names its on-chain light client. A
ProverService is selected with a separate proverUrl, with proverTls for
an https:// one, so a besu-qbft or attestation end can be proven
remotely without losing its type, and a light client the CLI does not
implement is declared with any type plus a proverUrl.

This removes the remote exception from deployment config merging, labels
prover metrics with the real client type, and drops the params block,
which only the remote type used. proverUrl follows the same address
rules as a remote attestor's grpc: a bare host:port is dialed as
http://, and https:// turns TLS on.

Signed-off-by: Gjermund Garaba <gjermund@garaba.net>
proverUrl and proverTls become prover.url and prover.tls, so a client
end's ProverService validates and resolves through the same helpers as
remote attestors and signers, and a bad TLS block reports the same path
at validation and at startup. The attestor and the prover share
checkEndpointAddr for their address rules.

ClientEnd.Type becomes a plain string: with a prover it accepts any
value, so the generated reference lists it as a string instead of the
built-in types alone.

Signed-off-by: Gjermund Garaba <gjermund@garaba.net>
…nal prover

- Use config's client type constants directly; the deploy aliases only
  re-exported them.
- Rename the prover metrics field to clientType, which it now holds.
- Cover that reconciling a deployment keeps an operator's prover block.
- refgen: a key required inside a block the file can omit renders as
  "required in `<block>`", so prover.url no longer reads as required on
  every client end. Remove the unused OPAQUE_TYPES hook.
- Explain the prover block beside the connections table.

Signed-off-by: Gjermund Garaba <gjermund@garaba.net>
Signed-off-by: Gjermund Garaba <gjermund@garaba.net>
Signed-off-by: Gjermund Garaba <gjermund@garaba.net>
Signed-off-by: Gjermund Garaba <gjermund@garaba.net>
@gjermundgaraba
gjermundgaraba force-pushed the gjermundgaraba/cli-prover-url branch from 4908e10 to 747dc89 Compare October 22, 2026 20:10
@gjermundgaraba
gjermundgaraba added this pull request to the merge queue Oct 26, 2026
Merged via the queue into main with commit e678746 Oct 26, 2026
20 of 21 checks passed
@gjermundgaraba
gjermundgaraba deleted the gjermundgaraba/cli-prover-url branch October 26, 2026 10:32
dianab-cl added a commit that referenced this pull request Oct 26, 2026
…ype: remote (#1559)

* feat(cli)!: configure ProverServices with proverUrl instead of type: remote

A client end's type now always names its on-chain light client. A
ProverService is selected with a separate proverUrl, with proverTls for
an https:// one, so a besu-qbft or attestation end can be proven
remotely without losing its type, and a light client the CLI does not
implement is declared with any type plus a proverUrl.

This removes the remote exception from deployment config merging, labels
prover metrics with the real client type, and drops the params block,
which only the remote type used. proverUrl follows the same address
rules as a remote attestor's grpc: a bare host:port is dialed as
http://, and https:// turns TLS on.

Signed-off-by: Gjermund Garaba <gjermund@garaba.net>

* refactor(cli)!: nest the ProverService endpoint in a prover block

proverUrl and proverTls become prover.url and prover.tls, so a client
end's ProverService validates and resolves through the same helpers as
remote attestors and signers, and a bad TLS block reports the same path
at validation and at startup. The attestor and the prover share
checkEndpointAddr for their address rules.

ClientEnd.Type becomes a plain string: with a prover it accepts any
value, so the generated reference lists it as a string instead of the
built-in types alone.

Signed-off-by: Gjermund Garaba <gjermund@garaba.net>

* refactor(cli): drop deploy client-type aliases and document the optional prover

- Use config's client type constants directly; the deploy aliases only
  re-exported them.
- Rename the prover metrics field to clientType, which it now holds.
- Cover that reconciling a deployment keeps an operator's prover block.
- refgen: a key required inside a block the file can omit renders as
  "required in `<block>`", so prover.url no longer reads as required on
  every client end. Remove the unused OPAQUE_TYPES hook.
- Explain the prover block beside the connections table.

Signed-off-by: Gjermund Garaba <gjermund@garaba.net>

* docs(cli): fix the ProverConfig doc comment

Signed-off-by: Gjermund Garaba <gjermund@garaba.net>

* docs(cli): drop the stale params.url generator-gap note

Signed-off-by: Gjermund Garaba <gjermund@garaba.net>

* refactor(cli)!: name the ProverService block remoteProver

Signed-off-by: Gjermund Garaba <gjermund@garaba.net>

---------

Signed-off-by: Gjermund Garaba <gjermund@garaba.net>
Co-authored-by: dianab-cl <diana@cosmoslabs.io>
Signed-off-by: Diana Borbe <diana@cosmoslabs.io>
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.

3 participants