fix: empty platformP2PPort deprecated field in protx listdiff results - #7360
Conversation
…n happened between versions
It's a workaround for nodes that has been already affected by this bug and may be reverted in the future
✅ No Merge Conflicts DetectedThis PR currently has no conflicts with other open PRs. |
|
✅ Review complete (commit 9c74948) |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
💤 Files with no reviewable changes (1)
WalkthroughThis PR makes two coordinated edits: JSON emission in CDeterministicMNStateDiff::ToJson now prefers platform ports stored in state.netInfo (PLATFORM_P2P / PLATFORM_HTTPS) when available, falling back to legacy scalar fields otherwise; and CSpecialTxProcessor::RebuildListFromBlock clears legacy platformP2PPort and platformHTTPPort scalars to 0 for ProTxVersion >= ExtAddr during service updates so reconstructed state matches netInfo-backed storage. Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Suggested reviewers
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
🧹 Nitpick comments (1)
src/evo/dmnstate.cpp (1)
94-94: 💤 Low valueFix subject-verb agreement in comment.
"nodes that has been" should be "nodes that have been".
📝 Suggested fix
- // TODO: remove this workaround for nodes that has been incorrectly migrated internal storage in the future + // TODO: remove this workaround for nodes that have been incorrectly migrated internal storage in the future🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/evo/dmnstate.cpp` at line 94, Update the TODO comment near the "remove this workaround for nodes that has been incorrectly migrated internal storage in the future" text in dmnstate.cpp to correct the grammar: change "nodes that has been" to "nodes that have been" so the comment reads "remove this workaround for nodes that have been incorrectly migrated internal storage in the future".
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@src/evo/dmnstate.cpp`:
- Line 94: Update the TODO comment near the "remove this workaround for nodes
that has been incorrectly migrated internal storage in the future" text in
dmnstate.cpp to correct the grammar: change "nodes that has been" to "nodes that
have been" so the comment reads "remove this workaround for nodes that have been
incorrectly migrated internal storage in the future".
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: 8687e076-0171-484e-af28-9e457c35dcbd
📒 Files selected for processing (2)
src/evo/dmnstate.cppsrc/evo/specialtxman.cpp
thepastaclaw
left a comment
There was a problem hiding this comment.
Code Review
Two-commit fix: specialtxman.cpp clears legacy platformP2PPort/HTTPPort scalars on ExtAddr ProUpServTx (proper forward fix), and dmnstate.cpp renders the port from netInfo when present in the diff (acknowledged partial workaround for already-corrupted databases). The forward fix is sound. The workaround correctly handles diffs that carry netInfo, but cannot recover phantom scalar-only diffs (where the two compared states differ only in the now-legacy scalar). The commit message already acknowledges the workaround is temporary, so this is a known limitation rather than a regression.
🟡 1 suggestion(s) | 💬 1 nitpick(s)
🤖 Prompt for all review comments with AI agents
These findings are from an automated code review. Verify each finding against the current code and only fix it if needed.
In `src/evo/dmnstate.cpp`:
- [SUGGESTION] src/evo/dmnstate.cpp:95-100: Workaround can't recover phantom scalar-only diffs
The fallback derives the port from netInfo only when the same CDeterministicMNStateDiff also carries Field_netInfo. For already-corrupted databases, BuildDiff can still produce a scalar-only diff: ExtAddr full-state serialization in CDeterministicMNState (dmnstate.h:105) omits platformP2PPort/HTTPPort, so a snapshot round-trip zeros those members, while older replayed diffs may still bump them to a stale N. If `protx listdiff` straddles such a snapshot boundary and netInfo is unchanged between the two endpoints, the diff carries Field_platformP2PPort/HTTPPort without Field_netInfo, falls through to `state.platformP2PPort`, and reports the phantom value (0 or stale N depending on direction). The commit message already frames this as a workaround that "may be reverted in the future", so this is a known partial fix rather than a regression — flagging because the workaround's stated goal isn't fully met. A complete fix would either suppress these phantom scalar fields in BuildDiff for ExtAddr states, or normalize the rendered port against the full target state's netInfo.
| const bool has_ext_netinfo = (fields & Field_netInfo) && state.netInfo->CanStorePlatform(); | ||
| if (fields & Field_platformP2PPort) { | ||
| obj.pushKV("platformP2PPort", | ||
| has_ext_netinfo && state.netInfo->HasEntries(NetInfoPurpose::PLATFORM_P2P) | ||
| ? state.netInfo->GetEntries(NetInfoPurpose::PLATFORM_P2P)[0].GetPort() | ||
| : state.platformP2PPort); |
There was a problem hiding this comment.
🟡 Suggestion: Workaround can't recover phantom scalar-only diffs
The fallback derives the port from netInfo only when the same CDeterministicMNStateDiff also carries Field_netInfo. For already-corrupted databases, BuildDiff can still produce a scalar-only diff: ExtAddr full-state serialization in CDeterministicMNState (dmnstate.h:105) omits platformP2PPort/HTTPPort, so a snapshot round-trip zeros those members, while older replayed diffs may still bump them to a stale N. If protx listdiff straddles such a snapshot boundary and netInfo is unchanged between the two endpoints, the diff carries Field_platformP2PPort/HTTPPort without Field_netInfo, falls through to state.platformP2PPort, and reports the phantom value (0 or stale N depending on direction). The commit message already frames this as a workaround that "may be reverted in the future", so this is a known partial fix rather than a regression — flagging because the workaround's stated goal isn't fully met. A complete fix would either suppress these phantom scalar fields in BuildDiff for ExtAddr states, or normalize the rendered port against the full target state's netInfo.
source: ['codex']
There was a problem hiding this comment.
Correction: this prior finding was carried forward, not resolved. The latest review for 9c74948 keeps the same scalar-only ExtAddr diff concern as a suggestion under the updated title “Workaround still misses scalar-only ExtAddr diffs”.
Edited to correct the automated reconciliation note.
…ted branch removed
thepastaclaw
left a comment
There was a problem hiding this comment.
Code Review
The latest delta only removes the malformed TODO comment, so there are no new findings in 9c74948. The prior TODO grammar finding is resolved, but the prior scalar-only corrupted-database gap remains in scope because the PR explicitly claims to show valid results for nodes that already have corrupted internal storage.
🟡 1 suggestion(s)
🤖 Prompt for all review comments with AI agents
These findings are from an automated code review. Verify each finding against the current code and only fix it if needed.
In `src/evo/dmnstate.cpp`:
- [SUGGESTION] src/evo/dmnstate.cpp:94-105: Workaround still misses scalar-only ExtAddr diffs
The fallback only derives deprecated platform ports from `state.netInfo` when this same `CDeterministicMNStateDiff` carries `Field_netInfo`. That does not cover an already-corrupted database where an ExtAddr full-state snapshot round-trip has zeroed the legacy scalar fields, while a diff-reconstructed list still has stale scalar values and unchanged `netInfo`. `CDeterministicMNStateDiff` compares `platformP2PPort` and `platformHTTPPort` independently, so that case can produce a scalar-only diff; then `has_ext_netinfo` is false and `ToJson()` falls back to the stale scalar values. The forward fix in `specialtxman.cpp` prevents newly written stale scalars, but this workaround still does not satisfy the PR's stated goal of valid `protx listdiff` results for nodes with already-corrupted storage.
| const bool has_ext_netinfo = (fields & Field_netInfo) && state.netInfo->CanStorePlatform(); | ||
| if (fields & Field_platformP2PPort) { | ||
| obj.pushKV("platformP2PPort", | ||
| has_ext_netinfo && state.netInfo->HasEntries(NetInfoPurpose::PLATFORM_P2P) | ||
| ? state.netInfo->GetEntries(NetInfoPurpose::PLATFORM_P2P)[0].GetPort() | ||
| : state.platformP2PPort); | ||
| } | ||
| if (fields & Field_platformHTTPPort) { | ||
| obj.pushKV("platformHTTPPort", | ||
| has_ext_netinfo && state.netInfo->HasEntries(NetInfoPurpose::PLATFORM_HTTPS) | ||
| ? state.netInfo->GetEntries(NetInfoPurpose::PLATFORM_HTTPS)[0].GetPort() | ||
| : state.platformHTTPPort); |
There was a problem hiding this comment.
🟡 Suggestion: Workaround still misses scalar-only ExtAddr diffs
The fallback only derives deprecated platform ports from state.netInfo when this same CDeterministicMNStateDiff carries Field_netInfo. That does not cover an already-corrupted database where an ExtAddr full-state snapshot round-trip has zeroed the legacy scalar fields, while a diff-reconstructed list still has stale scalar values and unchanged netInfo. CDeterministicMNStateDiff compares platformP2PPort and platformHTTPPort independently, so that case can produce a scalar-only diff; then has_ext_netinfo is false and ToJson() falls back to the stale scalar values. The forward fix in specialtxman.cpp prevents newly written stale scalars, but this workaround still does not satisfy the PR's stated goal of valid protx listdiff results for nodes with already-corrupted storage.
source: ['codex']
|
Guix Automation has began to build this PR tagged as v23.1.3-devpr7360.9c749489. A new comment will be made when the image is pushed. |
|
Guix Automation has failed with an unknown error for tag v23.1.3-devpr7360.9c749489 |
…otx listdiff results 9c74948 chore: removed comment - this code to be removed anyway after deprecated branch removed (Konstantin Akimov) f9a4aeb fix: make non-zero output for platformP2PPort if platform_p2p exist (Konstantin Akimov) 99b0c3d fix: don't include masternode to protx listdiff` if internal migration happened between versions (Konstantin Akimov) Pull request description: ## Issue being fixed or feature implemented There're 2 different versions of protx's internal storages; and they are switched after v24 activation. It seems as when version switched, the incorrect platformP2PPort / platformHTTPPort may be added to diff even if they are not used anymore and it happens only if snapshot is used; for example after node restart. It causes strange result of `protxlistdiff A B` such as: ``` "MASTERNODE": { { "lastPaidHeight": 9204, "platformP2PPort": 0, <---- INVALID it should be correct port here "platformHTTPPort": 0, <----- INVALID it should be correct port here "addresses": { "platform_p2p": [ <VALID> ], "platform_https": [ <VALID> ] ``` It happened on devnet on block on 9216 ## What was done? Added reset of platformP2PPort and platformHTTPPort. Added a workaround to show valid results for nodes that already have corrupted database. ## How Has This Been Tested? Sync node with devnet palona ; restart node -> issue is reproduced. Build a node from this PR, restart node -> issue is not reproduced. ## Breaking Changes N/A ## Checklist: - [x] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have added or updated relevant unit/integration/functional/e2e tests - [ ] I have made corresponding changes to the documentation - [x] I have assigned this pull request to a milestone ACKs for top commit: PastaPastaPasta: utACK 9c74948 Tree-SHA512: d4f364223f38f70c562fe6e387aa315823a966d1d95a00445c5cfae0b85d4610317cb2a5045daedadc696c56476c976a4836c889e76339d7397253dffe5eaf73
Backport adaptations discovered by the release build: restore the deprecated-service helper required by dashpay#7360, complete v23.1.x network handler wrappers and read APIs, preserve CoinJoin manager dispatch, and align regression tests with branch constants and headers. Co-Authored-By: Claude <noreply@anthropic.com>
…otx listdiff results 9c74948 chore: removed comment - this code to be removed anyway after deprecated branch removed (Konstantin Akimov) f9a4aeb fix: make non-zero output for platformP2PPort if platform_p2p exist (Konstantin Akimov) 99b0c3d fix: don't include masternode to protx listdiff` if internal migration happened between versions (Konstantin Akimov) Pull request description: ## Issue being fixed or feature implemented There're 2 different versions of protx's internal storages; and they are switched after v24 activation. It seems as when version switched, the incorrect platformP2PPort / platformHTTPPort may be added to diff even if they are not used anymore and it happens only if snapshot is used; for example after node restart. It causes strange result of `protxlistdiff A B` such as: ``` "MASTERNODE": { { "lastPaidHeight": 9204, "platformP2PPort": 0, <---- INVALID it should be correct port here "platformHTTPPort": 0, <----- INVALID it should be correct port here "addresses": { "platform_p2p": [ <VALID> ], "platform_https": [ <VALID> ] ``` It happened on devnet on block on 9216 ## What was done? Added reset of platformP2PPort and platformHTTPPort. Added a workaround to show valid results for nodes that already have corrupted database. ## How Has This Been Tested? Sync node with devnet palona ; restart node -> issue is reproduced. Build a node from this PR, restart node -> issue is not reproduced. ## Breaking Changes N/A ## Checklist: - [x] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have added or updated relevant unit/integration/functional/e2e tests - [ ] I have made corresponding changes to the documentation - [x] I have assigned this pull request to a milestone ACKs for top commit: PastaPastaPasta: utACK 9c74948 Tree-SHA512: d4f364223f38f70c562fe6e387aa315823a966d1d95a00445c5cfae0b85d4610317cb2a5045daedadc696c56476c976a4836c889e76339d7397253dffe5eaf73
… v23.1.x The dashpay#7360 backport imported develop's `IsServiceDeprecatedRPCEnabled()` gate around platformP2PPort/platformHTTPPort in CDeterministicMNStateDiff::ToJson, and re-added the helper to evo/netinfo.{h,cpp} because it does not exist here. That gate is dead on this release line. bbcd9d5 ("rpc: remove -deprecatedrpc=service gating for service") removed gating on 23.x and left the fields unenforced; upstream only restored it in dashpay#7181 (e50d436), which targets the v24 line and is not an ancestor of this branch. Nothing on 23.x passes -deprecatedrpc=service, and every sibling field (service in dmnstate.cpp, and all of core_write.cpp) is emitted unconditionally here. So on a default v23.1.8 node the condition was always false and both keys disappeared entirely from protx diff/listdiff -- a regression against v23.1.7, which emitted them unconditionally, and a contradiction of this release's own notes promising they "report the corresponding non-zero values instead of stale zeroes". Emit them unconditionally, keeping dashpay#7360's actual fix (report the live port from netInfo when the diff carries an ExtAddr netInfo). Drop the now-unused helper so the branch does not carry a gate nothing can turn on. Reported-by: knst Co-Authored-By: Claude <noreply@anthropic.com>
…otx listdiff results Backport of dashpay#7360 (upstream merge fb31170, cherry-picked with -m1). v23.1.x adaptation: upstream wraps the deprecated platformP2PPort/platformHTTPPort fields in IsServiceDeprecatedRPCEnabled(); that gate does not exist on this branch (removed by bbcd9d5 - the fields deliberately remain unenforced through gating) and v23.1.7 always returned them. Replaced the condition with 'if (true)' to keep the block structurally aligned with develop, per review feedback from UdjinM6 on the previous attempt. The genuine fix (reading the live Platform ports from netInfo instead of the always-zero scalar fields) is unchanged from upstream. (cherry picked from commit fb31170e24c1793d442ede1a3aeb00f89f52fdcb)
24920a0 chore: prepare v23.1.8 release (pasta) 2194248 Merge #7348: fix: penalize oversized notfound messages (pasta) f5c72c3 Merge #7347: fix: punish invalid dstx messages (pasta) 550caf7 Merge #7465: fix(qt): handle pixel-sized fonts when scaling widgets (pasta) e203710 Merge #7419: fix(net): bound CoinJoin message vector intake (pasta) 5f5b960 Merge #7418: fix(net): bound signing message vector intake (Pasta) 7cc2cca Merge #7450: test: make governance vote fixtures wire-valid (Pasta) f011c80 Merge #7440: fix(net): bound governance vote signature deserialization (Pasta) 4b4d96a Merge #7442: fix(net): authorize governance inv responses via the net-layer per-peer request tracker (Pasta) f855b13 Merge #7444: fix(net): bound bloom message vectors before allocation (Pasta) 5b5c6fb Merge #7415: fix: bound pending sig share queue (Pasta) 9bbe808 Merge #7416: fix(net): bound quorum data response vectors (Pasta) da42f50 Merge #7424: fix: bound ChainLock seen cache (Pasta) 5b310df Merge #7438: fix: bound SPORK signature deserialization (Pasta) e118d0c Merge #7259: fix: dangling point to cj client (Pasta) 9921621 Merge #7439: refactor: add bounded vector deserialization (Pasta) 89bdf7c Merge #7414: fix(net): throttle per-object governance vote sync requests (Pasta) 44c396d Merge #7402: fix: bound pending recovered sig queue to prevent remote OOM (Pasta) 05cfe27 Merge #7351: fix: limit signing share sessions per peer (pasta) 3ef3a5b Merge #7408: fix: bound DKG contribution blob intake (pasta) 0ea6532 Merge #7387: test: migrate governance inv cache coverage to unit tests (Pasta) 8ffdf7f Merge #7398: backport: compact block relay hardening (bitcoin#26898, bitcoin#27626, bitcoin#27743, bitcoin#26969, bitcoin#29412, bitcoin#32646, bitcoin#33296) (Pasta) 2915142 backport: bitcoin#27608 - p2p: Avoid prematurely clearing download state for other peers (PastaClaw) 90b5473 Merge #7396: fix: run of circular-dependencies with python3.15 (Pasta) b003cdc Merge #7395: ci: update GitHub Actions pins for Node 24 (pasta) 97c3dd1 Merge #7394: fix: stabilize par help text in manpages (pasta) 8f8616b Merge #7372: backport: bitcoin#32693: depends: fix cmake compatibility error for freetype (pasta) 48f72be Merge #7360: fix: empty platformP2PPort deprecated field in protx listdiff results (pasta) a8cccff Merge #7298: fix(qt): keep PoSe score visible when hiding banned masternodes (pasta) Pull request description: Release PR for Dash Core v23.1.8, a patch release on top of v23.1.7. Fast-forwards from `v23.1.x` (currently at `chore: prepare v23.1.7 release`), 29 commits, no merge commits, no conflicts. ## Contents Backports of PRs already reviewed and merged on `develop`: `#7259` `#7347` `#7348` `#7351` `#7298` `#7360` `#7372` `#7387` `#7394` `#7395` `#7396` `#7398` `#7402` `#7408` `#7414` `#7415` `#7416` `#7418` `#7419` `#7424` `#7438` `#7439` `#7440` `#7442` `#7444` `#7450` `#7465` Plus `backport: bitcoin#27608`, a single commit taken from Dash #7237 because #7398's compact-block hardening depends on it. The rest of that v0.26 batch is intentionally not included on v23.1.x. The commit is byte-identical to its reviewed counterpart inside #7237. And release preparation: version bump, regenerated man pages, release notes, archived 23.1.7 notes. ## Note for reviewers: this branch was rebuilt An earlier revision of this PR was discarded and the branch rebuilt from scratch. Review comments on the previous revision point at commits that no longer exist, though the feedback itself was carried over (see below). The reason: several commits titled `Merge #NNNN` in the earlier revision contained substantial code that exists nowhere upstream — apparently written from a description of each PR rather than ported from its diff. For example, `feature_llmq_simplepose.py` is byte-identical between v23.1.7 and `develop`, yet the earlier `Merge #7408` rewrote 66 lines of it; `test/functional/p2p_governance_invs.py` does not exist on `develop` at all, yet had grown from 62 to 148 lines. That mislabeling matters because a commit titled `Merge #NNNN` invites less scrutiny, not more. It also had consequences: the earlier revision was **missing #7440 entirely**, and contained eleven consecutive commits that did not compile (code written against newer upstream APIs this branch does not have — `Misbehaving(Peer&)`, and `PeerIsBanned` used five commits before it was declared). Every commit on this branch has now been diffed against its upstream merge commit. Where a backport differs, it is because v23.1.x predates an upstream refactor and the change had to be applied to the pre-refactor file — for example #7418 and #7438 patch `signing_shares.cpp` / `spork.cpp` where upstream patches `net_signing.cpp` / `net_processing.cpp`. ## Dropped from this branch - **#7350** (`net: don't lock cs_main while reading blocks`) — dropped on review feedback. It is a 110-line lock-structure refactor of `ProcessGetBlockData` with no measured benefit, and it would add avoidable churn to the eventual master→develop merge-back. Nothing on this branch depends on it: #7398's compact-block work precedes it, and the remaining 14 commits replay with zero conflicts once it is removed. Thanks @knst. ## Added after the initial review pass - **#7351** (`fix: limit signing share sessions per peer`) — cherry-picked as a single commit and placed before #7402, matching upstream's merge order. The include block additionally carries `<ranges>`: upstream's diff adds only `<algorithm>` because develop already had it, whereas v23.1.x did not and the backported `GetSessionCount()` / `GetAnnouncementSessionCount()` use `std::ranges::count_if`. - **#7465** (`fix(qt): handle pixel-sized fonts when scaling widgets`) — cherry-picked from the five upstream commits. `optiontests.cpp` additionally includes `qt/guiutil_font.h`, because `fontsLoaded()` and `updateFonts()` are declared there on v23.1.x while develop declares them in `qt/guiutil.h`, which is all the upstream test includes. Two further backports were added later and applied without any adaptation -- their diffs are byte-for-byte identical to upstream: - **#7347** (`fix: punish invalid dstx messages`) - **#7348** (`fix: penalize oversized notfound messages`) ## Adaptations worth flagging - **#7360** — upstream gates `platformP2PPort` / `platformHTTPPort` in `protx listdiff` behind `IsServiceDeprecatedRPCEnabled()`. On 23.x those deprecated fields are deliberately not enforced through gating (see `bbcd9d543e6`), so shipping the gate as-is would silently drop two fields that v23.1.7 always returned. Changed to `if (true)` with a comment, per review feedback, keeping the block aligned with `develop`. The substantive fix from #7360 — reading the live port from `netInfo` instead of the always-zero scalar — is retained. - **#7415** — the pending-map caps (`MAX_PENDING_SIG_SHARES_PER_NODE`, `MAX_PENDING_SIG_SHARES_TOTAL`) are backported. The additional bound upstream places on batches awaiting verification is not, because it guards a condition that does not exist here: upstream's dispatcher pushes one task per batch inside an inner loop, whereas v23.1.x pushes a single looping worker per 10 ms tick. There is no unbounded task queue to bound. - **Man pages** — regenerated without the `lock` debug category, which only exists under `DEBUG_LOCKCONTENTION` and so is absent from release binaries. Thanks @UdjinM6 for catching this. ## Known CI failure macOS jobs are expected to fail. `actions/upload-artifact@v6` rejects filenames containing `:`, and the Xcode SDK ships Perl man pages with `::` in the name. A release-branch-only workaround existed on the earlier revision but was dropped as it corresponds to no upstream PR. This is accepted for this release. ## Testing - Every commit through #7465 compiles individually (verified for 27 of the 29; the three additions below were verified at the tip) — verified individually, not just at the tip. - Full build clean; no new warnings. - Unit tests pass. - Functional tests pass: `feature_llmq_signing` (both variants), `feature_llmq_chainlocks`, `feature_llmq_dkgerrors`, `feature_llmq_is_cl_conflicts`, `p2p_instantsend`, `feature_dip3_deterministicmns` (both wallet types), `rpc_coinjoin`. - Qt unit tests pass (32 cases, run under the `cocoa` platform plugin so the pixel-sized font regression from #7465 actually executes rather than self-skipping). - Lint: one pre-existing `lint-cppcheck-dash` failure, identical on v23.1.7, in files this branch does not touch. Top commit has no ACKs. Tree-SHA512: 0fa469c9a33820aa85fbb8b90c5877409d09490f746f1300b05ceda470a600765f900bec42e5aad5d90a2d46b44e28c20e44dc4a8fe719553a072298069eaec4
728f505 doc: record the v23.1.8 critical crash fixes in the release notes (pasta) ca56af8 fix(llmq): reject parentless quorum base blocks instead of terminating (pasta) a801d3f fix(llmq): reject unregistered LLMQ types from qsigshare before quorum lookup (pasta) 6c1f611 fix: skip already-removed conflicts when a ProTx key change clears the mempool (pasta) 24920a0 chore: prepare v23.1.8 release (pasta) 2194248 Merge #7348: fix: penalize oversized notfound messages (pasta) f5c72c3 Merge #7347: fix: punish invalid dstx messages (pasta) 550caf7 Merge #7465: fix(qt): handle pixel-sized fonts when scaling widgets (pasta) e203710 Merge #7419: fix(net): bound CoinJoin message vector intake (pasta) 5f5b960 Merge #7418: fix(net): bound signing message vector intake (Pasta) 7cc2cca Merge #7450: test: make governance vote fixtures wire-valid (Pasta) f011c80 Merge #7440: fix(net): bound governance vote signature deserialization (Pasta) 4b4d96a Merge #7442: fix(net): authorize governance inv responses via the net-layer per-peer request tracker (Pasta) f855b13 Merge #7444: fix(net): bound bloom message vectors before allocation (Pasta) 5b5c6fb Merge #7415: fix: bound pending sig share queue (Pasta) 9bbe808 Merge #7416: fix(net): bound quorum data response vectors (Pasta) da42f50 Merge #7424: fix: bound ChainLock seen cache (Pasta) 5b310df Merge #7438: fix: bound SPORK signature deserialization (Pasta) e118d0c Merge #7259: fix: dangling point to cj client (Pasta) 9921621 Merge #7439: refactor: add bounded vector deserialization (Pasta) 89bdf7c Merge #7414: fix(net): throttle per-object governance vote sync requests (Pasta) 44c396d Merge #7402: fix: bound pending recovered sig queue to prevent remote OOM (Pasta) 05cfe27 Merge #7351: fix: limit signing share sessions per peer (pasta) 3ef3a5b Merge #7408: fix: bound DKG contribution blob intake (pasta) 0ea6532 Merge #7387: test: migrate governance inv cache coverage to unit tests (Pasta) 8ffdf7f Merge #7398: backport: compact block relay hardening (bitcoin#26898, bitcoin#27626, bitcoin#27743, bitcoin#26969, bitcoin#29412, bitcoin#32646, bitcoin#33296) (Pasta) 2915142 backport: bitcoin#27608 - p2p: Avoid prematurely clearing download state for other peers (PastaClaw) 90b5473 Merge #7396: fix: run of circular-dependencies with python3.15 (Pasta) b003cdc Merge #7395: ci: update GitHub Actions pins for Node 24 (pasta) 97c3dd1 Merge #7394: fix: stabilize par help text in manpages (pasta) 8f8616b Merge #7372: backport: bitcoin#32693: depends: fix cmake compatibility error for freetype (pasta) 48f72be Merge #7360: fix: empty platformP2PPort deprecated field in protx listdiff results (pasta) a8cccff Merge #7298: fix(qt): keep PoSe score visible when hiding banned masternodes (pasta) Pull request description: ## Issue being fixed or feature implemented Merges master (v23.1.8) back into develop so develop carries the v23.1.8 release and, most importantly, the three remotely reachable crash fixes shipped on top of it. Without this, develop-based nodes remain vulnerable to all three crashes. ## What was done? Merged `upstream/master` into `develop`. The genuinely new payload is: - **Three remote-crash fixes** (with their regression tests): - skip already-removed conflicts when a ProTx key change clears the mempool (`txmempool.cpp`) - reject unregistered LLMQ types from `qsigshare` before quorum lookup (`llmq/blockprocessor.cpp`, `llmq/quorumsman.cpp`) - reject parentless quorum base blocks instead of terminating (`llmq/commitment.cpp`, `llmq/utils.cpp`, `validation.{cpp,h}`) - **Release bookkeeping**: v23.1.8 release notes, archived 23.1.7 notes, flatpak release entry, regenerated v23.1.8 man pages, and the `configure.ac` version bump (develop keeps `IS_RELEASE=false` and its own configure flags). Everything else on master since the last merge (the v23.1.x security-hardening train, #7259–#7465 and #7398) was dual-merged and already exists on develop as its own merge commits, so all conflicts from those files resolve to develop's side. Deliberate adaptations, itemized in the merge commit message: - The `qsigshare` LLMQ-type gate is ported into develop's `net_signing.cpp` and the parentless-base DKG check into develop's `net_dkg.cpp` (develop moved message processing out of `signing_shares.cpp`/`dkgsessionmgr.cpp`). - The defence-in-depth `find()` lookup is additionally applied to `CQuorumManager::GetCachedMutableQuorum()`, a develop-only method reached with a wire-supplied LLMQ type from the `QDATA` handler. - The new mempool regression test is adapted to develop's `CreateProRegTx`/`CreateProUpServTx`/`CreateProUpRevTx` helper signatures and `MemPoolOptionsForTest`. - `src/active/quorums.cpp` (deleted by develop's ActiveContext refactor) stays deleted; develop's #7416 equivalent already covers the new layout. ## How Has This Been Tested? Built with `--enable-debug` on macOS (arm64). Ran the new/extended suites — `evo_deterministicmns_tests`, `llmq_invalid_type_tests`, `evo_utils_tests` — plus adjacent ones (`llmq_signing_tests`, `llmq_dkg_tests`, `llmq_blockprocessor_tests`, `llmq_commitment_tests`, `llmq_utils_tests`, `mempool_tests`, `validation_tests`): all pass. The three regression tests abort the process on unpatched code. ## Breaking Changes None. `ChainstateManager::IsQuorumTypeEnabled()` loosens its `pindexPrev` parameter from `gsl::not_null` to a plain pointer (null now returns false instead of aborting); all existing callers are unaffected. ## Checklist: - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [x] I have added or updated relevant unit/integration/functional/e2e tests - [x] I have made corresponding changes to the documentation - [ ] I have assigned this pull request to a milestone _(for repository code-owners and collaborators only)_ ACKs for top commit: UdjinM6: utACK e15bb64 Tree-SHA512: 0897f0e1267c4083ef505127ceb18309e310caf36a066674ea298d66836afb86c762532e7cc68d6c0761142b2e5b291b497496b7e82d0f7ce60549761c0ebdd8
Issue being fixed or feature implemented
There're 2 different versions of protx's internal storages; and they are switched after v24 activation.
It seems as when version switched, the incorrect platformP2PPort / platformHTTPPort may be added to diff even if they are not used anymore and it happens only if snapshot is used; for example after node restart.
It causes strange result of
protxlistdiff A Bsuch as:It happened on devnet on block on 9216
What was done?
Added reset of platformP2PPort and platformHTTPPort.
Added a workaround to show valid results for nodes that already have corrupted database.
How Has This Been Tested?
Sync node with devnet palona ; restart node -> issue is reproduced.
Build a node from this PR, restart node -> issue is not reproduced.
Breaking Changes
N/A
Checklist: