Skip to content

backport: v0.26 bitcoin#28565, bitcoin#28199 - #66

Open
DCG-Claude wants to merge 2 commits into
developfrom
backport-0.26-b055-misc
Open

DCG-Claude wants to merge 2 commits into
developfrom
backport-0.26-b055-misc

Conversation

@DCG-Claude

@DCG-Claude DCG-Claude commented Sep 20, 2026 •

Copy link
Copy Markdown
Collaborator

Automated Bitcoin Core v0.26 backports, batch backport-0.26-b055-misc.

upstream commit gates notes
bitcoin#28565 25ad91b0fb pick:pass build:pass tests:pass mech:warn tree:pass verify:pass Backports bitcoin#28565: adds the EnsureAddrman/EnsureAnyAddrman RPC helpers (taking Dash's CoreContext in place of std:
bitcoin#28199 d3c82afa39 pick:pass build:pass tests:pass mech:warn tree:pass verify:pass Backports the p2p_orphan_handling functional test, adapted to Dash: orphan parents are requested as MSG_DSTX, there is n
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 41b4beb on thepastaclaw/dash: linux64_nowallet-test / Test source, linux64_asan-test / Test source, linux64-test / Test source, linux64_multipro

The quoted log contains no test output at all — only post-job teardown (git config cleanup, docker rm, network removal) — and all six Test-source jobs failed simultaneously in the same way, which points at shared CI infrastructure rather than the test this commit adds. I re-checked the adapted test against the Dash node code it exercises (MSG_DSTX orphan-parent fetch at net_processing.cpp:4922, MSG_DSTX=16 in protocol.h, the NONPREF/OVERLOADED/GETDATA_TX_INTERVAL constants, AlreadyHave's txindex and recent-confirmed checks, the BlockDisconnected filter reset) plus the framework helpers it uses (bump_mocktime's update_schedulers kwarg, set_node_times already assigning node.mocktime), and found no divergence from upstream or Dash-specific breakage. Please rerun fork CI.


🤖 backportsys, on behalf of the Dash backport pipeline.

@DCG-Claude

Copy link
Copy Markdown
Collaborator Author

CI failed at 41b4beb on thepastaclaw/dash: linux64_tsan-test / Test source, linux64_multiprocess-test / Test source, linux64_nowallet-test / Test source, lin

The attached log is only GHA post-job teardown (container removal, orphan-process cleanup) — it contains no failing test, assertion or test_runner summary, and the failures are attributed to 'UNKNOWN STEP' in all six variants at once, which is the signature of an infrastructure/runner abort rather than a test failure. I re-checked each commit against Dash: the SipHash Span call sites all type-check (including the preserved Dash-only .Write(inv.type)), EnsureAnyAddrman matches Dash's CoreContext convention and rpc_net.py's hidden-RPC check was dropped with the RPC going public, the fuzz change is not run by 'Test source', and p2p_orphan_handling.py's MSG_DSTX=16, zero-delay DSTX parent requests, debug-log string and bump_mocktime signature all match Dash's sources. Please rerun fork CI; if it fails again, the full test_runner output (or the uploaded test_logs artifact) would let me pin the actual test.


🤖 backportsys, on behalf of the Dash backport pipeline.

@DCG-Claude

Copy link
Copy Markdown
Collaborator Author

CI failed at 41b4beb on thepastaclaw/dash: linux64_multiprocess-test / Test source, linux64-test / Test source, linux64_tsan-test / Test source, linux64_sqli

The quoted log contains only post-job teardown (git config, docker rm, network rm, "Cleaning up orphan processes") with every step marked UNKNOWN STEP -- there is no failing test, assertion or traceback attributable to the branch. Since 'Test source' only runs the functional suite, all six targets built fine, so the SipHash Span refactor is compile-clean; I re-checked the new p2p_orphan_handling.py against upstream 9eac5a0 and against Dash's MSG_DSTX orphan-parent fetch, zero-delay AddObjectAnnouncement, txindex-aware AlreadyHave and the MiniWallet API, and the getaddrmaninfo visibility change against its updated rpc_net.py expectation, and found no divergence. This looks like infrastructure/flake affecting all six jobs at once; please rerun.


