49 Commits

Author SHA1 Message Date
tomFlowee 119988723f Ensure that we don't hold onto the sharedptr too long
This allows a peer we remove / ban to get deleted properly again.
2025-02-24 21:18:07 +01:00
tomFlowee 16bf019d6b Minor. Cleanup and debug outputs.
Cleans up the comments a bit, adds some logging details and as most
functional change it tweaks the numbers a little.
2025-02-24 15:53:52 +01:00
tomFlowee f2d12fd1fe Alter spv download to be parallel.
We always need two random peers to download a certain merkle block, to
avoid the withholding attack.
It occurred to me that there is no need to do them one after the other,
they can both run in parallel without issues. Saving time.
2025-02-19 19:26:56 +01:00
tomFlowee 09821e7dda Optimize download on testnet
Allow testnet downloads to be less secure, which makes it faster
and more reliable since there are a lot less nodes running there.
2025-01-06 23:31:19 +01:00
tomFlowee b6fc84696a Wrap PrivacySegment in a shared pointer.
This is an abstract class that the application using this library needs
to subclass. Ownership and lifetime don't change, it still lies with the
app using the library and they still need to add and remove it from the
connectionManager, but this makes it much more stable for multi-
threading environments and avoids issues on misuse.
2024-11-29 15:12:13 +01:00
tomFlowee 6ade318b2e Introduce interleaving during download
The download from a peer is now limited to just 4000 blocks, at which
point the download proceeds from another peer.
Naturally it can go back to the first afterwards too.

The idea is that we download a month worth of blocks at a time and then
fetch the same blocks from a backup peer in order to be certain we
actually see the real state.
The problem we've seen is that after the first downloads we end up
starting the second and if the initial sync or a similar large download
happens, many people won't leave it running until the backup actually
completes since the UI looks like its finished.

This is also a good starting point for rating peers at download speed by
having predictable chunks and that means we could time and aim to use
the faster peers.
This is becoming relevant as we can see a huge difference where peers
give you 10x performance compared to some of the slower ones.
2024-02-23 22:08:28 +01:00
tomFlowee a53d03c5a3 Avoid too harsh a reaction on slowness
Afterall, the slowness can very well be temporary.
2024-02-23 22:01:48 +01:00
tomFlowee 58ec8fb8f8 Fix typo in enum name. 2024-02-23 17:28:40 +01:00
tomFlowee b93a993eaf Fix rare case of not downloading 1 block.
If between the first peer finishing downloading and the second
finishing downloading a block was mined, we need to pick a different
peer for the block the first one didn't download.
2024-02-10 19:50:44 +01:00
tomFlowee feb3b29a08 Tweak numbers 2024-02-07 16:30:20 +01:00
tomFlowee 4cb4100cec Check peers more agressively
With the expansion of the database more agressive, checking a
larger set of peers for one that works becomes more important, as
such open more connections ever cycle if we can't find good ones
after half a minute.
2024-01-29 13:03:25 +01:00
tomFlowee 35be013a19 Detect low number of usable addresses
When our addresses database is filled with old or wrong addresses, we
end up trying to connect to a large number of IPs before we find actual
peers.
When we see that is the case, let's try to find more IP addresses from
our peers.
2024-01-28 21:31:28 +01:00
tomFlowee 3f9bb5ba06 Don't assign a peer to an archived wallet
Just because this action doesn't open connections to such peers doesn't
mean they may not have been opened by someone else.
2024-01-28 19:54:54 +01:00
tomFlowee b1749e4c8c Fix peer selection to send tx to. 2024-01-17 19:49:13 +01:00
tomFlowee 542eaa0605 fix logic and be faster to sync.
The intended logic now works which avoids us now finding a download
source faster.
2024-01-14 12:26:01 +01:00
tomFlowee dba654080e Fix us not getting updates
This fixes the regression that caused a wallet not getting updates after
some time.
2023-08-17 16:58:07 +02:00
tomFlowee f8e9b45229 Be more vigilant in getting peers.
This changes the SPV action to not actually exit when sync
is completed, but instead keep running in the background
so it will detect when a wallet loses a peer and reinstate one.
2023-06-15 14:30:29 +02:00
tomFlowee f6f6c1a6f1 Make logging be consistent 2023-04-24 15:33:13 +02:00
tomFlowee 707e15874c Lower log level 2023-04-24 13:48:55 +02:00
tomFlowee f50ad44529 Tweaks in the punishment score
The PeerAddressDB keeps a score for each IP/port we have about how
useful that peer is.
This change re-visits the way we use the DB where we now are more fluid
in our approach to scores. We no longer simply forever-ban a peer after
it made a mistake once.

