23963 Commits

Author SHA1 Message Date
Greg Sanders
cf7d3a8cd0
p2p: Don't consider blocks mutated if they don't connect to known prev block
Github-Pull: #29524
Rebased-From: a1fbde0ef7cf6c94d4a5181f8ceb327096713160
2024-03-05 12:18:05 -05:00
dergoegge
3eaaafa225
[test] IsBlockMutated unit tests
Github-Pull: #29412
Rebased-From: d8087adc7ebd4ea05dd3843e5a92e8115fd7bbcc
2024-03-05 12:17:59 -05:00
dergoegge
0667441a7b
[validation] Cache merkle root and witness commitment checks
Slight performance improvement by avoiding duplicate work.

Github-Pull: #29412
Rebased-From: 1ec6bbeb8d27d31647d1433ccb87b362f6d81f90
2024-03-05 12:17:54 -05:00
dergoegge
8cc4b24c74
[net processing] Don't process mutated blocks
We preemptively perform a block mutation check before further processing
a block message (similar to early sanity checks on other messsage
types). The main reasons for this change are as follows:

- `CBlock::GetHash()` is a foot-gun without a prior mutation check, as
  the hash returned only commits to the header but not to the actual
  transactions (`CBlock::vtx`) contained in the block.
- We have observed attacks that abused mutated blocks in the past, which
  could have been prevented by simply not processing mutated blocks
  (e.g. https://github.com/bitcoin/bitcoin/pull/27608).

Github-Pull: #29412
Rebased-From: 49257c0304828a185c273fcb99742c54bbef0c8e
2024-03-05 12:17:45 -05:00
dergoegge
098f07dc8d
[validation] Merkle root malleation should be caught by IsBlockMutated
Github-Pull: #29412
Rebased-From: 2d8495e0800f5332748cd50eaad801ff77671bba
2024-03-05 12:17:40 -05:00
dergoegge
8804c368f5
[validation] Introduce IsBlockMutated
Github-Pull: #29412
Rebased-From: 66abce1d98115e41f394bc4f4f52341960ddc839
2024-03-05 12:17:35 -05:00
dergoegge
4f5baac6ca
[validation] Isolate merkle root checks
Github-Pull: #29412
Rebased-From: 95bddb930aa72edd40fdff52cf447202995b0dce
2024-03-05 12:17:28 -05:00
UdjinM6
7c08ccf19b
wallet: Avoid updating ReserveDestination::nIndex when GetReservedDestination fails
Github-Pull: bitcoin/bitcoin#29510
Rebased-From: 367bb7a80cc71130995672c853d4a6e0134721d6
2024-03-01 17:12:25 -05:00
MarcoFalke
cf0f43ee42
wallet: Fix use-after-free in WalletBatch::EraseRecords
Github-Pull: bitcoin/bitcoin#29176
Rebased-From: faebf1df2afe207f5d2d4f73f50ac66824fe34bb
2024-02-21 18:34:20 -05:00
MarcoFalke
6acfc4324c
Use only Span{} constructor for byte-like types where possible
This removes bloat that is not needed.

Github-Pull: bitcoin/bitcoin#27927
Rebased-From: fa38d862358b87219b12bf31236c52f28d9fc5d6
2024-02-21 18:34:05 -05:00
MarcoFalke
b40d10787b
util: Allow std::byte and char Span serialization
Github-Pull: bitcoin/bitcoin#27927
Rebased-From: fa257bc8312b91c2d281f48ca2500d9cba353cc5
2024-02-21 18:33:43 -05:00
Martin Zumsande
041228d293
rpc: fix getrawtransaction segfault
The crash would happen when querying a mempool transaction with verbosity=2, while pruning.

Github-Pull: #29003
Rebased-From: 494a926d05df44b60b3bc1145ad2a64acf96f61b
2024-01-15 15:23:49 +00:00
Sebastian Falbesoner
b86285df1f
gui: fix crash on selecting "Mask values" in transaction view
This commits fixes a crash bug that can be caused with the following steps:
- change to the "Transactions" view
- right-click on an arbitrary transaction -> "Show transaction details"
- close the transaction detail window again
- select "Settings" -> "Mask values"

The problem is that the list of opened dialogs, tracked in the member
variable `m_opened_dialogs`, is only ever appended with newly opened
transaction detail dialog pointers, but never removed. This leads to
dangling pointers in the list, and if the "Mask values" menu item is
selected, a crash is caused in the course of trying to close the opened
transaction detail dialogs (see `closeOpenedDialogs()` method). Fix this
by removing the pointer from the list if the corresponding widget is
destroyed.

Github-Pull: https://github.com/bitcoin-core/gui/pull/774
Rebased-From: e26e665f9f64a962dd56053be817cc953e714847
2023-12-11 15:51:59 +00:00
stickies-v
45a5fcb165
http: bugfix: track closed connection
It is possible that the client disconnects before the request is
handled. In those cases, evhttp_request_set_on_complete_cb is never
called, which means that on shutdown the server we'll keep waiting
endlessly.

By adding evhttp_connection_set_closecb, libevent automatically
cleans up those dead connections at latest when we shutdown, and
depending on the libevent version already at the moment of remote
client disconnect. In both cases, the bug is fixed.

Github-Pull: #28551
Rebased-From: 68f23f57d77bc172ed39ecdd4d2d5cd5e13cf483
2023-10-04 10:12:59 +01:00
stickies-v
752a456fa8
http: log connection instead of request count
There is no significant benefit in logging the request count instead
of the connection count. Reduces amount of code and computational
complexity.

Github-Pull: #28551
Rebased-From: 084d0372311e658a486622f720d2b827d8416591
2023-10-04 10:11:01 +01:00
stickies-v
ae86adabe4
http: refactor: use encapsulated HTTPRequestTracker
Introduces and uses a HTTPRequestTracker class to keep track of
how many HTTP requests are currently active, so we don't stop the
server before they're all handled.

This has two purposes:
1. In a next commit, allows us to untrack all requests associated
with a connection without running into lifetime issues of the
connection living longer than the request
(see https://github.com/bitcoin/bitcoin/pull/27909#discussion_r1265614783)

2. Improve encapsulation by making the mutex and cv internal members,
and exposing just the WaitUntilEmpty() method that can be safely
used.

Github-Pull: #28551
Rebased-From: 41f9027813f849a9fd6a1479bbb74b9037990c3c
2023-10-04 10:10:35 +01:00
furszy
f31899d19a
gui: macOS, make appMenuBar part of the main app window
By moving the appMenuBar destruction responsibility to the QT
framework, we ensure the disconnection of the submenus signals
prior to the destruction of the main app window.

The standalone menu bar may have served a purpose in earlier
versions when it didn't contain actions that directly open
specific screens within the main application window. However,
at present, all the actions within the appMenuBar lead to the
opening of screens within the main app window. So, the absence
of a main app window makes these actions essentially pointless.

Github-Pull: gui#751
Rebased-From: bae209e3879fa099302d3b211362c49bbbfbdd14
2023-10-03 15:59:17 +01:00
furszy
64ffa94231
gui: macOS, do not process dock icon actions during shutdown
As the 'QMenuBar' is created without a parent window in MacOS, the
app crashes when the user presses the shutdown button and, right
after it, triggers any action in the menu bar.

This happens because the QMenuBar is manually deleted in the
BitcoinGUI destructor but the events attached to it children
actions are not disconnected, so QActions events such us the
'QMenu::aboutToShow' could try to access null pointers.

Instead of guarding every single QAction pointer inside the
QMenu::aboutToShow slot, or manually disconnecting all
registered events in the destructor, we can check if a
shutdown was requested and discard the event.

The 'node' field is a ref whose memory is held by the
main application class, so it is safe to use here. Events
are disconnected prior destructing the main application object.

Furthermore, the 'MacDockIconHandler::dockIconClicked' signal
can make the app crash during shutdown for the very same
reason. The 'show()' call triggers the 'QApplication::focusWindowChanged'
event, which is connected to the 'minimize_action' QAction,
which is also part of the app menu bar, which could no longer exist.

Github-Pull: gui#751
Rebased-From: e14cc8fc69cb3e3a98076fbb23a94eba7873368a
2023-10-03 15:58:41 +01:00
Andrew Chow
d63478cb50
wallet: Check last block and conflict height are valid in MarkConflicted
MarkConflicted calculates conflict confirmations incorrectly when both
the last block processed height and the conflicting height are negative
(i.e. uninitialized). If either are negative, we should not be marking
conflicts and should exit early.

Github-Pull: #28542
Rebased-From: 4660fc82a1f5cf6eb6404d5268beef5919581661
2023-10-02 13:29:04 +01:00
ismaelsadeeq
37764d3300
tx fees, policy: read stale fee estimates with a regtest-only option
If -acceptstalefeeestimates option is passed stale fee estimates can now
be read when operating in regtest environments.

Additionally, this commit updates all declarations of the CBlockPolicyEstimator
class to include a the second constructor variable.

Github-Pull: #27622
Rebased-From: cf219f29f3c5b41070eaab9a549a476f01990f3a
2023-10-02 13:09:01 +01:00
ismaelsadeeq
16bb9161fa
tx fees, policy: do not read estimates of old fee_estimates.dat
Old fee estimates could cause transactions to become stuck in the
mempool. This commit prevents the node from using stale estimates
from an old file.

Github-Pull: #27622
Rebased-From: 3eb241a141defa564c94cb95c5bbaf4c5bd9682e
2023-10-02 13:09:01 +01:00
ismaelsadeeq
c4dd5989b3
tx fees, policy: periodically flush fee estimates to fee_estimates.dat
This reduces chances of having old estimates in fee_estimates.dat.

Github-Pull: #27622
Rebased-From: 5b886f2b436eaa8c2b7de58dc4644dc6223040da
2023-10-02 13:09:01 +01:00
furszy
0d2a33e05c
wallet: disallow migration of invalid or not-watched scripts
The legacy wallet allowed to import any raw script, without checking if
it was valid or not. Appending it to the watch-only set.

This causes a crash in the migration process because we are only
expecting to find valid scripts inside the legacy spkm.

These stored scripts internally map to `ISMINE_NO` (same as if they
weren't stored at all..).

So we need to check for these special case, and take into account that
the legacy spkm could be storing invalid not watched scripts.

Which, in code words, means IsMineInner() returning IsMineResult::INVALID
for them.

Github-Pull: #28125
Rebased-From: 1de8a2372ab39386e689b27d15c4d029be239319
2023-10-02 13:09:01 +01:00
Pieter Wuille
2c51a07c08
Do not use std::vector = {} to release memory
Github-Pull: #28452
Rebased-From: 3fcd7fc7ff563bdc0e2bba66b4cbe72d898c876e
2023-10-02 13:09:00 +01:00
Hennadii Stepanov
88b525f93a
qt: 25.1rc1 translations update 2023-09-28 15:50:04 +01:00
furszy
6d5a510dcd
descriptor: InferScript, do not return top-level only func as sub descriptor
e.g. sh(addr(ADDR)) or sh(raw(HEX)) are invalid descriptors.

Making sh and wsh top level functions to return addr/raw descriptors when
the subscript inference fails.

Github-Pull: #28067
Rebased-From: cc781a21800a6ce13875feefd0cb14ab0a84524c
2023-07-21 09:38:35 +01:00
furszy
4b16650c10
wallet: migration bugfix, persist empty labels
addressbook records with no associated label could be
treated as change. And we don't want that for external
addresses.

Github-Pull: #28038
Rebased-From: a277f8357ad8b0eb26f33fc36f919d868c06847b
2023-07-07 17:31:14 +01:00
furszy
59b06b696a
wallet: migration bugfix, clone 'send' record label to all wallets
Github-Pull: #28038
Rebased-From: 1b64f6498c394a143df196172a14204fe3b8a744
2023-07-07 17:30:53 +01:00
Greg Sanders
b8ad3220a9
Unconditionally return when compact block status == READ_STATUS_FAILED
Github-Pull: #27743
Rebased-From: d97269579769effbe6eec2303ea0cc3e396d3e0d
2023-06-16 10:17:22 +01:00
Greg Sanders
e66a5cbb56
Support up to 3 parallel compact block txn fetchings
A single outbound slot is required, so if the first two slots
are taken by inbound in-flights, the node will reject additional
unless they are coming from outbound.

This means in the case where a fast sybil peer is attempting to
stall out a node, a single high bandwidth outbound peer can
mitigate the attack.

Github-Pull: #27626
Rebased-From: 03423f8bd12b95a06a4a9d8377e781625dd38aae
2023-06-16 10:17:22 +01:00
Greg Sanders
d1a93f5d41
Only request full blocks from the peer we thought had the block in-flight
This is a change in behavior so that if for some reason we request a block from a peer, we don't allow an unsolicited CMPCT_BLOCK announcement for that same block to cause a request for a full block from the uninvited peer (as some type of request is already outstanding from the original peer)

Github-Pull: #27626
Rebased-From: 13f9b20b4cb2f3f26e81184a77e9cf1f626d4f57
2023-06-16 10:17:22 +01:00
Greg Sanders
38e3af9fad
Convert mapBlocksInFlight to a multimap
Github-Pull: #27626
Rebased-From: cce96182ba2457335868c65dc16b081c3dee32ee
2023-06-16 10:17:22 +01:00
Greg Sanders
a45159b8e2
Remove nBlocksInFlight
Github-Pull: #27626
Rebased-From: a90595478dcf4e443cd15bbb822d485dc42bdb18
2023-06-16 10:17:21 +01:00
Greg Sanders
722361e129
alias BlockDownloadMap for mapBlocksInFlight
Github-Pull: #27626
Rebased-From: 86cff8bf18f2c6344a25ad8b81cf366201a73c36
2023-06-16 10:17:21 +01:00
brunoerg
72ead8699f
rest: bugfix, fix crash error when calling /deploymentinfo
Github-Pull: #27853
Rebased-From: ce887eaf4917c337b21aa2e7811804ce003d36be
2023-06-15 10:38:28 +01:00
MarcoFalke
796e1145a9
rpc: Fix invalid bech32 handling
Github-Pull: #27727
Rebased-From: eeee55f9288740747b6e8d806ce8177fd92635cf
2023-05-25 11:15:27 +01:00
Anthony Towns
7ef71e30c9
net_processing: Boost inv trickle rate
If transactions are being added to the mempool at a rate faster than 7tx/s
(INVENTORY_BROADCAST_PER_SECOND) then peers' inventory_to_send queue can
become relatively large. If this happens, increase the number of txids
we include in an INV message (normally capped at 35) by 5 for each 1000
txids in the queue.

This will tend to clear a temporary excess out reasonably quickly; an
excess of 4000 invs to send will be cleared down to 1000 in about 30
minutes, while an excess of 20000 invs would be cleared down to 1000 in
about 60 minutes.

Github-Pull: #27610
Rebased-From: 5b3406094f2679dfb3763de4414257268565b943
2023-05-11 14:30:20 +01:00
Anthony Towns
1adbcd302f
txmempool: have CompareDepthAndScore sort missing txs first
We use CompareDepthAndScore to choose an order of txs to inv. Rather
than sorting txs that have been evicted from the mempool at the end
of the list, sort them at the beginning so they are removed from
the queue immediately.

Github-Pull: #27610
Rebased-From: 228e9201efb5574b1b96bb924de1d2e8dd1317f3
2023-05-11 14:29:54 +01:00
Suhas Daftuar
9a23079df3
p2p: Avoid prematurely clearing download state for other peers
Github-Pull: #27608
Rebased-From: 52e52071e01f4e98d87a47e1d5f3c5c3cc6dbaf4
2023-05-10 10:14:17 +01:00
Hennadii Stepanov
20c076d056
qt: 25.0rc2 translations update 2023-05-03 21:03:14 +01:00
Jon Atack
31b1798d2c p2p: update hardcoded mainnet seeds for 25.x 2023-04-20 06:08:22 -07:00
fanquake
a2bef805c1
kernel: update m_assumed_* chain params for 25.x
Co-authored-by: johnny9 <985648+johnny9@users.noreply.github.com>
2023-04-18 11:57:29 +01:00
fanquake
4128e01dba
kernel: update chainTxData for 25.x
Co-authored-by: johnny9 <985648+johnny9@users.noreply.github.com>
2023-04-18 11:48:16 +01:00
fanquake
00b2b114b4
kernel: update nMinimumChainWork & defaultAssumeValid for 25.x
Co-authored-by: johnny9 <985648+johnny9@users.noreply.github.com>
2023-04-18 11:48:13 +01:00
fanquake
07fcc0a82c
doc: update references to kernel/chainparams.cpp 2023-04-18 11:02:05 +01:00
Andrew Chow
4ad20a2258
Merge bitcoin/bitcoin#27473: bugfix: Properly handle "unknown" Address Type
0d6383fda04a99726654945a737bbb1369e0e44a Don't return OutputType::UNKNOWN in ParseOutputType (Pttn)

Pull request description:

  Fixes https://github.com/bitcoin/bitcoin/issues/27472 by also handling at the relevant places the case where ParseOutputType returns `OutputType::UNKNOWN`, and not just when it returns `std::nullopt`.

ACKs for top commit:
  achow101:
    ACK 0d6383fda04a99726654945a737bbb1369e0e44a
  MarcoFalke:
    lgtm ACK 0d6383fda04a99726654945a737bbb1369e0e44a
  furszy:
    ACK 0d6383fda0

Tree-SHA512: 776793027b926283d3162e69fb9c8883c814b19bcce4574ccdf8e3140a1ec4ebc4aa8ccd1abae7ef3571f942d2e6c35305fd1244259540d90605106e01afc34c
2023-04-17 10:18:04 -04:00
fanquake
e054b7390c
Merge bitcoin/bitcoin#27468: bugfix: rest: avoid segfault for invalid URI
11422cc5720c8d73a87600de8fe8abb156db80dc bugfix: rest: avoid segfault for invalid URI (pablomartin4btc)

Pull request description:

  Minimal fix to get it promptly into 25.0 release (suggested by  [stickies-v](https://github.com/bitcoin/bitcoin/pull/27253#pullrequestreview-1385130381) and supported by [vasild](https://github.com/bitcoin/bitcoin/pull/27253#pullrequestreview-1385842606)  )

  Please check #27253 for reviewers comments and acks regarding this PR and read the commit comment message body for more details about the fix.

ACKs for top commit:
  achow101:
    ACK 11422cc5720c8d73a87600de8fe8abb156db80dc
  stickies-v:
    re-ACK 11422cc

Tree-SHA512: 5af6b53fb266a12b463f960910556d5e97bc88b3c2a4f437ffa343886b38749e1eb058cf7bc64d62e82e1acf6232a186bddacd8f3b4500c87bf9e550a0153386
2023-04-17 15:11:15 +01:00
pablomartin4btc
11422cc572 bugfix: rest: avoid segfault for invalid URI
`evhttp_uri_parse` can return a nullptr, for example when the URI
contains invalid characters (e.g. "%").
`GetQueryParameterFromUri` passes the output of `evhttp_uri_parse`
straight into `evhttp_uri_get_query`, which means that anyone calling
a REST endpoint in which query parameters are used (e.g. `rest_headers`)
can cause a segfault.

This bugfix is designed to be minimal and without additional behaviour change.
Follow-up work should be done to resolve this in a more general and robust way,
so not every endpoint has to handle it individually.
2023-04-17 10:13:34 -03:00
Pttn
0d6383fda0 Don't return OutputType::UNKNOWN in ParseOutputType
Fixes https://github.com/bitcoin/bitcoin/issues/27472

Signed-off-by: Pttn <28868425+Pttn@users.noreply.github.com>
2023-04-16 23:48:05 +02:00
fanquake
90bfa9d2d7
Merge bitcoin/bitcoin#27308: bumpfee: avoid making bumped transactions with too low fee when replacing outputs
d52fa1b0a5a8eecbe1e296a44b72965717e9235b tests: Make sure that bumpfee feerate checks work when replacing outputs (Andrew Chow)
be177c15a40199fac79d8ab96bb4b4d5a9b4fe22 bumpfee: Check the correct feerate when replacing outputs (Andrew Chow)

Pull request description:

  When replacing the outputs of a transaction during `bumpfee`, it is possible to accidentally create a transaction that will not be accepted into the mempool as it does not meet the incremental relay fee requirements. This occurs because the size estimation used for checking the provided feerate does not account for the replaced outputs; it instead uses the original outputs. When the replaced outputs is significantly different from the original, there can be a large difference in estimated transaction sizes that can make a transaction miss the absolute fee requirements for the incremental relay fee. Unfortunately we do not currently inform the user when the bumped transaction fails to relay, so they could use `bumpfee` and think the transaction has been bumped when it actually has not.

  This issue is resolved by replacing the outputs before doing the size estimation, and also updating the feerate checker to use the actual fee values when calculating the required minimum fee.

  Also added a test for this scenario.

ACKs for top commit:
  ishaanam:
    reACK d52fa1b0a5a8eecbe1e296a44b72965717e9235b
  Xekyo:
    reACK d52fa1b0a5

Tree-SHA512: d18301b587465322dd3fb1bb86496c3675265a56072047576e2baa5cf907dd3b54778f30721f662f0c235709a5568427c18542eb7efbfb6fdd9f481fe676c66b
2023-04-15 12:55:10 +01:00