🤖 backportsys, on behalf of the Dash backport pipeline.

@DCG-Claude DCG-Claude changed the title backport: v0.26 bitcoin#28085, bitcoin#28565, bitcoin#28656, bitcoin#28199 backport: v0.26 bitcoin#28085, bitcoin#28565, bitcoin#28199 Sep 26, 2026
@DCG-Claude
DCG-Claude force-pushed the backport-0.26-b055-misc branch from 41b4beb to 36f6a66 Compare September 26, 2026 15:35
@DCG-Claude

Copy link
Copy Markdown
Collaborator Author

Branch rewritten at 36f6a66bdc (3 backport(s)).


🤖 backportsys, on behalf of the Dash backport pipeline.

@DCG-Claude
DCG-Claude force-pushed the backport-0.26-b055-misc branch from 36f6a66 to 54fe4e8 Compare September 26, 2026 20:15
@DCG-Claude

Copy link
Copy Markdown
Collaborator Author

CI failed at 36f6a66 on thepastaclaw/dash: linux64_nowallet-test / Test source, linux64_tsan-test / Test source, linux64_multiprocess-test / Test source, lin

The persistent failures (feature_config_args.py 'Adding fixed seeds as 60 seconds have passed' and wallet_dump.py 'Flushing wallet.dat') came from the TestNode.setmocktime() wrapper added in the bitcoin#28199 backport. It records every setmocktime value in node.mocktime, and Dash's start() appends -mocktime=<node.mocktime> to the args on every restart, so a mock time set before a restart overrides the test's own -mocktime and leaves the restarted node on a stale, frozen clock. I removed the wrapper: Dash already tracks node.mocktime via set_node_times(), and the backported p2p_orphan_handling.py uses bump_mocktime rather than upstream's bumpmocktime(), so nothing depends on it. Not reproduced locally because the worktree has no build; the file was only checked to compile. (folded into the bitcoin#28199 commit)


🤖 backportsys, on behalf of the Dash backport pipeline.

e6e444c refactor: add and use EnsureAnyAddrman in rpc (stratospher)
bf589a5 doc: add release notes for bitcoin#27511 (stratospher)
3931e6a rpc: `getaddrmaninfo` followups (stratospher)

