Commit Graph

7037 Commits

Author SHA1 Message Date
Eugene Siegel
a0992a842e log: use std::source_location in place of __func__, __FILE__, __LINE__
The std::source_location conveniently stores the file name, line number,
and function name of a source code location. We switch to using it instead
of the __func__ identifier and the __FILE__ and __LINE__ macros.

BufferedLog is changed to have a std::source_location member, replacing the
source_file, source_line, and logging_function members. As a result,
MemUsage no longer explicitly counts source_file or logging_function as the
std::source_location memory usage is included in the MallocUsage call.

This also changes the behavior of -logsourcelocations as std::source_location
includes the entire function signature. Because of this, the functional test
feature_config_args.py must be changed to no longer include the function
signature as the function signature can differ across platforms.

Co-Authored-By: Niklas Gogge <n.goeggi@gmail.com>
Co-Authored-By: stickies-v <stickies-v@protonmail.com>

Github-Pull: #32604
Rebased-From: a6a35cc0c2
2025-08-20 11:42:01 +01:00
Chris Stewart
2b9738a083 test: Fix 'getdescriptoractivity' RPCHelpMan, add test to verify 'spend_vin' is the correct field
Github-Pull: #33119
Rebased-From: 3543bfdfec
2025-08-06 11:17:38 +01:00
merge-script
4bf77955ed Merge bitcoin/bitcoin#33013: [29.x] Backport #32521
f25dc84b28 doc: update release notes for 29.x (Antoine Poinsot)
313023369b qa: functional test a transaction running into the legacy sigop limit (Antoine Poinsot)
0a4671d5eb qa: unit test standardness of inputs packed with legacy sigops (Antoine Poinsot)
204b965915 policy: make pathological transactions packed with legacy sigops non-standard. (Antoine Poinsot)

Pull request description:

  This backports PR #32521 to make the change available to miners who can't (or don't want to) upgrade past version 29.

ACKs for top commit:
  marcofleon:
    reACK f25dc84b28
  glozow:
    ACK f25dc84b28

Tree-SHA512: d5e06618720ed1a96d8a5fccdd8d1dbcbb5748505aa0df69198326828fe13f220e55bbce813f6f2daae82d23348e1f83a3a20a28639ec3fc2455c5b6e79a56e6
2025-07-24 12:32:38 -04:00
furszy
380b5aded2 test: fix intermittent failure in wallet_reorgsrestore.py
Wait until the node's process has fully stopped before starting a new instance.

Since the same code is used in tool_wallet.py, this consolidates the behavior
into a 'kill_process()' function.

Github-Pull: bitcoin/bitcoin#32069
Rebased-From: 36b0713edc
2025-07-24 09:29:11 -04:00
MarcoFalke
5e327e6703 test: Log KeyboardInterrupt as exception
log.exception is more verbose and useful to debug timeouts.

Also, log stderr for CalledProcessError to make debugging easier.

Github-Pull: #33001
Rebased-From: faa3e68411
2025-07-23 16:47:12 +01:00
MarcoFalke
79e1a3c9c6 test: Do not pass tests on unhandled exceptions
This adds a missing catch for BaseException (e.g. SystemExit), which
would otherwise be silently ignored.

Also, remove the redundant other catches, which are just calling
log.exception with a redundant log message.

Github-Pull: #33001
Rebased-From: fa30b34026
2025-07-23 16:46:48 +01:00
Antoine Poinsot
313023369b qa: functional test a transaction running into the legacy sigop limit
It's useful to have an end-to-end test in addition to the unit test to sanity check the RPC error as
well as making sure the transaction is otherwise fully standard.

Github-Pull: bitcoin/bitcoin#32521
Rebased-From: 96da68a38f
2025-07-18 16:51:54 -04:00
ismaelsadeeq
f85d41c224 test: retain the intended behavior of feature_fee_estimation.py nodes
- Increase block weight by 4000 for all nodes with custom -blockmaxweight.
  Prior to this commit, we generated blocks with 4000 weight units less worth of transactions.
  See https://github.com/bitcoin/bitcoin/issues/32461#issuecomment-2925282272 for details.
  This commit fixes it by increasing the block weight by 4000.