This rewrites the select-a-peer algo to take timing into account,
preferring a peer that we connected to recently while putting a higher
score on a peer that failed a long time ago so if we start running out
of good peers we start on the not-so-great-but-maybe-improved first.

Good behavior is likewise rewarded so a peer can become higher prio
again, but generally a new IP still gets preferred. Again, the balance
is to keep not-so-great options in the running.
2023-04-24 13:48:55 +02:00
tomFlowee 805c2d9893 Split out the too-big logging section 'p2pnet'.
This introduces the spv-sync debug section as a child of the p2p lib
logging section.
2023-04-01 22:58:11 +02:00
tomFlowee 764a022b55 Swap debug output for more logical reading. 2023-04-01 22:54:43 +02:00
tomFlowee bff0b1df21 Fix in restart location.
Make sure we continue to the tip as fast as possible (no duplicates) on
sleep or otherwise losing a peer.
2023-04-01 22:54:43 +02:00
tomFlowee 1d309cd7ae P2PNet: re-do SVP's bloom filter and mempool.
Every peer that we connect to should get the bloom filter set and it
should also get the 'mempool' call sent once which will make that peer
respond with all matches of the bloom filters which are in the mempool.

The tricky part is that we should have the latest bloom filter set on
each of those peers before the mempool is sent, since they work
together.
Also if we are behind, the mempool should not be sent. (It can cause
problems in the wallet if we receive unconfirmed transactions before
mined transactions)

So, when a peer starts downloading merkle blocks, the bloom filter of all
the other peers becomes invalid the moment a match is found by an actual
wallet.
This is Ok on one peer because the merkleblock automatically updates the
filter on match on the server side, but obviously not on the other peers
we have for that wallet.

The approach we follow is that as soon as a sync-run is done on a single
peer (we do a main and also a backup sync), we tell the wallet to re-
build its bloom filter for _all_ peers and if the sync that peer did
leads us to be at the chain-tip, we also send each peer the mempool
command.
2023-04-01 22:54:35 +02:00
tomFlowee 2c0e0bad75 Update SyncChainAction to present day concepts
When the SyncChainAction was written, various interactions we do
today in the ConnectionManager did not happen yet. Features in
Peer didn't exist yet.

This updates the SyncChainAction to take those items into account
and be more responsive and conclue we are 'up to date' faster,
while also leaving behind a better state.
2023-03-27 15:20:50 +02:00
tomFlowee 70e4f2292e Refactor the SPV merkleblock/mempool sending
Tuesdays idea of adding some code into the SyncSPVAction didn't feel
right.
A second look made clear that bloom filter updates make much more sense
to go hand in hand with sending a mempool message. Especially since they
depend on each other on the server side.

To-rehash:
the wallet may decide at any time that a new bloom filter is needed. It
then uses the superclass (code in p2plib) PrivacySegment, to build that
filter. As part of that we get a lock object which, when going out of
scope, makes the peers that are subscribed to the privacySegment send
out the filter.

This separation of concerns means that the subclass wallet in the app
doens't know about peers or messages, only its superclass PrivacySegment
does.

What we did in this change is make the PrivacySegment class decide to
combine a bloom update with a mempool call. Typicall only once per
connection.

This means I can remove hacks in the SyncSPVAction which forced the
sending of the mempool message separately.
2023-02-24 19:41:42 +01:00
tomFlowee ca58fbad98 Change job-description: ensure connections are made
The job description of this component is to sync a wallet. Its means to
that end is to connect to peers.

