wallet: derivehdkey RPC to get xpub at arbitrary path - #32784
Conversation
|
The following sections might be updated with supplementary metadata relevant to reviewers and maintainers. Code Coverage & BenchmarksFor details see: https://corecheck.dev/bitcoin/bitcoin/pulls/32784. ReviewsSee the guideline and AI policy for information on the review process.
If your review is incorrectly listed, please copy-paste ConflictsReviewers, this pull request conflicts with the following ones:
If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first. LLM Linter (✨ experimental)Possible typos and grammar issues:
Possible places where comparison-specific test macros should replace generic comparisons:
2026-08-07 13:13:06 |
|
🚧 At least one of the CI tasks failed. HintsTry to run the tests locally, according to the documentation. However, a CI failure may still
Leave a comment here, if you need help tracking down a confusing failure. |
de7f5c6 to
3f35b02
Compare
There was a problem hiding this comment.
In util.h: “@params[in] path” → “@param[in] path” [Doxygen tag typo]
There was a problem hiding this comment.
addressesd -> addresses [extra “d” makes “addresses” misspelled]
|
Very nice, Concept ACK. |
380a57f to
017fb68
Compare
ParseHDKeypath() parsed each path element with ToIntegral<uint32_t>, so a bare decimal >= 2^31 (e.g. "m/2147483648" == 0x80000000) was silently treated as "m/0h". This commit rejects such overflow instead.
GetHDPubKeys() centralizes the descriptor xpub lookup used by gethdkeys and createwalletdescriptor, and by the derivehdkey RPC added in a later commit. The HDKeyFilter argument serves gethdkeys' active_only mode (Active vs All) and createwalletdescriptor's active descriptor selection. No behavior change, except the dynamic_cast now uses Assert() instead of gethdkeys' CHECK_NONFATAL, since it is not a recoverable input.
Reconstruct a descriptor's extended private key from its xpub by looking up the corresponding private key. This is the extended-key analog of GetKey() and is used by the derivehdkey RPC in the following commit.
Add an UnusedKey filter to GetHDPubKeys() so the new RPC can prefer unused(KEY) descriptors before falling back to active descriptors. Co-authored-by: w0xlt <94266259+w0xlt@users.noreply.github.com>
Use derivehdkey instead of extracting each participant xpub (and derivation info) from the listdescriptors output. Additionally use the new <0;1> descriptor syntax. Finally this commits adds a few debug log lines, and expand the explanation for why we use m/44h/1h/0h.
Use derivehdkey instead of extracting each participant xpub from the listdescriptors output. Additionally use the new <0;1> descriptor syntax.
|
Code looks good. One question following up on the earlier parent-key leakage discussion #32784 (comment):
Should private output require the final step to be hardened? possible diff if so.diff --git a/src/wallet/rpc/wallet.cpp b/src/wallet/rpc/wallet.cpp
index 054ab6b763..a98471c382 100644
--- a/src/wallet/rpc/wallet.cpp
+++ b/src/wallet/rpc/wallet.cpp
@@ -965,7 +965,7 @@ RPCMethod derivehdkey()
{
{"path", RPCArg::Type::STR, RPCArg::Optional::NO, "BIP 32 derivation path with at least one hardened step."},
{"options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "", {
- {"private", RPCArg::Type::BOOL, RPCArg::Default{false}, "Show private key"},
+ {"private", RPCArg::Type::BOOL, RPCArg::Default{false}, "Show private key. The final derivation step must be hardened"},
{"hdkey", RPCArg::Type::STR, RPCArg::DefaultHint{"Either the HD key of an unused(KEY) descriptor, or any other active descriptor."}, "The HD key that the wallet knows the private key of, listed using 'gethdkeys', to use for derivation"},
}},
},
@@ -998,6 +998,9 @@ RPCMethod derivehdkey()
if (!HasHardenedDerivation(path)) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Derivation path requires at least one hardened step");
}
+ if (priv && !(path.back() >> 31)) {
+ throw JSONRPCError(RPC_INVALID_PARAMETER, "Private key output requires a hardened final derivation step");
+ }
LOCK(wallet->cs_wallet);
diff --git a/test/functional/wallet_derivehdkey.py b/test/functional/wallet_derivehdkey.py
index 8905c55e68..6c741233bb 100755
--- a/test/functional/wallet_derivehdkey.py
+++ b/test/functional/wallet_derivehdkey.py
@@ -73,8 +73,8 @@ class WalletDeriveHDKeyTest(BitcoinTestFramework):
too_deep_path,
)
- xpub_info = wallet.derivehdkey("m/87h/0h/0h/0")
- xpub_priv_info = wallet.derivehdkey("m/87h/0h/0h/0", private=True)
+ xpub_info = wallet.derivehdkey("m/87h/0h/0h/0h")
+ xpub_priv_info = wallet.derivehdkey("m/87h/0h/0h/0h", private=True)
xprv = xpub_priv_info["xprv"]
assert_equal(xpub_priv_info["xpub"], xpub_info["xpub"])
@@ -99,11 +99,11 @@ class WalletDeriveHDKeyTest(BitcoinTestFramework):
-13,
"Error: Please enter the wallet passphrase with walletpassphrase first",
wallet.derivehdkey,
- "m/87h/0h/0h/0",
+ "m/87h/0h/0h/0h",
private=True,
)
with WalletUnlock(wallet, "pass"):
- xpub_info = wallet.derivehdkey("m/87h/0h/0h/0", private=True)
+ xpub_info = wallet.derivehdkey("m/87h/0h/0h/0h", private=True)
# Unused(KEY) is preferred over active descriptors and is not
# rotated on encryption.
assert_equal(xpub_info["xprv"], prev_xprv)
@@ -140,6 +140,18 @@ class WalletDeriveHDKeyTest(BitcoinTestFramework):
active_xpub = wallet.gethdkeys(active_only=True)[0]["xpub"]
assert_equal(wallet.derivehdkey("m/44h/1h/0h", hdkey=active_xpub), xpub_info)
+ # An xprv at an unhardened child, together with its exposed parent
+ # xpub, would reveal the parent xprv. Public output remains allowed.
+ unhardened_path = "m/44h/1h/0h/0"
+ assert "xprv" not in wallet.derivehdkey(unhardened_path)
+ assert_raises_rpc_error(
+ -8,
+ "Private key output requires a hardened final derivation step",
+ wallet.derivehdkey,
+ unhardened_path,
+ private=True,
+ )
+
# Get the activate wpkh() receive descriptor
desc = list(filter(lambda d:
d["active"] and not d["internal"] and d["desc"][0:3] == "pkh", |
I think anyone who obtains xprv's should be careful, not sure if adding restrictions makes sense. |
|
This is in a good state IMO. |
|
ACK c3945bf |
|
This needs a release note! |
|
@davidgumberg it's in |
Oops, I looked at the commit list. My bad |
…rbitrary path
c3945bfd2bf87ae6fe7be1c0cee58b21c4269aec doc: use derivehdkey in multisig tutorial (Sjors Provoost)
3662e3366978e1ecff1924da100cd2606899126e test: use derivehdkey in M-of-N multisig demo (Sjors Provoost)
d9570f0838355bca638ac3287fd334905fb29e16 rpc: add derivehdkey (Sjors Provoost)
62da9f9614508f6bfd30126a73c59d0c4004066e wallet: add GetExtKey helper (Sjors Provoost)
aaf1548475ded41889d5041fc2d60e8b2ca9ddcd wallet: generalize GetActiveHDPubKeys helper (Sjors Provoost)
3821452c4af1440484ddd5ccc83f83cc4c307af3 refactor: add hardened derivation helper (Sjors Provoost)
0ab61caafd10d0539da626bd4354cb7e6df15e54 rpc: ParsePathBIP32 helper (Sjors Provoost)
e36c4b76e198751c14da8d32655e47bd5678abb6 util: reject out-of-range BIP32 keypath indices (Sjors Provoost)
ba78c31a00c912ec440dfb677997b51c72058bab fuzz: check ParseHDKeypath/WriteHDKeypath round-trip (Sjors Provoost)
8cce969085dbe3137c738cbe691008974059af1e Have ParseHDKeypath handle h derivation marker (Sjors Provoost)
fc5307776236c6f08aec94978672626f5aae1aaa test: move parse_hd_keypath test to bip32_tests (Sjors Provoost)
dab525eb7717af3b246a5aa32acea174cd9bd453 key: add DeriveExtKey() helper (Sjors Provoost)
Pull request description:
Adds a `derivehdkey` RPC that returns an xpub, or optionally the xprv, at an arbitrary BIP32 path (with at least one hardened step), derived from a wallet HD key.
The main use case is coordinating a multisig setup, where each participant shares an xpub derived at a hardened path (e.g. `m/87h/0h/0h`) distinct from their default single-signature descriptors. See the (updated) `doc/multisig-tutorial.md` and (updated) functional test to see how that workflow improves.
The first commits are some helpful helpers:
- _key: add DeriveExtKey() helper_ - performs the actual derivation
- _test: move parse_hd_keypath test to bip32_tests_ - from `psbt_wallet_tests`
- _Have ParseHDKeypath handle h derivation marker_
- _util: reject out-of-range BIP32 keypath indices_ - `ParseHDKeypath` would previously map overflowing values without `h` to hardened.
- _fuzz: check ParseHDKeypath/WriteHDKeypath round-trip_
- _rpc: ParsePathBIP32 helper_
- _refactor: add hardened derivation helper_ - `HasHardenedDerivation()`, to enforce the "at least one hardened step" rule
- _wallet: generalize GetActiveHDPubKeys helper_ - extracts code from `gethdkeys` which `derivehdkey` needs
- _wallet: add GetExtKey helper_ - reconstruct an xprv from a wallet xpub (analog of `GetKey()`); behavior-preserving prep, also simplifies `gethdkeys`.
Meat and potatoes:
- _rpc: add derivehdkey_ - the RPC itself, plus the `UnusedKey` filter on `GetHDPubKeys` that drives key selection.
- _test: use derivehdkey in M-of-N multisig demo_ - rewrites the functional multisig test to use the RPC and `<0;1>` syntax.
- _doc: use derivehdkey in multisig tutorial_ - same for the prose tutorial.
ACKs for top commit:
pseudoramdom:
code review ACK c3945bfd2bf87ae6fe7be1c0cee58b21c4269aec
achow101:
ACK c3945bfd2bf87ae6fe7be1c0cee58b21c4269aec
w0xlt:
That being the case, ACK c3945bfd2b
Tree-SHA512: 661f17c9bfe26017eb14c27ba7af37093387100d3baa25f5d29bba9c1aedc40d19afe1bdfc126a18d018857bb02f1fc84386f10b8f4f4b8e9d6f4b0691d9e302
777aee7 refactor: deduplicate keypath element parsing (pythcoiner) 7d8fddf refactor: define BIP32_HARDENED and BIP32_UNHARDENED constants (pythcoiner) Pull request description: The codebase used raw `0x80000000` (and implicit `0`) as the bip32 hardened / unhardened flag. `ParseHDKeypath` and `ParseKeyPathNum` were two separate parsers for BIP32 keypath elements, #32784 aligned their rules (both accept ' and h as hardened marker and reject indexes > 0x7FFFFFFF), but the parsing logic itself was still duplicated. This PR: - Define `BIP32_HARDENED_FLAG` / `BIP32_UNHARDENED_FLAG` constants to replace magic `0x80000000` and `0` literals. - Add `ParseKeyPathElement` as bip32 parsing util and use it consistantly in `ParseHDKeyPath` and the descriptor keypath parser. ACKs for top commit: Sjors: ACK 777aee7 achow101: ACK 777aee7 Tree-SHA512: fb096eef82bb5a90baa7de41f5562b935665ee4b64c41586cf89e06c5633be44063a35a89d01a1432c8e63222d94bd06840bafc2a837f252013e317de0f5837a
…462c683d4 97462c683d4 kernel: Add script tracer ea7d459ac08 Merge bitcoin/bitcoin#36057: build: check for SetThreadDescription() at configure time 204256c73f2 Merge bitcoin/bitcoin#35900: iwyu: Fix warnings in `src/interfaces` and treat them as errors da1cb4dd90e Merge bitcoin/bitcoin#35586: doc: note -blocknotify is not run during IBD/reindex in help text b31aae4f9af Merge bitcoin/bitcoin#36094: ci: bump riscv toolchain to tag 2026.08.25 607f220c6cf Revert "ci: use mirror for riscv submodules" 64af18f4e6d ci: bump riscv toolchain to tag 2026.08.25 fd573f6db9d Merge bitcoin/bitcoin#36044: test: cover OP_SUCCESSx bypassing the initial stack element size limit 2224e4af6ce Merge bitcoin/bitcoin#35850: fuzz: Implement `connect_block` harness 2777300c68f fuzz: Implement connect_block harness bed46bd16c2 build: check for SetThreadDescription() at configure time 40add915be5 test: Add reset to CuckooCache a24110cef7f Merge bitcoin/bitcoin#36092: fix: UB sanitizer in mempool estimator logging 8b84f917789 Merge bitcoin/bitcoin#36088: util: Set Univalue to null after read failure 576a0ebb536 fix: UB sanitizer in mempool estimator logging 5f45583e437 Merge bitcoin/bitcoin#36077: bugfix: give TxDownloadManager its own RNG fa72de78a93 util: Set Univalue to null after read failure fa7786592d7 test: Add UniValue failed read test e339043ee9e Merge bitcoin/bitcoin#35829: http: Make class fields private and make HTTPResponse a struct 031175197f1 Merge bitcoin/bitcoin#36032: rpc: avoid quadratic output lookups b91d983f66f Merge bitcoin/bitcoin#36078: qa: Reduce `-maxconnections` in the functional test framework 0f5c6d0b64a Merge bitcoin/bitcoin#35618: depends: Make tarball creation from local directory reproducible b8a8893bf2a qa: Lower `-rpcmaxconnections` in `interface_http.py` test 6f4109b4489 qa: Reduce `-maxconnections` in the functional test framework 80eaa6cabf2 bugfix: give TxDownloadManager its own RNG 5e0d7a286a4 refactor: Drastically narrow scope of http_bitcoin namespace and rename it to bitcoin_http 8f9fd8698a7 refactor: Make HTTPRemoteClient fields private d72f67fd6c9 refactor: Expose additional HTTPRemoteClient fields through accessors 10bbae302fb refactor: Expose HTTPRemoteClient fields to tests through methods 5b06d908316 refactor: Replace HTTPServer::MaybeDispatchRequestsFromClient() with HTTPRemoteClient::TryReadRequest() 794a753958a Merge bitcoin/bitcoin#35583: test: close the listeners before terminating the event loop f6b3f2ff6b1 Merge bitcoin/bitcoin#36064: qa: Minor improvement follow-ups to 35730 6a028161daf Merge bitcoin/bitcoin#36025: psbt: avoid duplicate taproot leaf script keys when merging 07d92a9d65a Merge bitcoin/bitcoin#35516: rpc: preserve global xpubs and proprietary fields in joinpsbts 4375d74d24c Merge bitcoin/bitcoin#34993: wallet: `NotifyCanGetAddressesChanged` when advancing `next_index` 290be9eafa4 qa: Minor feature_init.py improvements 6248331b295 qa: Switch to warning when skipping tests 04cf9ecee43 Merge bitcoin/bitcoin#35978: contrib/init: fix unused variables in openrc script aed80c73958 Merge bitcoin/bitcoin#36067: test: Remove `BOOST_CHECK_CLOSE` in favor of exact comparison 07ca9ba9e84 Merge bitcoin/bitcoin#36059: test: make index crash test check saved state 402f1fdae6a Merge bitcoin/bitcoin#36063: refactor: [test] Remove deprecated SetMockTime(i64) alias 135e05cfa07 Merge bitcoin/bitcoin#36046: fuzz: Use ImmediateBackgroundTaskRunner in process_messages 9e115edd39f test: Remove `BOOST_CHECK_CLOSE` in favor of exact comparison 6d570415a01 refactor(qa): Move check right below related check 7e3b60584b3 refactor(qa): Simplify through using assert_raises() fad1e6bf238 util: refactor: Remove deprecated SetMockTime(i64) alias faf87c3535c test: refactor: Use FakeNodeClock over manual/global SetMockTime 994c17d6c0a Merge bitcoin/bitcoin#34697: descriptor: fix musig() duplicate key checks and doubled PSBT origin paths a1183c02aac refactor: Extract Send() and Receive() into HTTPRemoteClient from HTTPServer 6d9b61d4f8d refactor: Extract HTTPRemoteClient::MaybeDisconnect() from HTTPServer::DisconnectClients() 6fec8d6914b refactor: Make HTTPRequest fields private b8cd77237b3 refactor: Make HTTPRequest::GetHeader() return saner optional type 1cb416397b7 psbt: avoid duplicate taproot leaf script keys when merging 32765aca5c3 Merge bitcoin/bitcoin#35730: http: limit connected HTTPRemoteClients a3335994a84 Merge bitcoin/bitcoin#35580: bugfix: compare non-adjusted chunk weight against block weight limit 0ea81904ebd Merge bitcoin/bitcoin#35933: psbt: don't abort on invalid MuSig2 derivations 7ea36e985a9 test: preserve index crash test state 5aa15df60c4 test: expose missing index crash checkpoint b3ff9c4d683 iwyu: Fix warnings in `src/interfaces` and treat them as errors d564b0255f7 iwyu: Add temporary mapping to work around upstream bug 58a7869f860 Merge bitcoin/bitcoin#36051: ci: use ruff 0.16.x f5e91c6fbae Merge bitcoin/bitcoin#35884: util: set os-level thread names on Windows a1e27162257 Merge bitcoin/bitcoin#36045: test: avoid undersized Boost.Test signal stacks 9d0c38db746 ci: use mypy 2.3.1 7a53beca06a ci: use pyzmq 27.2.0 f29f076f3c2 ci: use ruff 16 7dcb7f09ed6 Merge bitcoin/bitcoin#34075: fees: Introduce Mempool Based Fee Estimation to reduce overestimation 5e8586ec5b0 Merge bitcoin/bitcoin#36019: bench: Construct CTxOut and COutPoint in a single expression 950bdb763e1 bench: Construct CTxOut and COutPoint in a single expression bf8402c8803 Merge bitcoin/bitcoin#32958: wallet/refactor: Update SignPSBTInput to return util::Expected<void, PSBTError> and remove PSBTError:Ok 02306cc915c Merge bitcoin/bitcoin#35161: consensus: document merkle mutation root invariant fae6665f013 fuzz: Use ImmediateBackgroundTaskRunner in process_messages 9eba3aafa6c test: avoid undersized Boost.Test signal stacks 747cff84248 rpc: avoid quadratic output lookups 7f9c4e29289 doc: add release notes e18d392689d test: add mempool estimator i/o fuzz test 970f02096d3 fees: persist mempool policy estimator data 7dcb37989d2 fees: move fee_estimates.dat into fees directory 0db2b69e6db rpc: add verbosity option to estimatesmartfee options 06bb65730eb fees: gate mempool estimates on recent block coverage cfe585df25c validation: emit block mempool removal signal from ConnectTip 0d88558f951 fees: return mempool estimates when it's lower than block policy 56db08d5291 Merge bitcoin/bitcoin#35877: build: ci/doc win64-cross build via nix 693b1351aff fees: add caching to MemPoolFeeRateEstimator c9bb3df29ff fees: add MemPoolFeeRateEstimator class 558e26e66e0 test: cover OP_SUCCESSx bypassing the initial stack element size limit e5be0dc35e8 refactor: Make HTTPResponse a struct since all fields are public 69c61f9f2f3 Merge bitcoin/bitcoin#36034: Release: Prepare "Translation string freeze" step 87b8a4ee506 Merge bitcoin-core/gui#944: Fix out-of-bounds read in RPCParseCommandLine on empty command f9cc0c020c2 Merge bitcoin/bitcoin#36020: doc: Correct after HTTPRequest::m_client changed to weak_ptr 5a431c957d1 qt: Update `src/qt/locale/bitcoin_en.ts` translation source file 08dfaa04f4c Merge bitcoin/bitcoin#36018: test: [refactor] Properly use BOOST_CHECK_EXCEPTION fa0fe212f52 test: [refactor] Properly use BOOST_CHECK_EXCEPTION 436921eb469 test: check joinpsbts preserves global xpubs and proprietary fields 011094b282b rpc: preserve global xpubs and proprietary fields in joinpsbts 367b2202a49 Merge bitcoin/bitcoin#35665: psbt: avoid duplicate global xpub keys when merging bab030a6feb Merge bitcoin/bitcoin#35859: wallet: use unsigned KDF iteration count 21ee7f6c00b Merge bitcoin/bitcoin#35069: Refactor keypath parser a07f1313b14 Merge bitcoin/bitcoin#35980: contrib: reject divergent verify-commits history 32dfed44a2a Merge bitcoin/bitcoin#36012: psbt: Remove unused `IsNull()` methods 8c366094b89 Merge bitcoin/bitcoin#35956: fuzz: scope fake clocks to target phases 4d86d9cc7ed Merge bitcoin/bitcoin#35968: test: sync funding block before isolating nodes 8c1d776bf2c Merge bitcoin/bitcoin#35965: test: Tighten Coin equality and add debug output fa8762da626 build: ci/doc win64-cross build via nix fafe7205cc8 doc: Clarify that cygwin/msys2 are not tested/supported 4b991d7b5fe Merge bitcoin/bitcoin#34239: depends: Hash included makefiles in package checksums fe5e2a6319b Merge bitcoin/bitcoin#32162: depends: Switch from multilib to platform-specific toolchains 4e5327bc988 fuzz: refactor: scope fake clocks to target phases 15e5c35c451 doc: Correct comments after HTTPRequest::m_client was changed from shared to weak pointer 1156ce67545 test: Tighten `Coin` equality and add debug output 59224b66aa1 Merge bitcoin/bitcoin#36008: wallet: WalletBatch->WriteVersion respect argument 2c16efbb7b5 psbt: Remove unused IsNull() methods dd669f40b98 util: set os-level thread names on Windows b88bffe550a Merge bitcoin/bitcoin#36010: test: Print os exit code on failure 0fd515bbb70 Merge bitcoin/bitcoin#36009: miniscript: remove unused context argument from ParseHexStr 15a7a4ed7c4 Merge bitcoin/bitcoin#35952: kernel: prevent dangling iterators from temporary ranges ac6b6c1f06e Merge bitcoin/bitcoin#35680: private broadcast: bound rebroadcast attempts to 1,000 d411bb02ff8 Merge bitcoin/bitcoin#35993: guix: build glibc with `--enable-kernel=3.17.0` fada80192bd test: Print os exit code on failure 381c3312191 Merge bitcoin/bitcoin#36007: http: Make HTTPRequest::m_client a weak_ptr 82b3bfe38c0 Merge bitcoin/bitcoin#35797: psbt: support output metadata updates before inputs are added 681b429393e Merge bitcoin/bitcoin#35986: p2p: reconsider orphans when missing inputs are mined 16f4bd15bc9 Merge bitcoin/bitcoin#35954: qa: Disable Qt's glib event dispatcher for GUI tests on OpenBSD 1fdd208c1ce miniscript: remove unused context argument from ParseHexStr 4ca07c2fb3d Merge bitcoin/bitcoin#35963: doc : update cjdns docs to discourage using onlynet option 4b4ae6e37c5 Merge bitcoin/bitcoin#35995: doc: fix outdated URL in hash_tests.cpp a23df4bfa87 Merge bitcoin/bitcoin#35946: rpc: Improve some type specs for openrpc 20ad7c9eab8 Merge bitcoin/bitcoin#35955: wallet: remove orphaned GetAffectedKeys and LegacyScriptPubKeyMan declarations 979a42ec173 http: Make HTTPRequest::m_client a weak_ptr cf36df070b4 Wallet: Check crypter return values 777aee77d12 refactor: deduplicate keypath element parsing 7d8fddfba25 refactor: define BIP32_HARDENED and BIP32_UNHARDENED constants e4d80e7001e test: close the loop after the network thread has completed 29fba5ddbb9 test: close the listeners before terminating the event loop bd4b1524eab init: do not count file descriptors for HTTPServer if -server=0 b08662060db init: account for maximum file descriptors needed by HTTP 158efbc723d doc: fix outdated URL in hash_tests.cpp 9cacf677a91 rpc: add fee_rate_estimator option to estimatesmartfee ba6c61bbdd3 fees: add FeeRateEstimatorManager class 2cb6b831e03 fees: add EstimateFeeRate and MaximumTarget to CBlockPolicyEstimator 5adb2ab0843 refactor: test block policy estimator directly 9c8309a8909 test: rename policy estimator tests to block policy estimator tests e3d5ef1b5fb fees: move StringForBlockPolicyEstimateReason to block policy estimator 74245c20e05 fees: split wallet and estimator fee reasons ec5d19665b8 wallet: WalletBatch->WriteVersion respect argument. cc2acebefb0 http: configure simultaneous connection limit with -rpcmaxconnections b3d6d2d1a7e http: limit connected clients to 16 86651d81971 scripted-diff: Rename nUserBind, nBind, nMaxConnections to snake_case 5548818115c guix: build glibc with --enable-kernel=3.17.0 f72537037d3 Merge bitcoin/bitcoin#35972: fuzz: Fix assertion in `txorphan` 4800cb7aea0 Merge bitcoin/bitcoin#35735: Add state to HTTPRequest e0992599a63 Merge bitcoin/bitcoin#35846: test: Use throwing config parser getters without fallback e5977f0b9e5 Merge bitcoin/bitcoin#35982: Update minisketch subtree to latest master fe7dbde52c9 Merge bitcoin/bitcoin#35976: test: Speedup fee estimation functional test with batching 9cc7dc50bdc p2p: reconsider orphans when missing inputs are mined c90c23d388f Merge bitcoin/bitcoin#35531: txindex: hash keys and pack positions to reduce disk usage 2dcb2c6df20 Update minisketch subtree to latest master 461e3be8d3d Squashed 'src/minisketch/' changes from d1bd01e189..4a179c61e3 05c36d9fadc Merge bitcoin-core/gui#957: fix: add .dat file extension automatically when exporting watchonly 75a4e6c6788 gui: fix allow restore wallets without .dat file extension a8b582ec1d2 Merge bitcoin/bitcoin#32784: wallet: derivehdkey RPC to get xpub at arbitrary path 465bca734eb contrib: reject divergent verify-commits history b3d1dca3388 contrib: fail on verify-commits ancestry errors d837bb38a44 contrib/init: fix unused variables in openrc script fe7d475d450 private broadcast: bound broadcast attempts per tx to 1k b3d77ea0275 test: Speedup fee estimation functional test with batching 683e05a265c Merge bitcoin/bitcoin#35889: rpc: avoid quadratic `gettxspendingprevout` work and preserve order 230185a5ee7 Merge bitcoin/bitcoin#35971: net_processing: remove unused code ae36e2ef798 rpc: avoid quadratic prevout resolution da1eaeb3507 rpc: preserve `gettxspendingprevout` order f98753e7621 refactor: identify prevouts by request index 221a3fe5cfb test: cover mixed `gettxspendingprevout` order 02de12b1e61 wallet: remove remaining LegacyScriptPubKeyMan references d194be69d60 wallet: remove orphaned GetAffectedKeys declaration 01dde6b2057 fuzz: Fix assertion in txorphan dec68f997e7 Merge bitcoin/bitcoin#35852: scripted-diff: Use inline const(expr) over static constexpr in headers e95bab98f03 Merge bitcoin/bitcoin#35960: common: remove `::runtime_error` from `RunCommandParseJSON` aad830ac4a6 Merge bitcoin/bitcoin#35847: test: move more tests to `baseindex_tests` and run them for all indexes b76afff2749 Wallet: Use unsigned KDF iteration count e07d826e0eb rpc: Fix type in ApplyTypeStrOverride 0cff3cc5187 net_processing: Remove redundant porphanTx in ProcessOrphanTx c7eacbd45b0 net_processing: remove Peer& from UpdatePeerStateForReceivedHeaders 8454fb2bd74 test: sync funding block before isolating nodes 8b5da677d7b common: remove ::runtime_error from RunCommandParseJSON 25bed560bed test: add forward-compat functional test for txindex 703304ed8c1 doc: add release notes for txindex disk usage and downgrading 8e5320a2d24 tests: cover txindex hash prefix collisions and legacy fallback b75efa19ba8 txindex: skip bloom filters and legacy lookups for new databases 004d7c098ca txindex: hash key prefixes and pack block positions 5a255970fd1 refactor: move txindex db constants and legacy key to txindex_key.h 327660134cb txindex: pass the full block to DB::WriteTxs 42771e79980 txindex: use a new block locator for downgrade safety 4b08baed72c txindex: return optional tx and block hash from FindTx fc0dcf950f9 kernel: keep range iterators tied to their owner 0936c55f626 test: characterize kernel range iterators ef501a63d9d consensus: document merkle mutation root invariant 11090c8bb35 Merge bitcoin/bitcoin#35951: doc: release note about I2P ElGamal sunset beefda21be3 doc : update cjdns docs to discourage using onlynet option b2c45888fde Merge bitcoin/bitcoin#35866: test: Verify unwelcome RPC clients are rejected before reading their requests c0792889673 psbt: update output metadata without inputs 4f5712476a3 test: characterize P2WSH miniscript output e24e8fa2a68 test: characterize PSBT output metadata 625f951ba2f Merge bitcoin/bitcoin#35959: Update secp256k1 subtree to latest master e9ed5e83a39 Merge bitcoin/bitcoin#35605: wallet: rpc: Deprecate `removeprunedfunds` RPC 800ad9c3c0c doc: release note I2P ElGamal sunset 2f72123f613 Merge bitcoin/bitcoin#35867: test: classify SOCKS5 peers via getpeerinfo addrbind f464f6cd67e Update secp256k1 subtree to lastest master 09cc345c3e3 Squashed 'src/secp256k1/' changes from d2d04864ef..687155df6b c94074fa1b1 rpc: Surface OBJ_USER_KEYS description for openrpc c020c21d543 rpc: Handle skip type args for openrpc e33410d8884 fuzz: document arbitrary mocktimes 4c045f1a032 Merge bitcoin/bitcoin#35945: depends, qt: Add patch for missing headers b0615672352 Merge bitcoin/bitcoin#35947: build, msvc: Update vcpkg manifest baseline 1f5c46f7ce2 Merge bitcoin/bitcoin#35931: ci: Check DLL imports of cross-built `bitcoind.exe` b42f7fade0c descriptor: don't prepend key origins twice 7b15e2cb442 descriptor: fix duplicate check for hardened keys 1bec7fa22c9 Merge bitcoin/bitcoin#35496: kernel: add `btck_set_mock_time` for testing time-dependent paths c1967c4453b Merge bitcoin/bitcoin#35950: Update leveldb subtree to latest master 512dc9af1b1 Merge bitcoin/bitcoin#35930: wallet: post-#35501 cleanups in CWalletTx b970bb34d0c Merge bitcoin/bitcoin#33585: cmake: Use builtin support for .manifest files de2adc308a4 qa: Disable Qt's glib event dispatcher for GUI tests on OpenBSD aa0e0f793fe Merge bitcoin/bitcoin#35729: refactor: test: Unroll `&&` conditions in macros 3e76d22de25 Update leveldb subtree to latest master 9f10ef5e96d Squashed 'src/leveldb/' changes from a7f9bdc611..13da2d6758 2c01832f7be Merge bitcoin/bitcoin#35493: wallet, descriptor: Fix MuSig private key completeness checks on `importdescriptors` b80cee03619 Merge bitcoin/bitcoin#35924: Wallet, refactor: Remove orphaned EraseWatchOnly function 5d051c05629 Merge bitcoin/bitcoin#35943: doc: fix dead link in txrequest.h 4ca182ca402 doc: clarify alternate_wtxids is empty when only one witness variant fa48b5d28eb test: assert listsinceblock "removed" reports current canonical wtxid 9b96ee12881 wallet, test: add unit test for variant txid validation in CWalletTx deserializer 9de6543cb55 wallet: post-#35501 cleanup in CWalletTx e2bf51543ad build, msvc: Disable default features of the `sqlite3` package a31425610af build, msvc: Update vcpkg manifest baseline 757aa573c45 Merge bitcoin/bitcoin#33186: wallet, test: Ancient Wallet Migration from v0.14.3 (no-HD and Single Chain) e8cc21c57f9 Merge bitcoin/bitcoin#35925: wallet, rpc: Exclude non-owned addresses from listreceivedby* e8500cbd19d depends, qt: Add patch for missing headers 9954aa77280 http: don't parse any new requests from a client if m_req_busy = true c7db3ae1f90 test: cover HTTPRequest state machine 90676e24ad1 Add state to HTTPRequest to avoid duplicate work over I/O cycles 99497b38f6c cmake: Unconditionally add .rc files to sources 654a4cf5e69 cmake: Use builtin support for .manifest files 8f695379f31 cmake: Unconditionally set WIN32_EXECUTABLE target property 507e528e845 http: reuse HTTPHeaders to parse chunked trailer 902d8908c94 http: only read one HTTPRequest at a time per client a7b0b5084a4 doc: fix dead link in txrequest.h 1d386c250f2 Merge bitcoin/bitcoin#35941: doc: remove mention of `::wsystem` 57246934e71 doc: remove mention of wsystem 5973e075882 Merge bitcoin/bitcoin#35937: test: Append print_suppressions=0 to LSAN_OPTIONS, and suppress bitcoin-qt b6bd573eb97 Merge bitcoin/bitcoin#34794: rest: add Cache-Control headers to REST responses d055a3ab100 test: verify disallowed RPC clients are rejected upon `accept()` 128456b62d5 Merge bitcoin/bitcoin#35260: doc: clarify test placement guidance fad9ab714b5 test: Append print_suppressions=0 to LSAN_OPTIONS, and suppress bitcoin-qt 05a7c470d28 Merge bitcoin/bitcoin#35822: fuzz: reset SOCKS5 interrupt between inputs 73a94b45459 psbt: avoid aborting on invalid MuSig2 derivations e3d1e75a519 test: characterize MuSig2 derivation aborts 1be0b46297c Merge bitcoin/bitcoin#35898: rpc: fix mempool entry vsize docs 5f4d5626e7f Merge bitcoin/bitcoin#35908: doc: Update NetBSD Build Guide 8397e09e6ba Merge bitcoin/bitcoin#35928: doc: mention -DWITH_ZMQ=ON in macOS build guide 4b4e63f2823 Merge bitcoin/bitcoin#35704: windows: remove deprecated codecvt via UTF-8 narrow APIs 67fee5bf440 ci: Check DLL imports of cross-built `bitcoind.exe` 089c883c558 test: Add coverage for listreceivedby* excluding "send" addresses 873c0548059 wallet: Exclude non-owned addresses from listreceivedby* c3945bfd2bf doc: use derivehdkey in multisig tutorial 3662e336697 test: use derivehdkey in M-of-N multisig demo d9570f08383 rpc: add derivehdkey 62da9f96145 wallet: add GetExtKey helper 222855ed112 doc: mention -DWITH_ZMQ=ON in macOS build guide aaf1548475d wallet: generalize GetActiveHDPubKeys helper 3821452c4af refactor: add hardened derivation helper 0ab61caafd1 rpc: ParsePathBIP32 helper e36c4b76e19 util: reject out-of-range BIP32 keypath indices ba78c31a00c fuzz: check ParseHDKeypath/WriteHDKeypath round-trip 8cce969085d Have ParseHDKeypath handle h derivation marker fc530777623 test: move parse_hd_keypath test to bip32_tests dab525eb771 key: add DeriveExtKey() helper 71c06c5cbcd Merge bitcoin/bitcoin#35830: fees: Return false for incompatible fee estimates 55dfc244143 Merge bitcoin/bitcoin#35915: Release: Prepare "Open Transifex translations for `v32.0`" step f11dc6170ed Merge bitcoin/bitcoin#35482: fuzz: exercise the transaction-handling path in process_message(s) 6f906106d73 Merge bitcoin/bitcoin#35879: ci: Fix $BASE_ROOT_DIR installation d36bf709f7f Merge bitcoin/bitcoin#35914: test, fuzz: Remove unused variables ed2c59ab654 Merge bitcoin/bitcoin#35896: refactor: Default uint256::operator==, add operator<=> fae7ba9abae ci: Fix $BASE_ROOT_DIR installation fabe100c2b3 test: Use throwing config parser getters without fallback fa8acd57cd1 test: Write true/false values in config.ini 6304789a18f Wallet, refactor: Remove orphaned EraseWatchOnly function 6b6d77cc84e windows: remove deprecated codecvt via UTF-8 narrow APIs b388674acf0 Merge bitcoin/bitcoin#35872: rpc: avoid descriptor range counter overflow c36ffd870e8 Merge bitcoin/bitcoin#35842: rpc: Properly make RPCResult::Type::ANY non-test-only 7cb9aaaee80 Merge bitcoin/bitcoin#35759: fuzz: check http_request body matches framing 5b008514dbe Merge bitcoin/bitcoin#35878: net_processing: process unique tx INVs only 3175d576288 test, refactor: Remove unused `error` in `wallet_tests.cpp` 422f1bd92f1 test, refactor: Remove unused `utxo_pool` in `coinselector_tests.cpp` e550945a394 test, refactor: Remove unused `removed_refs` in `txgraph_tests.cpp` a061b011b78 Merge bitcoin/bitcoin#35912: doc: fix stale bitcoin_en.xlf reference 950b1c09225 Merge bitcoin/bitcoin#34927: test: Check that RPCs do not time out, even under load bd01e66f0a7 Merge bitcoin/bitcoin#35885: ci: switch to a sourceware mirror for riscv fa2e76d397a bench: Add base_blob compare bench via uint256 97abf95f48a qt: Update the `src/qt/locale/bitcoin_en.ts` translation source file 81fcecfe452 Revert "ci: Temporarily remove riscv32 config from GHA matrix" b283e1751cc ci: use mirror for riscv submodules fa7bc26d127 test: Check that RPCs do not time out, even under load fa2bd96cc0d test: Map cli CalledProcessError on server error to JSONRPCException e50f422d25f test, refactor: Remove unused variables in `test/rbf_tests.cpp` b7ae50e2e27 fuzz, refactor: Remove unused `header` in `p2p_transport_serialization.cpp` 3df0d067ade fuzz, refactor: Remove unused `random_string` in `locale.cpp` fc28914de4e fuzz, refactor: Remove unused `linearization` in `cluster_linearize.cpp` da58e559865 test, refactor: Remove unused `warnings` in `wallet/test/util.cpp` 4df077d7cd3 Merge bitcoin/bitcoin#35910: refactor: Remove unused newFeeRate var in ReplacementChecks e98ffd4bd82 doc: fix stale bitcoin_en.xlf reference fa9a9a82acd refactor: Remove unused newFeeRate var in ReplacementChecks fa588e9e0f8 refactor: Mark assertion_fail as [[noreturn]] 1278a5970d5 net_processing: process unique tx INVs only 75f58519277 doc: add release note for REST cache-control headers bbe21ac29f5 doc: document REST cache-control defaults 862a1795563 http: add no-store to dispatcher-generated error responses f32685315c2 doc: Install `pkgconf` to find `capnproto` on NetBSD 5964c7229fc doc: Switch `pkg-config` package to modern `pkgconf` on NetBSD 9b85c9814d1 doc: Drop GCC upgrade instructions for NetBSD ea59f172209 test: cover v0.14.3 wallet migration 18b8afd0933 test: support v0.14.x in dumb_sync_blocks faec059dfe8 refactor: Add uint256::operator<=>() b9d573e4a95 fees: Return false for incompatible fee estimates a3ebf8ab607 rpc: fix mempool entry vsize docs c4fbd3c7211 Merge bitcoin/bitcoin#35895: refactor: Enable clang-tidy rule to reject anon namespace in header 465196d0154 Merge bitcoin/bitcoin#35630: test: Add importdescriptors rpc error test coverage fa6df14c236 refactor: uint256::operator==() = default c940fd75145 Merge bitcoin/bitcoin#35180: coins: group private cache helpers 3db96eb5fd7 Merge bitcoin/bitcoin#35582: rpc: reject null for optional parameters fa93132d6da refactor: Enable misc-definitions-in-headers fa5ca877b60 refactor: Enable clang-tidy rule to reject anon namespace in header fafe5042bd1 refactor: Use C++20 std::identity over IntIdentity 28257111acf Merge bitcoin/bitcoin#35737: test: Move cluster_linearize.h contents into cluster_linearize namespace fac4b06e997 refactor: Use CLIENT_NAME in buildOpenRPCDoc fa3aadbc32e refactor: Use self.Arg<bool> in getopenrpcinfo fa1871a5281 refactor: Remove stale NOLINTNEXTLINE above GetAddressInfoBaseFields fa226479149 rpc: Properly make RPCResult::Type::ANY non-test-only fa1242dcc02 refactor: Use std::visit in ApplyArgFallback 27b6b5a458f Merge bitcoin/bitcoin#35836: rpc: Remove meaningless bool fallback in FundTransaction 3ac8b806a69 test: test the result order of a multiple import request is correct e4732bf0187 test: test invalid or missing timestamp throws importdescriptors 324c231efea Merge bitcoin/bitcoin#35881: iwyu: Fix warnings in `src/consensus` and treat them as errors 6ed7e05e20d gui: fix add .dat file extension automatically when exporting watchonly 75183f4464b Merge bitcoin/bitcoin#35880: fuzz: don't connman.ReceiveMsgFrom oversized msg fab74a0e922 refactor: Use C++14 digit separator for large int literals fae759be793 scripted-diff: Use inline constexpr over plain constexpr fa74f58a262 scripted-diff: Use inline const over (static) const fab1a62c870 refactor: Use inline constexpr for string literals in headers fa08bbed8dd contrib: Adjust generate-seeds.py to write inline constexpr fad753611b5 scripted-diff: Use inline constexpr over (static) const faedb52583e refactor: Make CFeeRate(integral) ctor constexpr 5555d5dcb55 scripted-diff: Use inline constexpr over static constexpr fa6e1a1e85e refactor: Remove static from constexpr functions in headers e2ab8ae5514 wallet: spkm: Only notify CanGetAddressesChanged on change 0892f16f911 refactor: moveonly: Pair CanGetAddressesChanged notifications with desc range. e6adae3db24 wallet: `NotifyCanGetAddressesChanged` when advancing `next_index` acf45c44c01 rest: add Cache-Control headers to REST responses d3cfd02bd7f Merge bitcoin/bitcoin#35501: wallet: store all witness variants of a transaction 0b8ffd01cde Merge bitcoin/bitcoin#35790: fuzz: populate wallet TXO index in wallet_create_transaction 2f52c2e8c06 Merge bitcoin/bitcoin#35886: refactor: Remove unused #include in common/system fa7304f3a5b refactor: Remove unused #include in common/system e7eb159a868 Merge bitcoin/bitcoin#35773: test: Suppress implicit-unsigned-integer-truncation:SaltedCoinsCacheHasher::operator() c6ef42d7dbc Merge bitcoin/bitcoin#35205: kernel,node: add `dbcache` setter and clarify defaults f280f5eb474 wallet: rpc: deprecate removeprunedfunds 4e8c4bc794c test: classify SOCKS5 peers via getpeerinfo addrbind 17c5e33e9c5 Merge bitcoin/bitcoin#35216: qa: Improve functional test support on illumos and *BSD 13b53f8bf67 iwyu: Fix warnings in `src/consensus` and treat them as errors bb19f1da19c fuzz: don't connman.ReceiveMsgFrom oversized msg 8a4bab8e975 Merge bitcoin/bitcoin#35863: test: fix wrong transaction in GetP2SHSigOpCount assertion 975a314667e Merge bitcoin/bitcoin#35832: p2p: avoid block disk reads on unnecessary requests d24610fa2c7 Merge bitcoin/bitcoin#35870: guix: move `python-minimal` to Linux GUI build b33a5b5767e Merge bitcoin/bitcoin#35871: refactor: Annotate `MakeAndPushFeature` with `[[maybe_unused]]` 4b322989ac2 Merge bitcoin/bitcoin#34995: iwyu: Fix warnings in `src/common` and treat them as errors 75f024a84e0 Merge bitcoin/bitcoin#35875: ci: Fix NetBSD SDK download failure, Temp. remove riscv32 from GHA fa06ea42448 ci: Temporarily remove riscv32 config from GHA matrix 873550bea38 ci: verify cross-build SDK archives 2c87337efe8 ci: update NetBSD cross-build SDK 6a2de55a0d8 test: require `TryGetTotalRam()` detection cd086c16dd7 node, qt: inline `DEFAULT_DB_CACHE` 8bd9f46082d kernel: allow setting chainstate `dbcache` 8aa21e119b0 kernel, node: colocate dbcache bounds 7cfa21d60a5 scripted-diff: use `MIN_DBCACHE_BYTES` ab634325768 common: cache total RAM as `uint64_t` 031fa402c8a scripted-diff: use `TryGetTotalRam` 264555af3cc rpc: avoid descriptor range counter overflow 143a13fb2bd test: characterize descriptor range endpoint 41c44f55885 node, qt: use `1_MiB` for dbcache conversions 0238aebf619 refactor: Annotate `MakeAndPushFeature` with `[[maybe_unused]]` 1ed14c61222 Merge bitcoin-core/gui#872: Menu action to export a watchonly wallet b75eb938a04 guix: move python-minimal to GUI build 101400b28f7 guix: remove -Werror=dev e27c179db2f Merge bitcoin/bitcoin#35869: lint: (re-)add contrib/guix for Python linting 50145f62c92 ci, iwyu: Enforce warning-free `src/common` 30f6b05857f Merge bitcoin/bitcoin#35860: fuzz: Rework rpc fuzz target dcc2ed52b84 Merge bitcoin/bitcoin#35856: fuzz: cover the mempool interface for transaction announcement 8221d714c78 lint: document CI lief version requirement 594a02c3ae0 lint: re-add guix scripts to mypy linting e8691056c01 test: Unroll `&&` conditions in macros ddddffda3af doc: Add doc/release-notes-35836.md 756afe14b5c test: give each ValidateInputsStandardness case its own scope 5559fa464b3 test: fix wrong transaction in GetP2SHSigOpCount assertion 556988790a7 Merge bitcoin/bitcoin#35592: http: check rpcallowip immediately after accepting connection fa895bb77a8 fuzz: Rework rpc fuzz target 28641fd195d p2p: reject empty getblocktxn requests dd2561003dd fuzz: cover the mempool interface for transaction announcement 9871fb726cb p2p: reject filtered block inv early when bloom is disabled aaf94120266 refactor: split p2p_getdata.py in sub-cases 34c03075a5a test: run generic baseindex tests against every index type 11b3e251c48 test: make baseindex flush test chain-length agnostic 8b959f4c6ab test: move unclean_shutdown test to baseindex_tests 2232d6afbe2 test: move index_reorg_crash to baseindex_tests a3597e26837 test: move BuildChain helper into test mining util 954985e6a38 test: simplify blockfilter test's BuildChain helper 67efced1fc8 Merge bitcoin/bitcoin#35838: qa: Enable `interface_gui.py` on macOS 45f5609f2ed qa: Enable `interface_gui.py` on macOS fa7fe798c61 wallet: Remove meaningless bool fallback in FundTransaction 9611a356035 Merge bitcoin/bitcoin#35828: util: Make LineReader consistently use string_view 6e2962e48cb Merge bitcoin/bitcoin#35753: kernel: handle null mempool on chainstate deletion 87bc4c74c4d Merge bitcoin/bitcoin#35787: init, rpc: ignore empty addnode values 67998e15c8d Merge bitcoin/bitcoin#35553: test: Add missing test case for getdata requests from blocks-only peers 9b38d077f89 Merge bitcoin-core/gui#953: Adds option to not load the wallet after migration 146988ef6c5 Merge bitcoin/bitcoin#35551: test: add interface_gui.py to test bitcoin-qt startup 7e5952b0aa0 Merge bitcoin/bitcoin#35821: guix: followups to #35537 683ae4c520b guix: consolidate config flags 665f11d04ac guix: consolidate gcc toolchain setup 288f76ed0fc guix: consolidate mingw-w64 toolchain setup cc9b0f2266d guix: consolidate LLVM toolchain setup b12a70f330d guix: turn linux/win linker warnings into errors fd7d4f29704 Merge bitcoin/bitcoin#35795: build: set CMAKE_VISIBILITY_INLINES_HIDDEN in REDUCE_EXPORTS 8ecbe270f0d Merge bitcoin/bitcoin#35606: script: qa: Improve `Key::Fingerprint` type safety a9d181f2d35 Merge bitcoin/bitcoin#35084: ipc: Add nonunix platform support 6573196e63b doc: Release note for export watchonly wallet gui action cb51f97f6c5 gui: Menu action for exporting a watchonly wallet 4cea59573c8 add release notes 492a715d784 gui: Adds option to not load the wallet after migration dff44e4c8f3 util: LineReader - Drop support for raw std::byte spans 5d5cdcd79d4 util: Make LineReader consistently use string_views e8eaa80ce29 util: LineReader - Don't include newline and acknowledge single-char \r 5907a5c7dc2 gui: Add ExceptionSafeConnect that takes a lambda 7dea464d6b5 Merge bitcoin/bitcoin#35692: addrman: remove unreachable tried-collision branch a2aab6df97d Merge bitcoin/bitcoin#35810: guix: Drop unused `(guix licenses)` import from `manifest_build.scm` 77440814bf2 fuzz: reset SOCKS5 interrupt between inputs 90ce21e21d0 rpc: reject empty node argument in addnode 69465de4470 init: ignore empty addnode values e75b76b12c5 Merge bitcoin/bitcoin#35261: guix: disable LTO in GCC a92e93429ee guix: Drop unused `(guix licenses)` import from `manifest_build.scm` 5be248341a8 bugfix: compare real chunk weight against block weight limit fc987908699 test: `TestChunkBlockLimits` uses incorrect weight for comparison e34b8d5a7dc Merge bitcoin/bitcoin#35794: doc: Discourage adding AI agents as commit (co)-authors b33a7fcd7bd Merge bitcoin/bitcoin#34628: p2p: Replace per-peer transaction rate-limiting with global rate limits 6b059d9dbdb Merge bitcoin/bitcoin#32800: rpc: Distinguish between vsize and sigop adjusted mempool vsize 11ebbd90721 Merge bitcoin/bitcoin#28463: p2p: Increase inbound capacity for block-relay only connections 3f313a774be build: set CMAKE_VISIBILITY_INLINES_HIDDEN in REDUCE_EXPORTS 3a2c52f9d70 Merge bitcoin/bitcoin#35792: refactor: Make all `const static` class members `constexpr` f5d7cc66ecb doc: Discourage adding AI agents as commit authors 05c35c402cc refactor: Make all `const static` class members `constexpr` c11508406e6 doc: Update docs that refer to -maxconnections 69ce0dba2ae test: add test that EvictTxPeerIfFull only evicts tx-relaying peers 3ed7f064180 p2p: trigger possible eviction if we support bloom filters and change a peer to tx relay 0bd3d3dfa56 init: make inbound tx relay percentage configurable cc59aee196e test: add functional test for inbound maxconnection limits 1b76e047364 net: increase inbound capacity for block-relay-only connections baa5a2ce43a guix: pass --disable-tm-clone-registry to base GCC 9c2589630f0 guix: mirror some arguments from linux-gcc to mingw-w64-gcc e0b8fbde897 guix: disable-nls in *-base-gcc 7dc87f8e1e2 guix: disable-lto in *-base-gcc 9ed3d6ef2a2 guix: modernise style in *-base-gcc 1eac6a728bf fuzz: populate wallet TXO index in wallet_create_transaction 610dd320d1a Merge bitcoin/bitcoin#35783: chainparams: remove my testnet3 seed afa5e46bbc6 Merge bitcoin/bitcoin#35076: doc: clarify pruning impact on wallet sync 26b730cdbf2 Merge bitcoin/bitcoin#35320: key: validate BIP32 seed length in CExtKey::SetSeed edf4b807f05 Merge bitcoin/bitcoin#35781: Update secp256k1 subtree to latest master 774d11c58f2 Merge bitcoin/bitcoin#35664: test: add CLTV and CHECK(MULTI)SIGVERIFY failure-path vectors to script_tests.json 526673487ce Merge bitcoin/bitcoin#34683: rpc: support a formal description of our JSON-RPC interface 290cb2f17ef Merge bitcoin/bitcoin#35775: scripted-diff: Use C.UTF-8 locale in Guix scripts d472a7798ac Merge bitcoin/bitcoin#32764: guix: Build for macOS using LLVM toolchain only 9755d33390d Merge bitcoin/bitcoin#34808: cmake, translation: Use native Qt TS file as source for translations on Transifex 51143291a6c Merge bitcoin/bitcoin#35782: doc: fix outdated i2p URLs in comments 2cb3bfa8df7 scripted-diff: Use long form of shell options in Guix scripts 711eb10f08b guix: Add copyright headers to Guix scripts 7295b8be704 chainparams: remove my testnet3 seed 419f7427eee doc: fix outdated i2p URLs in comments a33f240524d Squashed 'src/secp256k1/' changes from bd0287d650..d2d04864ef c26d4e2d6f0 Update secp256k1 subtree to latest master 22a03ca6944 Merge bitcoin/bitcoin#35694: clusterlin: minor SFL optimizations 7b6f9ba7bad Merge bitcoin/bitcoin#34672: mining: add reason/debug to `submitSolution` and unify with `submitBlock` 5311b15727f Merge bitcoin/bitcoin#33014: rpc: Fix internal bug in descriptorprocesspsbt when encountering invalid signatures c9cedebfffb coins: group private cache helpers 8a90c7cd973 guix: Build for macOS using LLVM toolchain only db74d3390a3 doc: clarify test placement guidance d3d74e701f7 ipc, refactor: Update mp::g_thread_context references 80f831494e5 guix: Fix `glibc` version in comment 8916f7967e1 scripted-diff: Use C.UTF-8 locale in Guix scripts a2e074d66ac Merge bitcoin-core/gui#951: test: Nudge toward QT_STYLE_OVERRIDE=fusion on macOS 6ced9ad782b Merge bitcoin/bitcoin#35770: net: Simplify `AddressPosition` comparitor b8844d3df75 Merge bitcoin/bitcoin#35766: p2p: Assume v2transport for addresses from seeds fa7f5537817 test: Suppress implicit-unsigned-integer-truncation:SaltedCoinsCacheHasher::operator() 075e7f42187 net: Simplify `AddressPosition` comparitor fa0c8337a8d test: Nudge toward QT_STYLE_OVERRIDE=fusion on macOS faa50c08b17 refactor: Run clang-format on qt test_main.cpp bc49bd154a3 Merge bitcoin/bitcoin#35709: depends: Update Qt to 6.8.4 efa1800a885 Merge bitcoin/bitcoin#35769: depends, zeromq: Apply upstream patch fc4ceda8b61 Merge bitcoin-core/gui#949: Fix `-Wsfinae-incomplete` warnings when building with GCC 16.x 559d042ba25 Merge bitcoin/bitcoin#35736: bitcoin-util: replace netmagic command with getchainparams command 8f2ed31f702 Merge bitcoin/bitcoin#35767: fuzz: Avoid dangling prevoutfetch threads after AFL fork a31c30290d4 Merge bitcoin/bitcoin#35746: ci: Test build directory path with spaces e446ea09c4d depends, zeromq: Apply upstream patch 87b080fe2b6 fuzz: reset the reused mempool in process_message(s) d522fd31963 fuzz: prepare deterministic mempool rebuilds b11456386b2 fuzz: let the test input toggle IBD in the p2p fuzz targets 2a29cee6843 test: add helper to reset chainman and mempool 2a4ef42d34e fuzz: share a single FakeNodeClock in the chainman-resetting fuzz targets 32eb5210029 Merge bitcoin/bitcoin#35215: coins: use SipHash-1-3-UJ for CCoinsMap keys 883ef1d85d7 Merge bitcoin/bitcoin#35727: blockencodings: fix extra transaction count f3f302150b5 ci: Put space and non-ASCII char in `BASE_BUILD_DIR` a7e980af31b build: Quote host paths in NSIS installer template faada35f9c0 fuzz: [refactor] Use 100'000 digit separator in __AFL_LOOP cf0f2aeae00 p2p: Assume v2transport for addresses from seeds fae067ec4a4 fuzz: Avoid dangling prevoutfetch threads after AFL fork 7e1a750d45d guix, refactor: Use `target` variable instead of hardcoded value de9b436ba36 depends: Switch from multilib to platform-specific toolchains d673ca765a5 Merge bitcoin/bitcoin#35537: guix: split builds into Linux, Linux GUI and macOS/Windows b36c2d78a3a Merge bitcoin/bitcoin#35490: test: cover unused mempool space in coins cache limit 7502b9ddba7 fuzz: check http_request body matches framing d1d85263f8e Merge bitcoin/bitcoin#35681: test: cover disconnect on private broadcast peer with relay=false 4906594a384 Merge bitcoin-core/gui#950: qt, test: Run GUI tests on macOS with `minimal` QPA plugin e0c196f9c11 Merge bitcoin/bitcoin#35721: lint: drop most remaining default Ruff rule ignores fd59d68c262 qt, test: Enable tests on macOS with `minimal` QPA plugin c8b2aeb2263 qt: Avoid implicit `NSApplication` instantiation 006f8f7d49a Merge bitcoin/bitcoin#35090: fuzz: add p2p_private_broadcast harness 51d36dfd076 qt: Fix `-Wsfinae-incomplete` warnings when building with GCC 16.x 0b0785daa00 guix: split macOS and win builds 008a3e29c88 guix: split builds into Linux(gui) and macOS/Windows a99b27f1920 validation: handle null mempool on delete a3b5dc05723 cmake: Add `GenerateWindowsInstaller` script 3bfdcbd7ee4 coins: reuse cache hasher for txid set 2beab94896a coins: use SipHash-1-3-UJ for `CCoinsMap` 7ff55cc6500 bench: add fixed-width SipHash benchmarks 3aea85411f6 test: add SipHash-1-3-UJ coverage a0ccd4ad171 crypto: add fixed-width SipHash-1-3-UJ c2d7931b5c8 crypto: add generic SipHash-1-3-UJ 25bfca06d66 refactor: simplify adding SipHash-1-3-UJ af50ba8500a test: add shared SipHash vectors fa5cbb89097 uint256: Workaround GCC-14 stringop-overread bug in Compare 18c05d93016 Merge bitcoin/bitcoin#35590: test: wallet: BnB incomplete result on attempt-limit success 21b4b790e48 test: Move cluster_linearize.h contents into cluster_linearize namespace b56b66fc64b Merge bitcoin/bitcoin#35679: fuzz: Remove unused `DeserializeFromFuzzingInput` params overload 6ee05c4b188 test: wallet: BnB incomplete result on attempt-limit success 6aa5d8d9481 blockencodings: fix extra transaction count be4e64d9e40 test: characterize extra transaction miscount 2d3f72fd3fa ipc, refactor: Update mp::SpawnProcess call 7298281ba8d bitcoin-util: replace netmagic command with getchainparams command 9d6ba4b3b57 Merge bitcoin/bitcoin#34514: refactor: remove unnecessary `std::move` for a few trivially copyable types ca9ffb8e123 rpc: add OpenRPC discovery alias 6c9d76d5894 doc: release note for alternate_wtxids in gettransaction 99bdcb064c2 test: compat, ensure downgrade preserves tx witness variants ef2afc6a0a3 test: Test for wallet txs with alternate wtxids 2d55c7a74dd wallet: Show alternate wtxids in gettransaction 0b1af01bd44 wallet: Replace CWalletTx::SetTx with Update 56cf27db4dc wallet: Store all witness variants of a transaction 798ba6d04fa wallet: Make CWalletTx::tx private and use CWalletTx::GetTx to access 72ebdd6364c wallet: Remove unused CWalletTx CopyFrom and copy constructor 19af439bdf3 wallet: Deserialize directly in CWalletTx's ctor afab8d4225c fuzz, refactor: Remove `Serialize` overload efa7f8c1437 fuzz: Remove unused `DeserializeFromFuzzingInput` params overload 6eca11175be lint: remove E731 Ruff ignore b52454538b0 lint: remove E712 Ruff ignore e9f19815caa ipc, refactor: Add Stream type alias and use it 3859805f05e ipc, refactor: Add SocketId type alias and use it 2ee9b69c7a1 ipc, refactor: Add ProcessId type alias and use it 34497971418 ipc: Avoid 'unistd.h' error with MSVC dbcc192dce6 ipc, refactor: fix include order 7c86d4834ed ipc, refactor: use native path separators in test 00287b9a340 ipc, refactor: Change Protocol class field order 33d37f3c35e ipc, refactor: Drop connect/listen/serve exe_name parameters 794940469e7 ipc, moveonly: combine ipc_test.cpp and ipc_tests.cpp efb4eae3386 clusterlin: avoid recomputing intersections in MergeChunks 4b91ad149f0 clusterlin: reserve the suboptimal-chunk queue up front e6ca996255b clusterlin: avoid heap allocations in GetLinearization 226e6388b7f depends: Update Qt to 6.8.4 fef99e6563a qt: fix out-of-bounds read in RPCParseCommandLine on empty command 349c72ee00a net_processing: Drop unnecessary txid arg from InitiateTxBroadcastToAll 12b0dc33c4a doc: Add release note for -txsendrate etc 5cde66341a6 tests: basic functional test for tx rate limiting 4842903ac12 rpc: report -txsendrate and bucket info via getnetworkinfo 74a47a52071 init: add -txsendrate configuration parameter 6307bd034bf net_processing: Provide a 30bpm heartbeat log while inv backlog is in use df31ee57aaf net_processing: add a global delay queue for sending txs 7927650e56d util/tokenbucket.h: Provide a generic TokenBucket class 749bb447f81 txmempool: Drop CompareMiningScoreWithTopology e1b7490fbc9 net_processing: Replace CompareInvMempoolOrder 6cfc65d2103 txmempool: Add ExtractBestByMiningScoreWithTopology 026f70e05f9 net_processing: Remove per-peer rate-limiting 46c8c471dcf net_processing: bump last_inv_sequence for bip35 messages explicitly 5d57f2cefee test: cover unused mempool space in coins cache 1fc9277a1c1 test: cover disconnect on private broadcast peer with relay=false bc7d9050467 addrman: remove unreachable tried-collision branch 0390338692a test: check MuSig import private key warnings 5e62fbf09c0 wallet: check descriptor private key completeness on import cd8d01bf47a descriptors: require complete MuSig private keys 55d3cd51a48 doc: add release note describing change for forbidden clients d1ed2a6e25d http: check rpcallowip immediately after accepting connection d24d3cbad01 fuzz: add p2p_private_broadcast harness c4068cf37b6 test: add negative zero CSV failure script test vector 37edf0e2338 test: add CHECKLOCKTIMEVERIFY failure-path script test vectors 29b124416e4 doc: add release notes for 32800 5d25a0c28d1 rpc: add `vsize_adjusted` field to getrawtransaction output for mempool transactions eaef8d31118 rpc: add `vsize_adjusted` and `vsize_bip141` field to mempool-related RPCs 6d387af562f psbt: remove write-only global xpub tracking set 3b7051c7e33 test: check combinepsbt with conflicting global xpub origins 7c632c0e2a2 psbt: avoid duplicate global xpub keys when merging a86a96d17b3 test: add CHECKSIGVERIFY/CHECKMULTISIGVERIFY failure script test vectors 07fb58b9ef2 test: Test a locked wallet rejects an empty importdescriptors request aeca0610865 rpc: reject null for optional parameters f4a6d079c42 qa: Support `get_bind_addrs` and `feature_bind_extra` on illumos 5e96a8fd5ac doc: Add `lsof` to Test Suite Dependencies on NetBSD 5d01aa4772a qa: Ignore `lsof` warnings on NetBSD 70352fda038 qa: Strip prefix length from NetBSD `ifconfig` output 1c1735567e2 doc: Add `lsof` to Test Suite Dependencies on FreeBSD 4cb7f39c2ce qa: Drop OpenBSD from supported platforms in `get_bind_addrs` function 8a982eea854 qa: Add `skip_if_no_lsof_on_nonlinux` helper and use it where needed 7e973cce52c depends: Make tarball creation from local directory reproducible e5b7785447f test: wallet: resend: avoid internal behavior via removeprunedfunds c9a70f93387 script: qa: Improve Key::Fingerprint type safety aa01721c899 test: add interface_gui.py to test bitcoin-gui startup via RPC ef0676f4007 rpc: factor getaddressinfo embedded field docs 1fb6b605609 test: add functional test for getopenrpcinfo 672dd42d140 rpc: add getopenrpcinfo command d5e64b01e1b doc: note -blocknotify is not run during IBD/reindex in help text f5116c587f7 rpc: add placeholder annotation for deprecated params 26c221a980d rpc: expose RPC metadata for introspection 6a1a66c180c rpc: render Type::ANY in help text instead of aborting 06de34a0333 rpc: erase empty map entry in removeCommand d4d64ae7393 rpc: add missing string_view include to server.h 278710a88d8 test: Add missing test case for getdata requests from blocks-only peers 156f2c6c49d kernel: add `btck_set_mock_time` for testing time-dependent paths 75929b11edb doc: add release note for submitSolution IPC changes ed75d70fdb8 refactor: centralize SubmitBlock result handling cbaa1696f37 mining: add reason and debug output to submitSolution 83f3bc002d0 mining: clarify SubmitBlock result handling 87bca1c2adb net: add options to AttemptToEvictConnection 2cf9d79d84c key: validate BIP32 seed length in CExtKey::SetSeed 3e8e21b2efc txgraph: avoid moving primitive members d9f94aa882a rpc: avoid moving RPC enum types b67baed4e7e coins: avoid moving `COutPoint` values 7e19ce200b2 rpc: Fix descriptorprocesspsbt internal bug on invalid signatures 51ee8ca1683 doc: clarify pruning impact on wallet sync 6cca38e2b92 refactor: remove unused PSBTError::Ok 3660678b953 refactor: SignPSBTInput now uses util:Expected ec61a1af621 depends: Hash included makefiles in package checksums a434d660250 cmake, translation: Specify English as target language explicitly 4097d6d968e cmake, translation: Sort messages within contexts alphabetically 312ab8ab0a8 cmake, translation: Skip source locations in TS files 4f553bd0da2 cmake, translation: Remove TS to XLIFF conversion 8c30055458b translation: Switch to Qt TS source file git-subtree-dir: libbitcoinkernel-sys/bitcoin git-subtree-split: 97462c683d49792a58ba954723a205cda86a5e0b
Adds a
derivehdkeyRPC that returns an xpub, or optionally the xprv, at an arbitrary BIP32 path (with at least one hardened step), derived from a wallet HD key.The main use case is coordinating a multisig setup, where each participant shares an xpub derived at a hardened path (e.g.
m/87h/0h/0h) distinct from their default single-signature descriptors. See the (updated)doc/multisig-tutorial.mdand (updated) functional test to see how that workflow improves.The first commits are some helpful helpers:
psbt_wallet_testsParseHDKeypathwould previously map overflowing values withouthto hardened.HasHardenedDerivation(), to enforce the "at least one hardened step" rulegethdkeyswhichderivehdkeyneedsGetKey()); behavior-preserving prep, also simplifiesgethdkeys.Meat and potatoes:
UnusedKeyfilter onGetHDPubKeysthat drives key selection.<0;1>syntax.