Github-Pull: #32463
Rebased-From: 9b75cfda4d
2025-07-04 09:34:31 +01:00
ismaelsadeeq
84c0c0e64b test: fix incorrect subtest in feature_fee_estimation.py
- Update `check_smart_estimates` to calculate the fee rate ceiling
   by taking the maximum of fees seen, minrelaytxfee, and mempoolminfee.
- Improve the subtest name and comments.

Github-Pull: #32463
Rebased-From: 5c1236f04a
2025-07-04 09:34:28 +01:00
Greg Sanders
59a83fb8d1 functional test: correctly detect nonstd TRUC tx vsize in feature_taproot
Github-Pull: #32859
Rebased-From: f0524cda39
2025-07-03 12:03:30 +01:00
Greg Sanders
9f3690b978 feature_taproot: sample tx version border values more
Currently if the version 3 is selected for an otherwise
standard spender, the test will fail. It's unlikely but
possible, so change the test to update expectations and
sample more aggressively on border values to instigate
failures much quicker in the future if another version is
made standard.

Github-Pull: #32841
Rebased-From: 4be81e9746
2025-07-03 12:03:06 +01:00
pablomartin4btc
3a57bfaaf9 test: Use rehash() in outbound eviction block-relay
Ensure that tip_header.rehash() is used instead of tip_header.hash, which is None when the header is deserialized from hex.

This avoids depending on wait_for_getheaders() falling back to any received message, making the test more explicit and robust.

Github-Pull: #32823
Rebased-From: ec004cdb86
2025-07-03 11:58:03 +01:00
pablomartin4btc
f82015ccfc test: Clarify roles in outbound eviction comments
Some ambiguous uses of "we" referring to either the node or the peer are replaced with clearer phrasing.

Also rephrase some comments for consistency and readability.

Applies to all relevant outbound eviction tests in p2p_eviction_logic.py.

Github-Pull: #32823
Rebased-From: 26598ed21e
2025-07-03 11:58:03 +01:00
dergoegge
4b656e2023 test: Add msgtype to msg_generic slots
Github-Pull: #32833
Rebased-From: 7dc43ea503
2025-06-30 13:28:55 +01:00
Sebastian Falbesoner
5987c1b6ab test: fix catchup loop in outbound eviction functional test
The catchup loop in the outbound eviction functional test currently has
a small flaw, as the contained waiting for a `getheaders` message just
waits for any such message instead of one with the intended block hash.
The reason is that the `prev_prev_hash` variable is set incorrectly,
since the `tip_header` instance is not updated and its field `.hash` is
None. Fix that by updating `tip_header` and use the correct field -- we
want the tip header's previous hash (`.hashPrevBlock`).

Github-Pull: #32742
Rebased-From: dd8447f70f
2025-06-26 11:24:02 +01:00
zaidmstrr
4c7ed36c96 test: Fix list index out of range error in feature_bip68_sequence.py
Github-Pull: #32765
Rebased-From: e285e691b7
2025-06-19 15:06:14 +01:00
Martin Zumsande
8246c6a65f test: wallet, coverage for crash on dup block disconnection during unclean shutdown
Co-authored-by: furszy <matiasfurszyfer@protonmail.com>

Github-Pull: #31757
Rebased-From: 11f8ab140f
2025-06-19 10:39:27 +01:00
Martin Zumsande
646fa1d028 test: fix sync function in rpc_psbt.py
It currently only syncs between the first two nodes,
which may do nothing when the block is created on the
third node.