Problem is that when we startup and the whole system is already in-sync,
then we forget to connect to peers. (that wasn't in the job description,
it just happened to be done as a sideeffect).

This changes the SyncSPVAction's job description to also make sure that
each wallet has the required number of peers.
2023-02-23 22:40:40 +01:00
tomFlowee af3618f473 Send 'mempool' to all peers
We send a 'mempool' p2p command to a peer after we did a series of
merkleblock downloads.
This code adds the mempool p2p command to be sent to peers that didn't
participate in the merkleblock download and thus get the best out of all
our connected peers.
2023-02-21 20:29:26 +01:00
tomFlowee d2fa084109 Add some comments. 2023-02-20 18:16:58 +01:00
tomFlowee bfda224542 Use static_cast instead. 2022-11-08 12:23:00 +01:00
tomFlowee d32013f8be Avoid accidental sync. 2022-07-13 13:57:45 +02:00
tomFlowee e17ba3bc58 Add a property 'enabled' on PrivacySegment
A not-enabled PrivacySegment will not have its merkleblocks downloaded.
2022-06-23 23:17:05 +02:00
tomFlowee 3a9863dbe3 Simplify the backup sync feature.
The bloom filter includes all the unspent outputs, so we can just
use the latest one if we want to get any transactions the first
peer omitted.
2021-11-26 18:04:38 +01:00
tomFlowee a7c8f02c09 Face the reality of low number of testnet nodes. 2021-10-31 15:14:34 +01:00
tomFlowee 1efcc39f42 Avoid doing work for an empty wallet. 2021-10-27 19:14:09 +02:00
tomFlowee 77bd1ac74f Improve the SPV sync action.
This re-thinks the way we assign new peers and massively speeds up the
finding of enough peer for our wallets.
2021-07-30 16:56:25 +02:00
tomFlowee d3f1d7f454 Whitepace and minor fixes. 2021-02-05 17:32:36 +01:00
tomFlowee adfe4081cb Update copyright notice and email address 2021-02-02 13:08:07 +01:00
tomFlowee 8e44b058af Add flags getter 2020-12-17 09:08:34 +01:00
TomZ 301a4ca3ee Fix properly following the chain-tip
This is done in several steps:

1. Separate my height from the remote peer heights.
Instead of assuming we have one height, recognize that a peer may
not be at the tip at the same time we are. We monitor headers/invs
to update the 'peerHeight' variable.

2. Ask for merkle blocks from a peer to the maximum height of that
peer (but not later than what we validated to be true).
This avoids us asking past the remotes tip which they didn't like.

3. Redo the SyncSPVAction to use all this and make it much more
reliable in finding peers to download from and getting all the
changes as fast as possible.
2020-11-13 21:03:56 +01:00
TomZ 0556bc56d1 Fix bugs in SPV sync behavior. 2020-11-09 18:38:38 +01:00
TomZ d2869ef06b Fix bug where we'd ban perfectly good peers
Due to misdetection of stalling the download.
2020-11-07 15:03:27 +01:00
TomZ 781805d6a9 Less waiting while finding proper peers 2020-11-05 21:47:54 +01:00
TomZ 3f5fe41534 P2PNet: Support multiple chains.
This adds support for the testnet4 chain.
2020-10-29 21:47:53 +01:00
TomZ 4b0bcf7bc9 Add priority to privacySegment
We connect to the "first" priority stated segments first, in order to
allow the UX to be made much better since it may take a bit of time to
find peers.
2020-10-19 14:04:57 +02:00
TomZ c09aed6692 Add comment. 2020-05-15 17:41:52 +02:00
TomZ c2d53d75e4 Add some extra methods on the privacySegment
this allows more mature usage of the bloom filter.
2020-05-15 17:18:42 +02:00
TomZ fb6f91bf79 Simplify p2pnet ownership
Make the Peer object be owned by a shared pointer.
2020-05-05 22:53:25 +02:00
TomZ 25ffc84f80 Introduce new lib p2p
We reuse the NetworkManager lower level code in order to connect
to the Bitcoin P2P network.
This implements the basics for anyone wanting to be a player on
this network.
2020-04-20 21:49:03 +02:00