Pull request description:

  - make `getaddrmaninfo` RPC public since it's not for development purposes only and regular users might find it useful. [bitcoin#26988 (comment)](bitcoin#26988 (comment))
  - add missing `all_networks` key to RPC help. [bitcoin#27511 (comment)](bitcoin#27511 (comment))
  - fix clang format spacing
  - add and use `EnsureAddrman` in RPC code. [bitcoin#27511 (comment)](bitcoin#27511 (comment))

ACKs for top commit:
  0xB10C:
    Code Review re-ACK e6e444c
  theStack:
    Code-review ACK e6e444c
  pablomartin4btc:
    tested ACK e6e444c

Tree-SHA512: c14090d5c64ff15e92d252578de2437bb2ce2e1e431d6698580241a29190f0a3528ae5b013c0ddb76a9ae538507191295c37cab7fd93469941cadbde44587072

Dash adaptations:
- src/rpc/server_util.h: EnsureAnyAddrman takes Dash's `const CoreContext&` instead of upstream's `const std::any&`, matching every other EnsureAny* declaration in Dash's server_util.h
- src/rpc/server_util.cpp: same CoreContext signature adaptation for the EnsureAnyAddrman definition
- src/rpc/net.cpp: in RegisterNetRPCCommands, getaddrmaninfo moved from "hidden" to "network" as upstream does, while Dash-only hidden entries {cleardiscouraged} and {setmnthreadactive} are kept in place around the upstream {addconnection, addpeeraddress, sendmsgtopeer} block
- src/rpc/net.cpp: addpeeraddress body had a Dash-side stray blank line and a `const NodeContext&` (upstream non-const); both replaced wholesale by upstream's single `AddrMan& addrman = EnsureAnyAddrman(request.context);` line
- doc/release-notes-27511.md: upstream places pending notes in doc/release-notes/release-notes-NNNNN.md; Dash keeps pending per-PR notes flat in doc/ (doc/release-notes-28414.md, -29189.md) and reserves doc/release-notes/ for the archived doc/release-notes/dash/ tree, so the file was written at doc/release-notes-27511.md with identical content
9eac5a0 [functional test] transaction orphan handling (glozow)
61e77bb [test framework] make it easier to fast-forward setmocktime (glozow)

Pull request description:

  I was doing some mutation testing (through reckless refactoring) locally and found some specific behaviors in orphan handling that weren't picked up by tests. Adding some of these test cases now can maybe help with reviewing refactors like bitcoin#28031.

  - Parent requests aren't sent immediately. A delay is added and the requests are filtered by AlreadyHaveTx before they are sent, which means you can't use fake orphans to probe precise arrival timing of a tx.
  - Parent requests include all that are not AlreadyHaveTx. This means old confirmed parents may be requested.
  - The node does not give up on orphans if the peer responds to a parent request with notfound. This means that if a parent is an old confirmed transaction (in which notfound is expected), the orphan should still be resolved.
  - Rejected parents can cause an orphan to be dropped, but it depends on the reason and only based on txid.
  - Rejected parents can cause an orphan to be rejected too, by both wtxid and txid.
  - Requests for orphan parents should be de-duplicated with "regular" txrequest. If a missing parent has the same hash as an in-flight request, it shouldn't be requested.
  - Multiple orphans with overlapping parents should not cause duplicated parent requests.

ACKs for top commit:
  instagibbs:
    reACK bitcoin@9eac5a0
  dergoegge:
    reACK 9eac5a0
  achow101:
    ACK 9eac5a0
  fjahr:
    Code review ACK 9eac5a0

Tree-SHA512: 85488dc6a3f62cf0c38e7dfe7839c01215b44b172d1755b18164d41d01038f3a749451241e4eba8b857fd344a445740b21d6382c45977234b21460e3f53b1b2a

Dash adaptations:
- test/functional/p2p_orphan_handling.py: Dash requests missing orphan parents as MSG_DSTX (net_processing.cpp ~4922, to keep DSTX metadata for a parent that turns out to be a mixing tx), so wait_for_parent_requests asserts item.type == MSG_DSTX instead of MSG_WITNESS_TX, and the notfound in test_orphan_multiple_parents uses CInv(MSG_DSTX, ...)
- test/functional/p2p_orphan_handling.py: no wtxid relay in Dash -- relay_transaction announces MSG_TX with tx.rehash() instead of MSG_WTX with getwtxid(), and all txid/wtxid distinctions (assert child['txid'] != getwtxid(), witness-stripped parent, alternate-witness retry) are dropped
- test/functional/p2p_orphan_handling.py: TXREQUEST_TIME_SKIP drops TXID_RELAY_DELAY (no such delay in Dash) and uses OVERLOADED_PEER_OBJECT_DELAY, Dash's name for OVERLOADED_PEER_TX_DELAY
- test/functional/p2p_orphan_handling.py: uses the framework's self.bump_mocktime() rather than node.bumpmocktime(), so Dash's own self.mocktime and the node clocks stay in sync; the 12h inter-subtest skip passes update_schedulers=False because the mockscheduler RPC rejects deltas > 3600s
- test/functional/p2p_orphan_handling.py: drops upstream's nodes[0].setmocktime(int(time.time())) in run_test -- Dash's framework already runs every test on mocktime and resetting it would desync self.mocktime and move time backwards relative to the chain
- test/functional/p2p_orphan_handling.py: self.wallet_nonsegwit renamed self.wallet_p2pk ('nonsegwit' is meaningless in Dash); the second MiniWallet is kept, with upstream's per-subtest assignment, because it keeps the two UTXO pools separate -- test_orphans_overlapping_parents asserts all its utxos have confirmations > 0, which a single shared wallet would break after test_orphan_multiple_parents' send_self_transfer calls
- test/functional/p2p_orphan_handling.py: test_orphans_overlapping_parents announces inflight_parent_AB as MSG_DSTX; upstream needed txid == wtxid for the node to match the in-flight request against the missing input, the Dash analogue is matching the inv type, since the request tracker keys announcements on the full inv
- test/functional/p2p_orphan_handling.py: upstream's test_orphan_rejected_parents_exceptions reduces to its first (non-segwit) block, renamed test_orphan_rejected_parents; the two 'exception' blocks are segwit-only
- test/functional/test_framework/p2p.py: added GETDATA_TX_INTERVAL and OVERLOADED_PEER_OBJECT_DELAY (Dash's name for the constant); TXID_RELAY_DELAY omitted as Dash's net_processing has no such delay
- test/functional/test_framework/test_node.py: setmocktime wrapper sets self.mocktime = timestamp unconditionally instead of None-on-zero -- Dash uses 0, not None, as the 'no mocktime' sentinel (checked in __init__ and start() to decide whether to pass -mocktime)
- test/functional/test_framework/messages.py: added MSG_DSTX = 16 (from protocol.h) alongside the other inv type constants, so the test can express upstream's MSG_WITNESS_TX parent-request check

Not applicable to Dash (intentionally omitted):
- test/functional/p2p_orphan_handling.py: test_arrival_timing_orphan: it asserts the node delays orphan-parent requests so a spy cannot learn when a parent entered the mempool. Dash's AddObjectAnnouncement only delays MSG_TX invs (`if (inv.IsMsgTx() && !preferred && m_nodeman == nullptr)`), and orphan parents are fetched as MSG_DSTX, so they are requested with zero delay -- a deliberate Dash choice, documented in net_processing.cpp as matching pre-txrequest behavior. The privacy property being tested does not hold, so the subtest would fail rather than protect anything.
- test/functional/p2p_orphan_handling.py: test_orphan_inherit_rejection's witness half (the grandchild/child wtxid assertions and 'retried with an alternate witness' announcement): txid == wtxid in Dash, so there is no alternate witness to retry with. The txid-level half (grandchild inherits the rejection, child never re-requested) is kept.
- test/functional/p2p_orphan_handling.py: create_parent_and_child's getwtxid() return value: kept as child['txid'] since the helper is (as upstream) never called.
- test/functional/test_framework/test_node.py: TestNode.bumpmocktime(): Dash already has BitcoinTestFramework.bump_mocktime(), which additionally advances self.mocktime and each node's scheduler via mockscheduler. A node-level bumpmocktime would silently desync the framework clock (a later self.bump_mocktime would move node time backwards) and skip the scheduler, so it would be a trap rather than a helper. The adapted test uses self.bump_mocktime().
- test/functional/test_framework/test_node.py: `self.mocktime = None` at the end of TestNode.__init__: Dash already sets self.mocktime from the constructor's mocktime argument and compares it against 0 in __init__ and start(). Landing this line resets it to None after the fact, which makes start() append a literal `-mocktime=None` on every node restart -- it would have broken unrelated tests.
@DCG-Claude DCG-Claude changed the title backport: v0.26 bitcoin#28085, bitcoin#28565, bitcoin#28199 backport: v0.26 bitcoin#28565, bitcoin#28199 Oct 6, 2026
@DCG-Claude
DCG-Claude force-pushed the backport-0.26-b055-misc branch from 54fe4e8 to d3c82af Compare October 6, 2026 14:54
@DCG-Claude

Copy link
Copy Markdown
Collaborator Author

Branch rewritten at d3c82afa39 (2 backport(s)).


🤖 backportsys, on behalf of the Dash backport pipeline.

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