Github-Pull: #32630
Rebased-From: 4df4df45d7
2025-05-29 12:31:10 +01:00
Ava Chow
6c0f26d3bd test: check that creating a wallet does not log version info
Github-Pull: #32553
Rebased-From: 4b2cd0b41f
2025-05-20 12:29:25 +01:00
Ava Chow
e685b4eca2 test: Check that the correct versions are logged on wallet load
Github-Pull: #32553
Rebased-From: 39a483c8e9
2025-05-20 12:29:21 +01:00
Martin Zumsande
cf034172bf test: fix another intermittent failure in wallet_basic.py
During init, the test framework will start using rpc after the
mempool was loaded. It will not wait for postInitProcess or
outstanding transactionAddedToMempool notifications, leading to
a possible race, in which listunspent is being called while the
tx is still in Inactive status. Prevent this by processing
outstanding notifications.

Github-Pull: #32483
Rebased-From: e7ad86e1ca
2025-05-14 13:26:53 +01:00
Martin Zumsande
c966158426 test: Fix intermittent failure in wallet_basic.py
There could be a race with outstanding TxAddedToMempool notifications
being applied to the soon-to-be created wallet.

Fixes an intermittent timeout reproducable by adding a sleep to
AddToWallet.

Github-Pull: #32483
Rebased-From: 07350e204d
2025-05-14 13:26:48 +01:00
enoch
6c4e3de2ac test: Use uninvolved pruned node in feature_pruning undo test
After fixing the nTime variable name, the test_pruneheight_undo_presence
test began failing because node 2, which is involved in reorg testing,
could be on a different chain than other nodes. This caused failures
when trying to fetch blocks from other nodes that didn't recognize
node 2's chain.

Switch to using node 5 instead, which is also a pruned node but isn't
involved in reorg testing, ensuring it stays on the same chain as the
other nodes. This allows the block fetching to work as intended in the
test.

Github-Pull: #32312
Rebased-From: 2aa63d511a
2025-05-14 10:01:32 +01:00
enoch
edd4073d70 test: Fix nTimes typo in feature_pruning test
Fix incorrect variable name in comment (nTimes -> nTime) in
feature_pruning.py. This typo caused the test to always reset
mine_large_blocks.nTime to 0, rather than only on the first run
as intended.

Github-Pull: #32312
Rebased-From: 772ba7f9ce
2025-05-14 10:01:26 +01:00
MarcoFalke
3665310808 scripted-diff: Use bpf_cflags
-BEGIN VERIFY SCRIPT-

 ren() { sed --regexp-extended -i "s/$1/$2/g" $( git grep --extended-regexp -l "$1" ) ; }

 ren 'cflags=\["-Wno-error=implicit-function-declaration"\]' 'cflags=bpf_cflags()'

-END VERIFY SCRIPT-

Github-Pull: #32336
Rebased-From: facb9b327b
2025-05-06 18:04:28 +01:00
MarcoFalke
4ed5c34abb test: Add imports for util bpf_cflags
This is required for the next commit.

Github-Pull: #32336
Rebased-From: fa0c1baaf8
2025-05-06 18:04:27 +01:00
Brandon Odiwuor
85f3e1de68 test: Handle empty string returned by CLI as None in RPC tests
Github-Pull: #32286
Rebased-From: a4041c77f0
2025-05-06 18:04:27 +01:00
Sjors Provoost
a3060483fa test: avoid disk space warning for non-regtest
feature_config_args.py incorrectly assumed that its testnet4 node
would not log a disk space warning.

0683b8ebf3 increased m_assumed_blockchain_size
on testnet4 from 1 to 11 GiB which triggers this bug on more
systems, e.g. a RAM disk.

Prevent the warning by setting -prune for these nodes.

Fix the same issue in feature_signet.py

Github-Pull: #32057
Rebased-From: 20fe41e9e8
2025-03-25 10:31:08 -04:00
Martin Zumsande
5ebcb59fdb test: fix intermittent failure in p2p_orphan_handling.py
If we bump the mocktime before the node has successfully disconnected
the peer, the requests for both parents could be spread over
two GETDATAS, which would make the test fail.

