Skip to content

backport: v0.27 bitcoin#28170, bitcoin#29524, bitcoin#28464, bitcoin#28578, bitcoin#28832, bitcoin#28075 - #118

Merged
DCG-Claude merged 6 commits into
developfrom
backport-0.27-b007-misc
Nov 2, 2026
Merged

DCG-Claude merged 6 commits into
developfrom
backport-0.27-b007-misc

Conversation

@DCG-Claude

@DCG-Claude DCG-Claude commented Oct 18, 2026 •

Copy link
Copy Markdown
Collaborator

Automated Bitcoin Core v0.27 backports, batch backport-0.27-b007-misc.

upstream commit gates notes
bitcoin#28170 aa7b390a84 pick:pass build:pass tests:pass mech:warn tree:pass verify:pass This backport moves the desirable-service-flags logic into PeerManager: NODE_NETWORK_LIMITED peers are now accepted base
bitcoin#29524 b044676470 pick:pass build:pass tests:pass mech:warn tree:pass verify:pass Backports the regression test from bitcoin#29524, which checks that a block with an unknown parent is not punished as mu
bitcoin#28464 432a93bc0b pick:pass build:pass tests:pass mech:warn tree:pass verify:pass Faithful backport of bitcoin#28464: CConnman now takes only m_max_automatic_connections and works out the full-relay, bl
bitcoin#28578 38a4000d7a pick:pass build:pass tests:pass mech:warn tree:pass verify:pass Faithful backport: the MockedDescriptorConverter is moved into test/fuzz/util/descriptor.{h,cpp}, ConsumeCoins is added,
bitcoin#28832 53a9ae040f pick:pass build:pass tests:pass mech:pass tree:pass verify:pass clean cherry-pick
bitcoin#28075 ce0c409cb3 pick:pass build:pass tests:pass mech:warn tree:pass verify:pass This backport of bitcoin#28075 removes DirIsWritable and GetUniquePath and makes util::LockDirectory return a LockResult
Provenance

Each commit passed: cherry-pick (adapted by an Opus lane only where conflicts existed), build, touched tests, a mechanical diff-of-diffs check (every upstream hunk landed; no added line without an upstream counterpart), and an independent Opus verification lane where anything was adapted. Gate rows and lane artifacts are in the backportsys DB.

@DCG-Claude

Copy link
Copy Markdown
Collaborator Author

CI failed at 74eb079 on thepastaclaw/dash: Require a milestone

This job failed only because the pull request has no milestone set (MILESTONE is empty), which is a GitHub setting rather than anything in the code. No commit on this branch touches it. A maintainer needs to set a milestone on the PR, and the check should then pass.


🤖 backportsys, on behalf of the Dash backport pipeline.

@DCG-Claude

Copy link
Copy Markdown
Collaborator Author

CI failed at 74eb079 on thepastaclaw/dash: Require a milestone

