core/consensus: fix qbft optimistic first qcommit - #4622
Conversation
There was a problem hiding this comment.
🟡 Changes recommended
The new commit-round selection helper is order-dependent and can be influenced by attacker-controlled justification ordering, potentially skewing leader attribution or causing panics; it should be made robust before approval.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Pull request overview
This PR hardens the QBFT “optimistic” decided-path to ensure the decided value is derived from the actually-agreed value hash rather than assuming qcommit[0] is valid, preventing invalid/malicious qcommit ordering from influencing decision handling.
Changes:
- Track and resend the decided value explicitly in
core/qbft(avoid usingqCommit[0].Value()). - Thread the agreed value hash into the consensus-layer decide callback and use it to resolve the decided value from the values map.
- Add an internal regression test ensuring extra non-matching COMMITs in
MsgDecidedjustification don’t affect the decided value.
File summaries
| File | Description |
|---|---|
| core/qbft/qbft.go | Stores the agreed qcommit value separately and uses it when rebroadcasting MsgDecided. |
| core/consensus/qbft/qbft.go | Extends the decide callback to include the agreed value hash; uses it when extracting the decided value; adds helper for commit-round selection. |
| core/consensus/qbft/sniffed_internal_test.go | Updates test callback signature to match the new decide callback shape. |
| core/consensus/qbft/qbft_internal_test.go | Adds a regression test for decided justification containing extra non-matching commits. |
Review details
- Files reviewed: 4/4 changed files
- Comments generated: 2
- Review effort level: Lite
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
There was a problem hiding this comment.
🟡 Changes recommended
The consensus Decide implementation can still be DoS’d by relying on qcommit[0] for the Values() map, allowing an attacker-controlled first commit to suppress delivery of an already-decided value.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Review details
Suppressed comments (1)
core/consensus/qbft/qbft.go:66
- Decide still relies on
qcommit[0]to supply theValues()map. If a byzantine peer can get a COMMIT at index 0 whosevaluesmap omits the agreedvalueHash(while other commits include it), this will return early and prevent subscribers from receiving the decided value. Prefer looking upvalueHashacross the qcommit messages rather than assuming index 0 is suitable.
msg, ok := qcommit[0].(Msg)
if !ok {
log.Error(ctx, "Internal error: Invalid message type in qcommit. This indicates a consensus protocol bug that should be reported", nil, z.Str("got_type", fmt.Sprintf("%T", qcommit[0])))
return
- Files reviewed: 6/6 changed files
- Comments generated: 0 new
- Review effort level: Lite
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #4622 +/- ##
==========================================
+ Coverage 57.73% 57.91% +0.18%
==========================================
Files 246 246
Lines 33993 33994 +1
==========================================
+ Hits 19625 19687 +62
+ Misses 11905 11836 -69
- Partials 2463 2471 +8 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
🟡 Changes recommended
The newly added regression test has compile-time issues (invalid []byte→[32]byte conversion and int64 slice indexing) that must be fixed before merging.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Review details
- Files reviewed: 6/6 changed files
- Comments generated: 1
- Review effort level: Lite
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
|
There was a problem hiding this comment.
🟡 Changes recommended
The PR description indicates the linter currently fails on this branch and needs a rebase (after #4619) to restore a green build before approval.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Review details
- Files reviewed: 6/6 changed files
- Comments generated: 0 new
- Review effort level: Lite
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
There was a problem hiding this comment.
🟡 Changes recommended
The new tests currently don’t compile because an int64 proto peer index is used directly as a slice index (p2pkeys[j.GetPeerIdx()]).
Once you've addressed the issues Copilot identified, you can request another Copilot review.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Review details
Suppressed comments (1)
core/consensus/qbft/qbft_internal_test.go:1114
- This won’t compile:
p2pkeysis a[]*k1.PrivateKey(fromcluster.NewForT), butj.GetPeerIdx()isint64and can’t be used as a slice index. Convert the peer index tointbefore indexing (optionally with bounds checks if you want extra safety in these adversarial tests).
for _, j := range justification {
resignedJust = append(resignedJust, signForDuty(
p2pkeys[j.GetPeerIdx()],
qbft.MsgType(j.GetType()),
j.GetPeerIdx(),
- Files reviewed: 6/6 changed files
- Comments generated: 0 new
- Review effort level: Lite
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
* docs: refresh stale architecture and structure docs (#4580) * docs: refresh stale architecture and structure docs Update docs/architecture.md and docs/structure.md to match the current implementation: fix component interfaces to match core/interfaces.go, remove the nonexistent Signer/remote-signer component, correct the BFT fault tolerance formula, document the consensus controller and priority protocol, replace outdated DutyDB/ParSigDB data models, refresh the validator API endpoint list, and add a duty lifecycle table and supporting components section. Update the project structure doc with current packages and CLI commands. category: docs ticket: none Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: align CLAUDE.md architecture summary with refreshed docs Mention the pluggable consensus controller, correct the Priority and peer discovery descriptions, and add the InclusionChecker. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Small rephrases * Add per-duty workflow * Simplify Charon cluster diagram; migrate core workflow to mermaid --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: kalo <24719519+KaloyanTanev@users.noreply.github.com> * Fix exchanger deadlock during partial signature exchange (#4590) * *: opt in for incomplete validator_keys (#4591) * Opt in for incomplete validator_keys * Strict unique validator keys * Other small improvements * build(deps): Bump the go-dependencies group with 3 updates (#4593) Bumps the go-dependencies group with 3 updates: [golang.org/x/sync](https://github.com/golang/sync), [golang.org/x/term](https://github.com/golang/term) and [golang.org/x/text](https://github.com/golang/text). Updates `golang.org/x/sync` from 0.21.0 to 0.22.0 - [Commits](golang/sync@v0.21.0...v0.22.0) Updates `golang.org/x/term` from 0.44.0 to 0.45.0 - [Commits](golang/term@v0.44.0...v0.45.0) Updates `golang.org/x/text` from 0.39.0 to 0.40.0 - [Release notes](https://github.com/golang/text/releases) - [Commits](golang/text@v0.39.0...v0.40.0) --- updated-dependencies: - dependency-name: golang.org/x/sync dependency-version: 0.22.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-dependencies - dependency-name: golang.org/x/term dependency-version: 0.45.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-dependencies - dependency-name: golang.org/x/text dependency-version: 0.40.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-dependencies ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): Bump the docker-dependencies group across 2 directories with 1 update (#4594) Bumps the docker-dependencies group with 1 update in the / directory: golang. Bumps the docker-dependencies group with 1 update in the /testutil/promrated directory: golang. Updates `golang` from 1.26.4-trixie to 1.26.5-trixie Updates `golang` from 1.26.4-trixie to 1.26.5-trixie Updates `golang` from 1.26.4-alpine to 1.26.5-alpine Updates `golang` from 1.26.4-alpine to 1.26.5-alpine --- updated-dependencies: - dependency-name: golang dependency-version: 1.26.5-trixie dependency-type: direct:production update-type: version-update:semver-patch dependency-group: docker-dependencies - dependency-name: golang dependency-version: 1.26.5-trixie dependency-type: direct:production update-type: version-update:semver-patch dependency-group: docker-dependencies - dependency-name: golang dependency-version: 1.26.5-alpine dependency-type: direct:production update-type: version-update:semver-patch dependency-group: docker-dependencies - dependency-name: golang dependency-version: 1.26.5-alpine dependency-type: direct:production update-type: version-update:semver-patch dependency-group: docker-dependencies ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): Bump the go-dependencies group with 3 updates (#4595) Bumps the go-dependencies group with 3 updates: [golang.org/x/crypto](https://github.com/golang/crypto), [golang.org/x/net](https://github.com/golang/net) and [golang.org/x/tools](https://github.com/golang/tools). Updates `golang.org/x/crypto` from 0.53.0 to 0.54.0 - [Commits](golang/crypto@v0.53.0...v0.54.0) Updates `golang.org/x/net` from 0.56.0 to 0.57.0 - [Commits](golang/net@v0.56.0...v0.57.0) Updates `golang.org/x/tools` from 0.47.0 to 0.48.0 - [Release notes](https://github.com/golang/tools/releases) - [Commits](golang/tools@v0.47.0...v0.48.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-version: 0.54.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-dependencies - dependency-name: golang.org/x/net dependency-version: 0.57.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-dependencies - dependency-name: golang.org/x/tools dependency-version: 0.48.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-dependencies ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fix potential code injection (#4598) * *: fetch latest versions release notes (#4597) * Fetch latest versions on minor releases for compatibility matrix * Fix auth style * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Signed-off-by: kalo <24719519+KaloyanTanev@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Signed-off-by: kalo <24719519+KaloyanTanev@users.noreply.github.com> --------- Signed-off-by: kalo <24719519+KaloyanTanev@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * p2p: fix flaky TestWithReceiveTimeout on QUIC (#4606) The zero receive timeout makes the server close the stream almost immediately, racing the client's request write. On TCP the close is a graceful FIN, so the write always lands and the failure surfaces as an EOF on the response read. QUIC instead resets the stream, which can abort the write already in flight, failing with "write request: stream reset (remote)" before the read is ever reached. Accept either error on the QUIC iteration. The TCP iteration stays strict. category: test ticket: none * Increase sync message deadline to a slot duration (#4610) * build(deps): Bump google.golang.org/grpc from 1.81.1 to 1.82.1 (#4608) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.81.1 to 1.82.1. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](grpc/grpc-go@v1.81.1...v1.82.1) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-version: 1.82.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): Bump github.com/google/cel-go from 0.28.1 to 0.29.0 (#4609) Bumps [github.com/google/cel-go](https://github.com/google/cel-go) from 0.28.1 to 0.29.0. - [Release notes](https://github.com/google/cel-go/releases) - [Commits](cel-expr/cel-go@v0.28.1...v0.29.0) --- updated-dependencies: - dependency-name: github.com/google/cel-go dependency-version: 0.29.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): Bump the go-dependencies group across 1 directory with 5 updates (#4607) Bumps the go-dependencies group with 4 updates in the / directory: [github.com/attestantio/go-builder-client](https://github.com/attestantio/go-builder-client), [github.com/ethereum/go-ethereum](https://github.com/ethereum/go-ethereum), [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) and [github.com/bufbuild/buf](https://github.com/bufbuild/buf). Updates `github.com/attestantio/go-builder-client` from 0.7.2 to 0.8.0 - [Changelog](https://github.com/attestantio/go-builder-client/blob/master/CHANGELOG.md) - [Commits](attestantio/go-builder-client@v0.7.2...v0.8.0) Updates `github.com/ethereum/go-ethereum` from 1.17.4 to 1.17.5 - [Release notes](https://github.com/ethereum/go-ethereum/releases) - [Commits](ethereum/go-ethereum@v1.17.4...v1.17.5) Updates `github.com/golang/snappy` from 1.0.0 to 1.0.1-0.20260716114414-9ae09f520e93 - [Release notes](https://github.com/golang/snappy/releases) - [Commits](https://github.com/golang/snappy/commits) Updates `github.com/prometheus/client_golang` from 1.23.2 to 1.24.1 - [Release notes](https://github.com/prometheus/client_golang/releases) - [Changelog](https://github.com/prometheus/client_golang/blob/v1.24.1/CHANGELOG.md) - [Commits](prometheus/client_golang@v1.23.2...v1.24.1) Updates `github.com/bufbuild/buf` from 1.71.0 to 1.72.0 - [Release notes](https://github.com/bufbuild/buf/releases) - [Changelog](https://github.com/bufbuild/buf/blob/main/CHANGELOG.md) - [Commits](bufbuild/buf@v1.71.0...v1.72.0) --- updated-dependencies: - dependency-name: github.com/attestantio/go-builder-client dependency-version: 0.8.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-dependencies - dependency-name: github.com/bufbuild/buf dependency-version: 1.72.0 dependency-type: indirect update-type: version-update:semver-minor dependency-group: go-dependencies - dependency-name: github.com/ethereum/go-ethereum dependency-version: 1.17.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-dependencies - dependency-name: github.com/golang/snappy dependency-version: 1.0.1-0.20260716114414-9ae09f520e93 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-dependencies - dependency-name: github.com/prometheus/client_golang dependency-version: 1.24.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-dependencies ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * *: harden partial signature exchange (#4599) Bind partial signatures received during the DKG lock-hash exchange to their authenticated sender: a peer may only contribute partial signatures under its own assigned share index. parsigex.handle now passes the authenticated sender to the verify function; the core workflow verifier ignores it, since those partial signatures are already verified cryptographically against the pubshare for the claimed share index. The DKG exchanger keys the binding on each peer's assigned share index via a peer map, so it stays correct when share indices are not contiguous with peer positions, such as after operators are removed. newExchanger validates its peer index and peer map up front and returns an error on a misconfigured map instead of silently timing out. category: bug ticket: none * core/priority: add leading slash to protocol ID (#4605) Normalise the priority protocol ID to /charon/priority/2.0.0, matching every other charon libp2p protocol. The wire format is unchanged, so the version stays at 2.0.0 and the old spelling is kept as a legacy alias so that patched and unpatched nodes interoperate. Nodes now offer both IDs when dialling, preferring the slash-prefixed one, and serve both via separate exact-match handler registrations. The two IDs share no common prefix, so registering them in a single RegisterHandler call would collapse protocolPrefix to the bare wildcard "*" and advertise that to peers via libp2p identify instead of the real protocol IDs. category: refactor ticket: none * core/priority: use stable sort for scored priorities (#4611) Replace slices.SortFunc with slices.SortStableFunc when ordering scored priorities so that equal-score priorities keep first-seen order, with messages processed in ascending peer ID order. Go's sort is unstable for slices longer than ~12 elements, so the equal-score order depended on the sort implementation and could diverge across versions and other implementations. Add a regression test with 24 priorities where tied pairs arrive out of score order. category: bug ticket: none * *: sync contributions per subcommittee (#4602) * Sync contributions per subcommittee * Gate behind info sync * Check for 0 value division * Add more tests * Optimise sync contribution fetching (#4615) * dkg: fail fast on peer restart or death during ceremonies (#4616) * harden dkg * dkg/sync: harden step tracking against invalid peers Only track sync steps of peers that passed request validation, so an invalid peer cannot influence step state or overwrite the recorded fatal error. Reword the restart error since not every step inconsistency is strictly a peer restart. * build(deps): Bump github.com/pion/stun/v3 from 3.1.2 to 3.1.5 (#4614) Bumps [github.com/pion/stun/v3](https://github.com/pion/stun) from 3.1.2 to 3.1.5. - [Release notes](https://github.com/pion/stun/releases) - [Commits](pion/stun@v3.1.2...v3.1.5) --- updated-dependencies: - dependency-name: github.com/pion/stun/v3 dependency-version: 3.1.5 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): Bump github.com/quic-go/webtransport-go (#4612) Bumps [github.com/quic-go/webtransport-go](https://github.com/quic-go/webtransport-go) from 0.10.0 to 0.11.1. - [Release notes](https://github.com/quic-go/webtransport-go/releases) - [Commits](quic-go/webtransport-go@v0.10.0...v0.11.1) --- updated-dependencies: - dependency-name: github.com/quic-go/webtransport-go dependency-version: 0.11.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Close streams on all SendReceive and Send paths (#4626) * Add 1MB limit to the peer info messages (#4625) * Fix proposer short second round (#4623) * core/qbft: prevent double PREPARE on equivocating leader (#4624) * Prevent double-PREPARE on equivocating leader PRE-PREPARE * Improve tests * Remove legacy unversioned attestations (#4621) * Reject lock with validator count mismatch with definition (#4620) * core/qbft: reject zero-value PRE-PREPARE from leader (#4619) * Reject zero-value PRE-PREPARE from leader * Avoid closing channel while QBFT goroutine is running * Fix flaky peer death DKG test (#4627) * core/consensus: fix qbft optimistic first qcommit (#4622) * Fix optimistic QBFT using qcommit[0] rather than verifying it includes the actual correct value * Use qCommitValue, rather than qcommit[0] in commit/decide * Thread decided round through Decide callback * Fix potential test flakiness * Improve qbft unit testing * Rotate PAT (#4596) * *: fix libp2p logger routing (#4629) * Fix libp2p logger routing * Avoid per-record lock in libp2p slog handler * core/qbft: preserve local value on comparison failure (#4628) * Preserve the already fetched value for comparing between the rounds * Fix clock in tests * ci: fix sonarcloud supply-chain vulnerabilities (#4631) - Add --only-binary :all: to pip install in kurtosis smoke test to prevent execution of setup.py scripts from source distributions. - Use go install tool for govulncheck so versions resolve from the go.mod/go.sum lockfile instead of fetching unpinned transitive deps. * build(deps): Bump the go-dependencies group across 1 directory with 7 updates (#4633) Bumps the go-dependencies group with 5 updates in the / directory: | Package | From | To | | --- | --- | --- | | [github.com/showwin/speedtest-go](https://github.com/showwin/speedtest-go) | `1.7.10` | `1.7.11` | | [go.opentelemetry.io/otel](https://github.com/open-telemetry/opentelemetry-go) | `1.44.0` | `1.45.0` | | [go.opentelemetry.io/otel/exporters/otlp/otlptrace](https://github.com/open-telemetry/opentelemetry-go) | `1.44.0` | `1.45.0` | | [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc](https://github.com/open-telemetry/opentelemetry-go) | `1.44.0` | `1.45.0` | | [go.opentelemetry.io/otel/exporters/stdout/stdouttrace](https://github.com/open-telemetry/opentelemetry-go) | `1.44.0` | `1.45.0` | Updates `github.com/showwin/speedtest-go` from 1.7.10 to 1.7.11 - [Release notes](https://github.com/showwin/speedtest-go/releases) - [Changelog](https://github.com/showwin/speedtest-go/blob/master/docs/release.md) - [Commits](showwin/speedtest-go@v1.7.10...v1.7.11) Updates `go.opentelemetry.io/otel` from 1.44.0 to 1.45.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](open-telemetry/opentelemetry-go@v1.44.0...v1.45.0) Updates `go.opentelemetry.io/otel/exporters/otlp/otlptrace` from 1.44.0 to 1.45.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](open-telemetry/opentelemetry-go@v1.44.0...v1.45.0) Updates `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc` from 1.44.0 to 1.45.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](open-telemetry/opentelemetry-go@v1.44.0...v1.45.0) Updates `go.opentelemetry.io/otel/exporters/stdout/stdouttrace` from 1.44.0 to 1.45.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](open-telemetry/opentelemetry-go@v1.44.0...v1.45.0) Updates `go.opentelemetry.io/otel/sdk` from 1.44.0 to 1.45.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](open-telemetry/opentelemetry-go@v1.44.0...v1.45.0) Updates `go.opentelemetry.io/otel/trace` from 1.44.0 to 1.45.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](open-telemetry/opentelemetry-go@v1.44.0...v1.45.0) --- updated-dependencies: - dependency-name: github.com/showwin/speedtest-go dependency-version: 1.7.11 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-dependencies - dependency-name: go.opentelemetry.io/otel dependency-version: 1.45.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-dependencies - dependency-name: go.opentelemetry.io/otel/exporters/otlp/otlptrace dependency-version: 1.45.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-dependencies - dependency-name: go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc dependency-version: 1.45.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-dependencies - dependency-name: go.opentelemetry.io/otel/exporters/stdout/stdouttrace dependency-version: 1.45.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-dependencies - dependency-name: go.opentelemetry.io/otel/sdk dependency-version: 1.45.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-dependencies - dependency-name: go.opentelemetry.io/otel/trace dependency-version: 1.45.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-dependencies ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * app/peerinfo: add dv_type field to peerinfo protocol (#4632) * app/peerinfo: add dv_type field to peerinfo protocol Add a dv_type field to the PeerInfo protobuf message so DV client implementations can identify themselves. Charon sets this to "charon". Non-charon peers (e.g. Pluto) skip the SemVer compatibility check since the supported version list only applies to Charon releases. Empty dv_type (from older Charon nodes) defaults to "charon" for backwards compatibility. Also adds an app_peerinfo_dv_type Prometheus metric with {peer, dv_type} labels for dashboard visibility. category: feature ticket: none * docs: regenerate metrics reference for dv_type gauge * app/peerinfo: rename dv_type to dv_client --------- Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: kalo <24719519+KaloyanTanev@users.noreply.github.com> Co-authored-by: Andrei Smirnov <andrei@obol.tech> Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>



Previously qCommit uses optimistically the first in the list. However, we never filtered the invalid ones, so it may as well pick up an invalid qCommit. Ensure it always picks a qCommit that has value the same as the one that is actually proposed.
The PR also includes many more qbft test cases capturing various bad weather scenarios.
N.B.: linter fails, but I've fixed this in #4619. Will rebase on main after it is merged, so that linter passes here as well.
category: bug
ticket: none