Github-Pull: #32063
Rebased-From: 02942056fd
2025-03-16 22:07:20 -04:00
merge-script
8cb6ab0b97 Merge bitcoin/bitcoin#32025: validation, fix: Use wtxid instead of txid in CheckEphemeralSpends
e637dc2c01 refactor: Replace uint256 type with Wtxid in PackageMempoolAcceptResult struct (marcofleon)
a3baead7cb validation: use wtxid instead of txid in CheckEphemeralSpends (marcofleon)

Pull request description:

  This PR addresses a small bug in [`AcceptMultipleTransactions`](45719390a1/src/validation.cpp (L1598)) where a txid was being inserted into a map that should only hold wtxids.  `CheckEphemeralSpends` has an out parameter on failure that records that the child transaction did not spend the parent's dust. Instead of using the txid of this child, use its wtxid.

  The second commit in this PR is a refactor of the `PackageMempoolAcceptResult` struct to use the `Wtxid` type instead of `uint256`. This helps to prevent errors like this in the future.

ACKs for top commit:
  instagibbs:
    ACK e637dc2c01
  glozow:
    ACK e637dc2c01, hooray for type safety
  dergoegge:
    Code review ACK e637dc2c01

Tree-SHA512: 17039efbb241b7741e2610be5a6d6f88f4c1cbe22d476931ec99e43f993d259a1a5e9334e1042651aff49edbdf7b9e1c1cd070a28dcba5724be6db842e4ad1e0
2025-03-12 19:57:58 +08:00
Hennadii Stepanov
7bb4c82d8b Merge bitcoin/bitcoin#32021: qa: Enable feature_init.py on Windows
59c4930394 qa: Enable feature_init.py on Windows (Hodlinator)

Pull request description:

  Windows has been skipped since feature_init.py was added in #23289. Possibly due to poorer support on older Python versions, or attempts to use `CTRL_C_EVENT` (which didn't work in my testing either) instead of `CTRL_BREAK_EVENT`.

ACKs for top commit:
  maflcko:
    lgtm ACK 59c4930394
  BrandonOdiwuor:
    Code Review ACK 59c4930394
  hebasto:
    ACK 59c4930394, I have reviewed the code and it looks OK.

Tree-SHA512: 4f3649b41bcba2e8d03b8dcb1a7a6882edafb2c456db4b0768fc86018e9e9ed7171cb3d3c99e74b4ef38a3fcf3ab5d2f1865bbd49d791f1ce0a246806634e1a7
2025-03-12 11:26:58 +00:00
merge-script
502d47203e Merge bitcoin/bitcoin#31161: cmake: Set top-level target output locations
568fcdddae scripted-diff: Adjust documentation per top-level target output location (Hennadii Stepanov)
026bb226e9 cmake: Set top-level target output locations (Hennadii Stepanov)

Pull request description:

  This PR sets the target output locations to the `bin` and `lib` subdirectories within the build tree, creating a directory structure that mirrors that of the installed targets.

  This approach is widely adopted by the large projects, such as [LLVM](e146c1867e/lldb/cmake/modules/LLDBStandalone.cmake (L128-L130)):
  ```cmake
  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX})
  set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX})
  ```

  The `libsecp256k1` project has also recently [adopted](https://github.com/bitcoin-core/secp256k1/pull/1553) this approach.

  With this PR, all binaries are conveniently located. For example, run:
  ```
  $ ./build/bin/fuzz
  ```
  instead of:
  ```
  $ ./build/src/test/fuzz/fuzz
  ```

  On Windows, all required DLLs are now located in the same directory as the executables, allowing to run `bitcoin-chainstate.exe` (which loads `bitcoinkernel.dll`) without the need to copy DLLs or modify the `PATH` variable.

  The idea was briefly discussed among the build team during the recent CoreDev meeting.

  ---

  **Warning**: This PR changes build locations of newly built executables like `bitcoind` and `test_bitcoin` from `src/` to `bin/` without deleting previously built executables. A clean build is recommended to avoid accidentally running old binaries.

ACKs for top commit:
  theStack:
    Light re-ACK 568fcdddae
  ryanofsky:
    Code review ACK 568fcdddae. Only change since last review was rebasing. I'm ok with this PR in its current form if other developers are happy with it. I just personally think it is inappropriate to \*silently\* break an everyday developer workflow like `git pull; make bitcoind`. I wouldn't have a problem with this PR if it triggered an explicit error, or if the problem was limited to less common workflows like changing cmake options in an existing build.
  TheCharlatan:
    Re-ACK 568fcdddae
  theuni:
    ACK 568fcdddae

Tree-SHA512: 1aa5ecd3cd49bd82f1dcc96c8e171d2d19c58aec8dade4bc329df89311f9e50cbf6cf021d004c58a0e1016c375b0fa348ccd52761bcdd179c2d1e61c105e3b9f
2025-03-12 11:19:00 +08:00
merge-script
e38f09b776 Merge bitcoin/bitcoin#31955: test: Fix authproxy named args debug logging
fac1dd9dff test: Fix authproxy named args debug logging (MarcoFalke)

Pull request description:

  In Python the meaning of `args or argsn` is that `argsn` is fully ignored when `args` is a list with at least one element. However, the RPC server accepts mixed positional and named args in the same RPC.

  Fix the debug log by always printing both. Also, add a new `_json_dumps` helper to avoid bloated code.

  Can be tested via `--tracerpc` on a call that uses named args mixed with positional args.

ACKs for top commit:
  i-am-yuvi:
    Tested ACK fac1dd9dff
  rkrux:
    tACK fac1dd9dff
  musaHaruna:
    Tested ACK [fac1dd9](fac1dd9dff)
  ryanofsky:
    Code review ACK fac1dd9dff. Thanks for logging fix. This change should have been included in #19762

Tree-SHA512: ff63fbc2564b2c7589e9294baacf4c7a79f10d593776813392510702ca726e3893a29db3ba261f3aee1789a59bb215d7cb10fc85ca1a02632631d3722ddcdfc5
2025-03-12 09:43:36 +08:00
marcofleon
a3baead7cb validation: use wtxid instead of txid in CheckEphemeralSpends 2025-03-11 16:00:46 +00:00
wgyt
5601bab4f8 Docs: fix typos in documentation files 2025-03-08 09:26:18 +08:00
Hodlinator
59c4930394 qa: Enable feature_init.py on Windows 2025-03-07 22:33:49 +01:00
glozow
0391d7e4c2 Merge bitcoin/bitcoin#31848: test, tracing: don't use problematic bpf_usdt_readarg_p()
a0b66b4bff Revert "test: Disable known broken USDT test for now" (0xb10c)
ec47ba349d contrib: don't use bpf_usdt_readarg_p (0xb10c)
35ae6ff60f test: don't use bpf_usdt_readarg_p (0xb10c)

Pull request description:

  Instead of using the undocumented bcc helper `bpf_usdt_readarg_p()`, use [`bpf_usdt_readarg()`][1] and [`bpf_probe_read_user()`][2]/[`bpf_probe_read_user_str()`][3] as documented in the [bcc USDT reference guide][1].

  Note that the `bpf_probe_read_user()` documentation says the following:
  > For safety, all user address space memory reads must pass through bpf_probe_read_user().

  It's [assumed](https://github.com/bitcoin/bitcoin/issues/27380#issuecomment-2286505348) that using `bpf_usdt_readarg_p()` caused a lifetime issue. With `bpf_usdt_readarg()` and `bpf_probe_read_user()`, this doesn't [seem](https://github.com/bitcoin/bitcoin/issues/27380#issuecomment-2528671656) to be a problem anymore.

  This allows to revert faed533743 and closes #27380.

    [1]: https://github.com/iovisor/bcc/blob/master/docs/reference_guide.md#6-usdt-probes
    [2]: https://github.com/iovisor/bcc/blob/master/docs/reference_guide.md#10-bpf_probe_read_user
    [3]: https://github.com/iovisor/bcc/blob/master/docs/reference_guide.md#11-bpf_probe_read_user_str

ACKs for top commit:
  i-am-yuvi:
    Tested ACK a0b66b4bff
  willcl-ark:
    tACK a0b66b4bff

Tree-SHA512: 002a692ad81ef284d4a610bbc6da477d623bf4dae5134c3692431c56b71692fa597e280fddd411eadd08eae77f01f47e2dcd0f37c0081326abe11a75bb10d6a6
2025-03-05 10:21:10 -05:00
fanquake
972b604dc4 doc: update location of minisketch repository 2025-03-05 14:13:53 +00:00
merge-script
6876e5076e Merge bitcoin/bitcoin#31943: test: add coverage for abandoning unconfirmed transaction
073a017016 test: add coverage for abandoning unconfirmed transaction (rkrux)

Pull request description:

  Previous discussion: https://github.com/bitcoin/bitcoin/pull/31794#pullrequestreview-2605174936
  Current Coverage: https://maflcko.github.io/b-c-cov/total.coverage/src/wallet/wallet.cpp.gcov.html#L1326

ACKs for top commit:
  Eunovo:
    Tested ACK 073a017016
  janb84:
    Tested ACK [073a017](073a017016)
  maflcko:
    lgtm ACK 073a017016
  Prabhat1308:
    Concept ACK [`073a017`](073a017016)
  brunoerg:
    utACK 073a017016

Tree-SHA512: be9b3d2e1cf65b20369be44d333aa2244b3af588f4a90374ad9562c3ea336669ba8f98a5fb88d616ba1f1f1b7dc0ad9bb47e7167aa03a52f2e0601525e156345
2025-02-26 09:36:34 -05:00
MarcoFalke
fac1dd9dff test: Fix authproxy named args debug logging 2025-02-25 22:41:17 +01:00
costcould
d9ba427f9d chore: remove redundant word
Signed-off-by: costcould <fliter@myyahoo.com>
2025-02-25 23:39:23 +08:00
merge-script
c12a2528ce Merge bitcoin/bitcoin#31415: test: fix TestShell initialization and reset()
303f8cca05 test: fix TestShell initialization and reset() (Brandon Odiwuor)

Pull request description:

  Fixes TestShell initialization issues caused by resolving symlinks and looking for config.ini in the source path instead of the build path after migration to CMake (see https://github.com/bitcoin/bitcoin/issues/31131#issuecomment-2433056070)

  ebe4cac38b/test/functional/test_framework/test_shell.py (L77)
  also fixes https://github.com/bitcoin/bitcoin/issues/31131

  **How to test:**
  ```
  $ python3
  >>> import sys
  >>> sys.path.insert(0, "./path/to/bitcoin/build/test/functional")
  >>> from test_framework.test_shell import TestShell
  >>> TestShell().setup(num_nodes=2, setup_clean_chain=True)
  >>> TestShell().shutdown()
  >>> TestShell.reset()
  ```

ACKs for top commit:
  pinheadmz:
    ACK 303f8cca05
  theStack:
    Tested ACK 303f8cca05
  pablomartin4btc:
    re-ACK 303f8cca05

Tree-SHA512: 25396eb2f7e4bf14426399b1eb3d2c988903ab1f3d38a58f1044b67dd7200c11c01686578fb49b0f2943864166c5c9ccbf122b45202a1e723bf3dbf0c90020fa
2025-02-25 09:54:21 -05:00
rkrux
073a017016 test: add coverage for abandoning unconfirmed transaction
Co-authored-by: Eunovo <eunovo9@gmail.com>
2025-02-24 15:44:39 +05:30
Hennadii Stepanov
026bb226e9 cmake: Set top-level target output locations
This change:
1. Collects build artifacts in dedicated locations.
2. Allows running bitcoin-chainstate.exe with bitcoinkernel.dll directly
from the build tree on Windows.
2025-02-20 22:18:51 +00:00
Brandon Odiwuor
303f8cca05 test: fix TestShell initialization and reset() 2025-02-20 15:25:43 +03:00
Ava Chow
dc3a714633 Merge bitcoin/bitcoin#31794: wallet: abandon orphan coinbase txs, and their descendants, during startup
e4dd5a351b test: wallet, abandon coinbase txs and their descendants during startup (furszy)
474139aa9b wallet: abandon inactive coinbase tx and their descendants during startup (furszy)

Pull request description:

  Since #26499, we mark coinbase transactions and their descendants as abandoned when a reorg arises through the "block disconnection" signal handler. However, this does not cover all scenarios; external wallets could contain coinbase transactions from blocks the node has not seen yet, or the user could have replaced the chain with an earlier or different version (one without the coinbase chain).

  This affects balance calculation as well as mempool rebroadcast (descendants shouldn't be relayed).
  Fix this by marking orphaned coinbase transactions and their descendants as abandoned during wallet startup.

ACKs for top commit:
  achow101:
    ACK e4dd5a351b
  rkrux:
    tACK e4dd5a351b
  mzumsande:
    Code Review ACK e4dd5a351b

Tree-SHA512: 461a43de7a6f5a580f2e6e3b56ec9bc92239cd45e850a2ff594ab5488dcd4a507f68fbbf550a33d7173b2add0de80de1e1b3841e1dfab0c95b284212d8ced08a
2025-02-18 18:39:00 -08:00
Ava Chow
06757af2da Merge bitcoin/bitcoin#29156: tests: add functional test for miniscript decaying multisig
bb633c9407 tests: add functional test for miniscript decaying multisig (Michael Dietz)

Pull request description:

  This is very closely based on [test/functional/wallet_multisig_descriptor_psbt.py](https://github.com/bitcoin/bitcoin/blob/master/test/functional/wallet_multisig_descriptor_psbt.py) both in code and concept. It should serve as some integration testing for Miniscript descriptors, and also documents a simple multisig that starts as 4-of-4 and decays to 3-of-4, 2-of-4, and finally 1-of-4 at block heights (I think in the real world aligning this to halvenings would be nice).

ACKs for top commit:
  achow101:
    ACK bb633c9407
  rkrux:
    reACK bb633c9407
  hodlinator:
    ACK bb633c9407

Tree-SHA512: 1f8e8e50258d45d8f2b882b5f86dcd390d86c543ff4801f397733017102e0854ac387960b6e296bb164603545615d224a4b400247cbbc07bf21b2f4b718ab2ff
2025-02-18 18:22:59 -08:00
brunoerg
405dd0e647 test: remove scanning check on wallet_importdescriptors 2025-02-17 18:44:01 -03:00
furszy
e4dd5a351b test: wallet, abandon coinbase txs and their descendants during startup 2025-02-15 10:49:08 -05:00
Ava Chow
43e71f7498 Merge bitcoin/bitcoin#27432: contrib: add tool to convert compact-serialized UTXO set to SQLite database
4080b66cbe test: add test for utxo-to-sqlite conversion script (Sebastian Falbesoner)
ec99ed7380 contrib: add tool to convert compact-serialized UTXO set to SQLite database (Sebastian Falbesoner)

Pull request description:

  ## Problem description

  There is demand from users to get the UTXO set in form of a SQLite database (#24628). Bitcoin Core currently only supports dumping the UTXO set in a binary _compact-serialized_ format, which was crafted specifically for AssumeUTXO snapshots (see PR #16899), with the primary goal of being as compact as possible. Previous PRs tried to extend the `dumptxoutset` RPC with new formats, either in human-readable form (e.g. #18689, #24202), or most recently, directly as SQLite database (#24952). Both are not optimal: due to the huge size of the ever-growing UTXO set with already more than 80 million entries on mainnet, human-readable formats are practically useless, and very likely one of the first steps would be to put them in some form of database anyway. Directly adding SQLite3 dumping support on the other hand introduces an additional dependency to the non-wallet part of bitcoind and the risk of increased maintenance burden (see e.g. https://github.com/bitcoin/bitcoin/pull/24952#issuecomment-1163551060, https://github.com/bitcoin/bitcoin/issues/24628#issuecomment-1108469715).

  ## Proposed solution

  This PR follows the "external tooling" route by adding a simple Python script for achieving the same goal in a two-step process (first create compact-serialized UTXO set via `dumptxoutset`, then convert it to SQLite via the new script). Executive summary:
  - single file, no extra dependencies (sqlite3 is included in Python's standard library [1])
  - ~150 LOC, mostly deserialization/decompression routines ported from the Core codebase and (probably the most difficult part) a little elliptic curve / finite field math to decompress pubkeys (essentialy solving the secp256k1 curve equation y^2 = x^3 + 7 for y given x, respecting the proper polarity as indicated by the compression tag)
  - creates a database with only one table `utxos` with the following schema:
    ```(txid TEXT, vout INT, value INT, coinbase INT, height INT, scriptpubkey TEXT)```
  - the resulting file has roughly 2x the size of the compact-serialized UTXO set (this is mostly due to encoding txids and scriptpubkeys as hex-strings rather than bytes)

  [1] note that there are some rare cases of operating systems like FreeBSD though, where the sqlite3 module has to installed explicitly (see #26819)

  A functional test is also added that creates UTXO set entries with various output script types (standard and also non-standard, for e.g. large scripts) and verifies that the UTXO sets of both formats match by comparing corresponding MuHashes. One MuHash is supplied by the bitcoind instance via `gettxoutsetinfo muhash`, the other is calculated in the test by reading back the created SQLite database entries and hashing them with the test framework's `MuHash3072` module.

  ## Manual test instructions
  I'd suggest to do manual tests also by comparing MuHashes. For that, I've written a go tool some time ago which would calculate the MuHash of a sqlite database in the created format (I've tried to do a similar tool in Python, but it's painfully slow).
  ```
  $ [run bitcoind instance with -coinstatsindex]
  $ ./src/bitcoin-cli dumptxoutset ~/utxos.dat
  $ ./src/bitcoin-cli gettxoutsetinfo muhash <block height returned in previous call>
  (outputs MuHash calculated from node)

  $ ./contrib/utxo-tools/utxo_to_sqlite.py ~/utxos.dat ~/utxos.sqlite
  $ git clone https://github.com/theStack/utxo_dump_tools
  $ cd utxo_dump_tools/calc_utxo_hash
  $ go run calc_utxo_hash.go ~/utxos.sqlite
  (outputs MuHash calculated from the SQLite UTXO set)

  => verify that both MuHashes are equal
  ```
  For a demonstration what can be done with the resulting database, see https://github.com/bitcoin/bitcoin/pull/24952#pullrequestreview-956290477 for some example queries. Thanks go to LarryRuane who gave me to the idea of rewriting this script in Python and adding it to `contrib`.

ACKs for top commit:
  ajtowns:
    ACK 4080b66cbe - light review
  achow101:
    ACK 4080b66cbe
  romanz:
    tACK 4080b66cbe on signet (using [calc_utxo_hash](8981aa3e85/calc_utxo_hash/calc_utxo_hash.go)):
  tdb3:
    ACK 4080b66cbe

Tree-SHA512: be8aa0369a28c8421a3ccdf1402e106563dd07c082269707311ca584d1c4c8c7b97d48c4fcd344696a36e7ab8cdb64a1d0ef9a192a15cff6d470baf21e46ee7b
2025-02-14 15:22:10 -08:00