The 'Require a milestone' job failed because the pull request has no milestone (MILESTONE is empty in the job's environment). It reads PR metadata, not the code, so no change to this branch can fix it. A maintainer needs to set a milestone on the PR, and then the check will pass.


🤖 backportsys, on behalf of the Dash backport pipeline.

@DCG-Claude

Copy link
Copy Markdown
Collaborator Author

CI failed at 74eb079 on thepastaclaw/dash: Require a milestone

This job only checks that the pull request has a milestone set (the MILESTONE variable was empty). No code was built or tested, so nothing in this backport branch caused it. A maintainer needs to set a milestone on the PR; after that a rerun should pass.


🤖 backportsys, on behalf of the Dash backport pipeline.

27f260a net: remove now unused global 'g_initial_block_download_completed' (furszy)
aff7d92 test: add coverage for peerman adaptive connections service flags (furszy)
6ed5360 net: peer manager, dynamically adjust desirable services flag (furszy)
9f36e59 net: move state dependent peer services flags (furszy)
f9ac96b net: decouple state independent service flags from desirable ones (furszy)
97df4e3 net: store best block tip time inside PeerManager (furszy)

Pull request description:

  Derived from bitcoin#28120 discussion.

  By relocating the peer desirable services flags into the peer manager, we
  allow the connections acceptance process to handle post-IBD potential
  stalling scenarios.

  The peer manager will be able to dynamically adjust the services flags
  based on the node's proximity to the tip (back and forth). Allowing the node
  to recover from the following post-IBD scenario:
  Suppose the node has successfully synced the chain, but later experienced
  dropped connections and remained inactive for a duration longer than the limited
  peers threshold (the timeframe within which limited peers can provide blocks). In
  such cases, upon reconnecting to the network, the node might only establish
  connections with limited peers, filling up all available outbound slots. Resulting
  in an inability to synchronize the chain (because limited peers will not provide
  blocks older than the `NODE_NETWORK_LIMITED_MIN_BLOCKS` threshold).

ACKs for top commit:
  achow101:
    ACK 27f260a
  vasild:
    ACK 27f260a
  naumenkogs:
    ACK 27f260a
  mzumsande:
    Light Code Review ACK 27f260a
  andrewtoth:
    ACK 27f260a

Tree-SHA512: 07befb9bcd0b60a4e7c45e4429c02e7b6c66244f0910f4b2ad97c9b98258b6f46c914660a717b5ed4ef4814d0dbfae6e18e6559fe9bec7d0fbc2034109200953

Dash adaptations:
- src/protocol.h: SeedsServiceFlags() returns NODE_NETWORK only, since Dash has no NODE_WITNESS (matching Dash's old GetDesirableServiceFlags).
- src/net_processing.cpp: GetDesirableServiceFlags() returns NODE_NETWORK_LIMITED / NODE_NETWORK without NODE_WITNESS, which Dash lacks.
- src/net_processing.cpp: ApproximateBestBlockDepth() declared next to Dash's CanDirectFetch(), which sits earlier in PeerManagerImpl than upstream's; Dash's m_handlers kept.
- src/net_processing.cpp: SetBestBlock/HasAllDesirableServiceFlags/GetDesirableServiceFlags added beside Dash's relay, object-request and handler overrides, all kept.
- src/net_processing.cpp: UpdatedBlockTip's direct m_best_height assignment and SetServiceFlagsIBDCache call replaced by SetBestBlock(height, block time).
- src/init.cpp: tip_info->block_time uses best_block_time; Dash's extra tip_info->block_hash line kept.
- src/protocol.cpp: removed the IBD-cache global and the two functions; Dash's MAKE_MSG macro and Dash message types untouched.
- src/test/peerman_tests.cpp: builds peerman with Dash's MakePeerManager() test helper, since PeerManager::make needs Dash's masternode/LLMQ/CoinJoin managers.
- src/test/peerman_tests.cpp: uses Dash's BlockAssembler(chainstate, node, mempool) and 3-arg ProcessNewBlock (no min_pow_checked); NODE_WITNESS removed from flags.
- src/test/peerman_tests.cpp: comment says 2.5 minutes, not 10, for Dash's block spacing; the test math already uses nPowTargetSpacing.

Not applicable to Dash (intentionally omitted):
- contrib/seeds/README.md: Dash's README builds seeds from the protx list and has no PATTERN_AGENT / GetDesirableServiceFlags paragraph to rename.
… connect to known prev block

a1fbde0 p2p: Don't consider blocks mutated if they don't connect to known prev block (Greg Sanders)

Pull request description:

  Followup to bitcoin#29412 to revert some of the behavior change that was likely unintentional.

  Based on comments from bitcoin#29412 (comment)

ACKs for top commit:
  0xB10C:
    utACK a1fbde0
  dergoegge:
    Code review ACK a1fbde0
  Sjors:
    ACK a1fbde0
  sr-gi:
    tACK bitcoin@a1fbde0

Tree-SHA512: be6204c8cc57b271d55c1d02a5c77d03a37738d91cb5ac164f483b0bab3991c24679c5ff02fbaa52bf37ee625874b63f4c9f7b39ad6fd5f3a25386567a0942e4

Dash adaptations:
- test/functional/p2p_mutated_blocks.py: drops extra_args '-testactivationheight=segwit@1'; Dash has no segwit deployment and rejects that name
- test/functional/p2p_mutated_blocks.py: new check's comment says 'mutation check', not 'unexpected-witness mutation check'; Dash has no witness check

Not applicable to Dash (intentionally omitted):
- src/net_processing.cpp: Upstream gates the mutation check on a known prev block only to evaluate DEPLOYMENT_SEGWIT; Dash's IsBlockMutated(block) needs no prev block, so the check stays unconditional
df69b22 doc: improve documentation around connection limit maximums (Amiti Uttarwar)
adc171e scripted-diff: Rename connection limit variables (Amiti Uttarwar)
e9fd9c0 net: add m_max_inbound to connman (Amiti Uttarwar)
c25e0e0 net, refactor: move calculations for connection type limits into connman (Amiti Uttarwar)

Pull request description:

  This is joint work with amitiuttarwar.

  This has the first few commits of bitcoin#28463. It is not strictly a prerequisite for that, but has changes that in our opinion make sense on their own.
  It improves the handling of maximum numbers for different connection types (that are set during init and don’t change after) by:
  * moving all calculations into one place, `CConnMan::Init()`. Before, they were dispersed between `Init`, `CConnman::Init` and other parts of `CConnman`, resulting in some duplicated test code.
  * removing the possibility of having a negative maximum of inbound connections, which is hard to argue about
  * renaming of variables and doc improvements

ACKs for top commit:
  amitiuttarwar:
    co-author review ACK df69b22
  naumenkogs:
    ACK df69b22
  achow101:
    ACK df69b22

Tree-SHA512: 913d56136bc1df739978de50db67302f88bac2a9d34748ae96763288d97093e998fc0f94f9b6eff12867712d7e86225af6128f4170bf2b5b8ab76f024870a22c

Dash adaptations:
- src/init.cpp: -maxconnections help says 'automatic connections' and keeps Dash's '(temporary service connections excluded)' wording
- src/init.cpp: still sets connOptions.m_max_outbound_onion, now from the local nMaxConnections because Options::nMaxConnections is gone
- src/net.h: keeps Dash-only Options::m_max_outbound_onion and copies it in Init(); its comment now says m_max_automatic_outbound
- src/net.cpp: Dash's masternode-aware inbound eviction loop (while nInbound - nVerifiedInboundMasternodes >= ...) now uses m_max_inbound instead of the removed local nMaxInbound
- src/net.cpp: Dash-only GetMaxOutboundNodeCount() returns m_max_automatic_outbound because m_max_outbound was renamed
47e5c99 fuzz: add target for `DescriptorScriptPubKeyMan` (brunoerg)
641dddf fuzz: create ConsumeCoins (brunoerg)
2e1833c fuzz: move `MockedDescriptorConverter` to `fuzz/util` (brunoerg)

Pull request description:

  This PR adds fuzz target for `DescriptorScriptPubKeyMan`. Also, moves `MockedDescriptorConverter` to `fuzz/util/descriptor` to be used here and in `descriptor` target.

ACKs for top commit:
  maflcko:
    lgtm ACK 47e5c99 🏓
  dergoegge:
    ACK 47e5c99

Tree-SHA512: 519acca6d7b7a3a0bfc031441b02d5980b12bfb97198bd1958a83cd815ceb9eb1499a48a3f0a7fe20e5d06d83b89335d987376fc0a014e2106b0bc0e9838dd02

Dash adaptations:
- src/Makefile.test_fuzz.include: keeps Dash's test/util/mining.{h,cpp} entries in libtest_fuzz next to the new test/fuzz/util/descriptor.{h,cpp}
- src/test/fuzz/descriptor_parse.cpp: removes Dash's 5-key-type MockedDescriptorConverter; keeps Dash's includes (script/standard.h, no util/chaintype.h) and adds test/fuzz/util/descriptor.h
- src/test/fuzz/util/descriptor.{h,cpp}: moved converter has no x-only pubkey type (KEY_TYPES_COUNT 5, no IdIsXOnlyPubKey/XOnlyPubKey) because Dash has no taproot; this matches Dash's existing converter
- src/wallet/test/fuzz/scriptpubkeyman.cpp: SelectParams(CBaseChainParams::MAIN) instead of ChainType::MAIN, because Dash has no util/chaintype.h
- src/wallet/test/fuzz/scriptpubkeyman.cpp: uses CreateMockWalletDatabase() because Dash lacks CreateMockableWalletDatabase (bitcoin#26715)
- src/wallet/test/fuzz/scriptpubkeyman.cpp: deserializes CMutableTransaction without TX_WITH_WITNESS, because Dash has no witness serialization
- src/wallet/test/fuzz/scriptpubkeyman.cpp: calls GetNewDestination() with no argument (Dash's DescriptorScriptPubKeyMan has no OutputType parameter); keeps upstream's IsSingleType/GetOutputType checks
…riptor parsing targets

a44808f fuzz: rule-out too deep derivation paths in descriptor parsing targets (Antoine Poinsot)

Pull request description:

  This fixes the `mocked_descriptor_parse` timeout reported in bitcoin#28812 and direct the targets more toward what they are intended to fuzz: the descriptor syntax.

ACKs for top commit:
  sipa:
    utACK a44808f
  achow101:
    ACK a44808f
  dergoegge:
    ACK a44808f - Not running into timeouts anymore
  TheCharlatan:
    ACK a44808f

Tree-SHA512: a5dd1dbe9adf8f088bdc435addab88b56f435e6d7d2065bd6d5c6d80a32e3f1f97d3d2323131ab233618cd6dcc477c458abe3c4c865ab569449b8bc176231e93
fa3da62 Remove DirIsWritable, GetUniquePath (MarcoFalke)
fad3a97 Return LockResult::ErrorWrite in LockDirectory (MarcoFalke)
fa0afe7 refactor: Return enum in LockDirectory (MarcoFalke)

Pull request description:

  `GetUniquePath` is only used in tests and in `DirIsWritable`. The check by `DirIsWritable` is redundant with the check done in `LockDirectory`.

  Fix the redundancy by removing everything, except `LockDirectory`.

ACKs for top commit:
  TheCharlatan:
    Re-ACK fa3da62
  hebasto:
    ACK fa3da62, I have reviewed the code and it looks OK.

Tree-SHA512: e95f18cd586de7582e9c08ac7ddb860bfcfcbc8963804f45c5784c5e4c0598dc59ae7e45dd4daf30a5020dbf8433f5db2ad06e46a8676371982003790043c6c9

Dash adaptations:
- src/util/fs_helpers.cpp: the ErrorLock branch keeps Dash's existing LogError(...) call instead of upstream's error(...), then returns LockResult::ErrorLock as upstream does.
- src/util/system.cpp: drops the Dash-only leftover #include <util/getuniquepath.h>; that header is deleted and system.cpp uses nothing from it.
- ci/dash/lint-tidy.sh: removes the deleted src/util/getuniquepath.cpp from Dash's explicit iwyu file list (upstream already runs iwyu on all files, so it had no list entry).
@DCG-Claude
DCG-Claude force-pushed the backport-0.27-b007-misc branch from 74eb079 to ce0c409 Compare November 2, 2026 08:19
@DCG-Claude

Copy link
Copy Markdown
Collaborator Author

CI failed at ce0c409 on thepastaclaw/dash: Require a milestone

The 'Require a milestone' job failed because the pull request has no milestone set (MILESTONE: is empty in the log). It checks PR metadata and nothing in this branch's code, so a maintainer needs to set a milestone on the PR; changing the branch can't fix it.


🤖 backportsys, on behalf of the Dash backport pipeline.

@DCG-Claude

Copy link
Copy Markdown
Collaborator Author

CI failed at ce0c409 on thepastaclaw/dash: Require a milestone

This failure comes from the 'Require a milestone' check, which only looks at whether the pull request has a milestone set (MILESTONE is empty). It does not build or test any code from this branch. Setting a milestone on the PR will clear it; no code change is needed.


🤖 backportsys, on behalf of the Dash backport pipeline.

@DCG-Claude

Copy link
Copy Markdown
Collaborator Author

CI failed at ce0c409 on thepastaclaw/dash: Require a milestone

This check only fails because no milestone is set on the pull request (MILESTONE is empty in the log). It is PR metadata, not code: the branch doesn't touch .github/ and no commit can fix it. A maintainer needs to set a milestone, then the job should pass on a rerun.


🤖 backportsys, on behalf of the Dash backport pipeline.

@DCG-Claude
DCG-Claude merged commit 19871b0 into develop Nov 2, 2026
83 of 88 checks passed
@DCG-Claude

Copy link
Copy Markdown
Collaborator Author

merged as dashpay#7940

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.

1 participant