Number of double spend proofs (data from 2021-05-21)

Unusually high rates of double spend proofs were observed on 2021-05-21:
about one DSP every few seconds.

As I have my BCHN node running with debug=dsproof for a long time, this rate was definitely beyond the ordinary.

I decided to log & graph, here is an initial plot.

Raw data in dsproofs · master · freetrader / Bitcoin Cash data analysis · GitLab .

The following pattern, roughly, was seen:

  • high rate of DSPs until some plateau, then totally or almost totally flat (perhaps only a few “natural” DSPs arriving)
  • block was mined
  • DSP generation resumed directly after block mined
  • number of DSPs reported in memory dropped sharpy a short while after block found (but not immediately)

The data/plot includes DSPs which are considered “orphans”.

The sharp drop-offs are very likely due to orphaned DSPs being reaped at regular intervals, affecting the orphans that had been created when a block was found. In BCHN even valid DSPs are kept around as orphans for a while after their txs are accepted in a block, in case of a re-org.

The DSP activity subsided over the course of a few hours.

The direct cause of the activity is yet unknown. It has been speculated that it could be some service which is re-signing and re-broadcasting transactions.

Some longer observations will be made.

4 Likes

More data added from overnight.

Here are some more plots.

One from the start of collection, showing the initial spikes in relation to most recent activity:

And this one below is a zoom-in on activity since the original first plot, for more detail on recent activity.

IMO the “anomalous” DSP activity has not ceased, it is just occurring at lower intensity but still above what used to be the normal background level. Again, imo, I would need to analyse a lot more back logs, it’s just a feeling from eyeballing past DSP activity in log files.

1 Like

There was a site that used to also check double-spending in BCH, but stopped working after December 2020 suspiciously enough. Through that, some of the DSPs may be explained through some of its historical data. One of the things that actually created double-spends in BCH is SLP mining, specifically coins like Mistcoin, MAZE, etc.

These coins essentially create a transaction by reading the previous minting baton, using an unspent output as an input, and then wait for the next block. In a way, it counts as a double-spend when two miners mine on the same coin and one with a faster transaction broadcasting wins but sometimes the losers manage to get their transactions submitted anyhow.

In a simpler explanation, my hypothesis with accumulating DSPs is due to SLP miners creating transactions and waiting for another block, unknowingly that their transactions are not recognized as someone has already won the SLP mint for that block. The programs used did clean the data regularly.

2 Likes

The site is still up (if we are thinking of the same one):

https://doublespend.cash/

It is run by @dagurval .

However, I am unsure how to relate the current statistics on the site to the “double spend attempts” I am measuring via a BCH node. Maybe the site applies some additional criteria. But it’s fairly obvious the numbers (as measured by DS proofs) and the site’s figures diverge a bit…

2 Likes

Further data has been added to the repo. Unfortunately there was a gap in the collection.

2 Likes

For comparison: (from doublespend.cash)

Interesting data. Thanks for the graphs freetrader. Thorough as always.

Just to comment here: Well the number of DSPs dropping sharply after a block is natural… after all they only go with in-mempool txns and when a mempool txn is confirmed in a block, the DSP ends its lifecycle… so one should normally see sharp drops after a block is confirmed… only for the number of DSPs to creep up again as the time between blocks increases.

However I do agree that there is a large number of these lately and it’s difficult to say if this was always the state of the network and we just never observed this due to lack of tracking double-spends… or if someone is playing around with something to produce them now.

The timing is such that the drop in DSP does not occur immediately after a block is found.

At least not in the observed spike cases from May 21. I thought the explanation is that they get assigned to the DSP orphan pool when a block is mined, and only reaped later. Might need to check on that assumption.

Re: the number:

No, I’ve been observing (but not recording) with debug=dsproof for much longer, and the spike volume – I would even say the regular volume – is above what I used to see.

I do expect people to play around, test, and there’s been reports of “normal” production of conflicting transactions from some services.

Yeah so there is a 90s - 180s or so window where they may live a bit longer in case of reorg … they may live as orphans. I am not sure if you are doing getdsprooflist orphans=true or how you are collecting the data… but yes they would be living as orphans for up to 180s after a block is found (typically around 90s)… so maybe that’s it?

Yeah, I’ve been running getdsprooflist 0 true

1 Like

NVM. I went back and read what you wrote again. Sorry for skimming first time – so yes you are collecting orphans and yes you did acknowledge the DSP-lives-as-orphan for a time in your writeup. Ok, cool.

Looks indeed like someone is playing with DSProofs (logs from yesterday):

13:06:43 [DSProof] Got DSPROOF message 
    . 32 [DSProof] DoubleSpend Proof postponed: is orphan 
13:08:17 [DSProof] punish 31 
    .400 [Net] Misbehaving Id: 31 0 => 1 
13:08:42 [DSProof] Got DSPROOF message 
    . 66 [DSProof] DoubleSpend Proof postponed: is orphan 
13:10:17 [DSProof] punish 27 
    .400 [Net] Misbehaving Id: 27 0 => 1 
13:10:42 [DSProof] Got DSPROOF message 
    .147 [DSProof] DoubleSpend Proof postponed: is orphan 
13:10:48 [DB] Close block files unmapped 1/2 files
13:12:17 [DSProof] punish 13 
    .401 [Net] Misbehaving Id: 13 0 => 1 
13:12:42 [DSProof] Got DSPROOF message 
    .100 [DSProof] DoubleSpend Proof postponed: is orphan 
13:14:17 [DSProof] punish 21 
    .401 [Net] Misbehaving Id: 21 0 => 1 
13:14:42 [DSProof] Got DSPROOF message 
    . 82 [DSProof] DoubleSpend Proof postponed: is orphan 
13:16:17 [DSProof] punish 24 
    .402 [Net] Misbehaving Id: 24 0 => 1 
13:16:42 [DSProof] Got DSPROOF message 
    . 74 [DSProof] DoubleSpend Proof postponed: is orphan 
13:17:52 [DSProof] Got DSPROOF message 
    .949 [DSProof] DoubleSpend Proof postponed: is orphan 
13:18:17 [DSProof] punish 16 
    .402 [Net] Misbehaving Id: 16 0 => 1 
13:18:41 [DSProof] Got DSPROOF message 
    .986 [DSProof] DoubleSpend Proof postponed: is orphan 
13:19:44 [DSProof] Got DSPROOF message 
    .403 [DSProof] punish 31 
    .403 [Net] Misbehaving Id: 31 1 => 2 
    .403 [DSProof] punish 10 
    .403 [Net] Misbehaving Id: 10 0 => 1 
13:20:41 [DSProof] Got DSPROOF message 
    .965 [DSProof] DoubleSpend Proof postponed: is orphan 
13:21:52 [DSProof] Got DSPROOF message 
    .  2 [DSProof] DoubleSpend Proof postponed: is orphan 
13:22:17 [DSProof] punish 6 
    .404 [Net] Misbehaving Id: 6 0 => 1 
13:22:42 [DSProof] Got DSPROOF message 
    . 99 [DSProof] DoubleSpend Proof postponed: is orphan 
13:24:17 [DSProof] punish 42 
    .404 [Net] Misbehaving Id: 42 0 => 1 
    .404 [DSProof] punish 32 
    .404 [Net] Misbehaving Id: 32 0 => 1 
13:24:41 [DSProof] Got DSPROOF message 
    .977 [DSProof] DoubleSpend Proof postponed: is orphan 
13:25:52 [DSProof] Got DSPROOF message 
    . 20 [DSProof] DoubleSpend Proof postponed: is orphan 
13:26:17 [DSProof] punish 2 
    .405 [Net] Misbehaving Id: 2 0 => 1 
13:26:41 [DSProof] Got DSPROOF message 
    .982 [DSProof] DoubleSpend Proof postponed: is orphan 
    .405 [DSProof] punish 13 
    .405 [Net] Misbehaving Id: 13 1 => 2 
    .405 [DSProof] punish 22 
    .406 [Net] Misbehaving Id: 22 0 => 1 
13:29:51 [DSProof] Got DSPROOF message 
    .882 [DSProof] DoubleSpend Proof postponed: is orphan 
13:31:58 [DB] Close block files unmapped 1/3 files
13:32:17 [DSProof] punish 16 
    .406 [Net] Misbehaving Id: 16 1 => 2 
13:33:51 [DSProof] Got DSPROOF message 
    .866 [DSProof] DoubleSpend Proof postponed: is orphan 
13:36:17 [DSProof] punish 6 
    .407 [Net] Misbehaving Id: 6 1 => 2 
13:43:08 [DSProof] Got DSPROOF message 
13:43:12 [DSProof] Got DSPROOF message 
13:43:15 [DSProof] Got DSPROOF message 
13:43:17 [DSProof] Got DSPROOF message 
13:43:20 [DSProof] Got DSPROOF message 
13:47:58 [DSProof] Got DSPROOF message 
13:48:54 [DSProof] Got DSPROOF message 
13:50:17 [DSProof] Got DSPROOF message 
13:57:30 [DSProof] Got DSPROOF message 
13:57:33 [DSProof] Got DSPROOF message 
14:02:44 [DSProof] Got DSPROOF message 
14:02:48 [DSProof] Got DSPROOF message 
14:02:56 [DSProof] Got DSPROOF message 
14:12:40 [DSProof] Got DSPROOF message 
14:12:54 [DSProof] Got DSPROOF message 
14:12:57 [DSProof] Got DSPROOF message 
14:19:16 [DSProof] Got DSPROOF message 
14:23:05 [DSProof] Got DSPROOF message 
14:23:16 [DSProof] Got DSPROOF message 
14:28:02 [DSProof] Got DSPROOF message 
14:29:46 [DSProof] Got DSPROOF message 
14:32:59 [DSProof] Got DSPROOF message 
14:33:04 [DSProof] Got DSPROOF message 
14:37:47 [DSProof] Got DSPROOF message 
14:37:50 [DSProof] Got DSPROOF message 
14:42:46 [DSProof] Got DSPROOF message 
14:42:50 [DSProof] Got DSPROOF message 
14:42:53 [DSProof] Got DSPROOF message 
14:42:57 [DSProof] Got DSPROOF message 
14:44:48 [DSProof] Got DSPROOF message 
14:47:45 [DSProof] Got DSPROOF message 
14:47:51 [DSProof] Got DSPROOF message 
14:47:57 [DSProof] Got DSPROOF message 
14:50:46 [DSProof] Got DSPROOF message 
14:52:53 [DSProof] Got DSPROOF message 
14:52:57 [DSProof] Got DSPROOF message 
14:52:58 [DSProof] Got DSPROOF message 
14:53:00 [DSProof] Got DSPROOF message 
14:53:03 [DSProof] Got DSPROOF message 
14:53:06 [DSProof] Got DSPROOF message 
14:57:51 [DSProof] Got DSPROOF message 
14:57:54 [DSProof] Got DSPROOF message 
14:57:56 [DSProof] Got DSPROOF message 
14:57:59 [DSProof] Got DSPROOF message 
    .548 [DSProof] DoubleSpend Proof postponed: is orphan 
14:58:03 [DSProof] Got DSPROOF message 
14:58:06 [DSProof] Got DSPROOF message 
14:58:10 [DSProof] Got DSPROOF message 
14:59:40 [DSProof] Got DSPROOF message 
15:03:34 [DSProof] Got DSPROOF message 
15:03:50 [DSProof] Got DSPROOF message 
15:08:01 [DSProof] Got DSPROOF message 
15:08:04 [DSProof] Got DSPROOF message 
15:08:06 [DSProof] Got DSPROOF message 
15:08:11 [DSProof] Got DSPROOF message 
15:08:13 [DSProof] Got DSPROOF message 
    .863 [DSProof] Got DSPROOF message 
15:08:46 [DSProof] Got DSPROOF message 
15:20:58 [DSProof] Got DSPROOF message 
15:21:38 [DSProof] Got DSPROOF message 
15:23:25 [DSProof] Got DSPROOF message 
15:23:52 [DSProof] Got DSPROOF message 
    .697 [DSProof] DoubleSpend Proof postponed: is orphan 
15:26:54 [DSProof] Got DSPROOF message 
15:26:58 [DSProof] Got DSPROOF message 
15:36:10 [DSProof] Got DSPROOF message 
15:36:27 [DSProof] Got DSPROOF message 
15:36:35 [DSProof] Got DSPROOF message 
15:42:59 [DSProof] Got DSPROOF message 
15:43:01 [DSProof] Got DSPROOF message 
15:43:04 [DSProof] Got DSPROOF message 
15:43:07 [DSProof] Got DSPROOF message 
15:43:12 [DSProof] Got DSPROOF message 
15:43:14 [DSProof] Got DSPROOF message 
    .918 [DSProof] Got DSPROOF message 
15:43:22 [DSProof] Got DSPROOF message 
15:43:24 [DSProof] Got DSPROOF message 
15:43:27 [DSProof] Got DSPROOF message 
15:49:55 [DSProof] Got DSPROOF message 
    .149 [DSProof] Failure handling double spend proof. Peer: 16 Reason: DSProof didn't validate 
    .176 [Net] Misbehaving Id: 16 2 => 17 
15:50:23 [DSProof] Got DSPROOF message 
15:53:12 [DSProof] Got DSPROOF message 
    .734 [DSProof] Got DSPROOF message 
    .841 [DSProof] Got DSPROOF message 
    .841 [DSProof] Failure handling double spend proof. Peer: 16 Reason: DSProof didn't validate 
    .844 [Net] Misbehaving Id: 16 17 => 32 
16:11:13 [DSProof] Got DSPROOF message 
    . 14 [DSProof] Failure handling double spend proof. Peer: 16 Reason: DSProof didn't validate 
    . 16 [Net] Misbehaving Id: 16 32 => 47 
16:14:08 [DSProof] Got DSPROOF message 
    .968 [DSProof] Failure handling double spend proof. Peer: 16 Reason: DSProof didn't validate 
    .970 [Net] Misbehaving Id: 16 47 => 62 
16:19:15 [DSProof] Got DSPROOF message 
    . 52 [DSProof] Failure handling double spend proof. Peer: 6 Reason: DSProof didn't validate 
    . 54 [Net] Misbehaving Id: 6 2 => 17 
16:22:44 [DSProof] Got DSPROOF message 
    .860 [DSProof] Failure handling double spend proof. Peer: 16 Reason: DSProof didn't validate 
    .860 [Net] Misbehaving Id: 16 62 => 77 
16:24:11 [DSProof] Got DSPROOF message 
    .724 [DSProof] Failure handling double spend proof. Peer: 8 Reason: DSProof didn't validate 
    .725 [Net] Misbehaving Id: 8 0 => 15 
16:24:37 [DSProof] Got DSPROOF message 
16:31:15 [DSProof] Got DSPROOF message 
16:32:31 [DSProof] Got DSPROOF message 
    .510 [DSProof] Failure handling double spend proof. Peer: 8 Reason: DSProof didn't validate 
    .510 [Net] Misbehaving Id: 8 15 => 30 
16:33:12 [DSProof] Got DSPROOF message 
16:33:14 [DSProof] Got DSPROOF message 
16:33:18 [DSProof] Got DSPROOF message 
16:33:22 [DSProof] Got DSPROOF message 
16:33:25 [DSProof] Got DSPROOF message 
    .816 [DSProof] DoubleSpend Proof postponed: is orphan 
16:33:29 [DSProof] Got DSPROOF message 
16:33:32 [DSProof] Got DSPROOF message 
16:33:35 [DSProof] Got DSPROOF message 
    .533 [DSProof] Got DSPROOF message 
16:33:45 [DSProof] Got DSPROOF message 
16:33:50 [DSProof] Got DSPROOF message 
16:35:54 [DSProof] Got DSPROOF message 
    .794 [DSProof] Failure handling double spend proof. Peer: 16 Reason: DSProof didn't validate 
    .794 [Net] Misbehaving Id: 16 77 => 92 
16:37:12 [DSProof] Got DSPROOF message 
    .797 [DSProof] Failure handling double spend proof. Peer: 8 Reason: DSProof didn't validate 
    .797 [Net] Misbehaving Id: 8 30 => 45 
16:40:13 [DSProof] Got DSPROOF message 
    .674 [DSProof] Failure handling double spend proof. Peer: 16 Reason: DSProof didn't validate 
    .674 [Net] Id: 16 92 => 107 Ban threshold exceeded 
16:41:46 [DSProof] Got DSPROOF message 
    .375 [DSProof] Failure handling double spend proof. Peer: 22 Reason: DSProof didn't validate 
    .375 [Net] Misbehaving Id: 22 1 => 16 
16:43:09 [DSProof] Got DSPROOF message 
16:43:48 [DSProof] Got DSPROOF message 
    .753 [DSProof] Failure handling double spend proof. Peer: 6 Reason: DSProof didn't validate 
    .753 [Net] Misbehaving Id: 6 17 => 32 
16:44:34 [DSProof] Got DSPROOF message 
    .422 [DSProof] Failure handling double spend proof. Peer: 8 Reason: DSProof didn't validate 
    .422 [Net] Misbehaving Id: 8 45 => 60 
16:46:30 [DSProof] Got DSPROOF message 
    . 90 [DSProof] Failure handling double spend proof. Peer: 8 Reason: DSProof didn't validate 
    . 90 [Net] Misbehaving Id: 8 60 => 75 
16:46:51 [DSProof] Got DSPROOF message 
    .427 [DSProof] Failure handling double spend proof. Peer: 6 Reason: DSProof didn't validate 
    .427 [Net] Misbehaving Id: 6 32 => 47 
16:48:25 [DSProof] Got DSPROOF message 
16:48:32 [DSProof] Got DSPROOF message 
16:48:35 [DSProof] Got DSPROOF message 
16:48:37 [DSProof] Got DSPROOF message 
16:49:04 [DSProof] Got DSPROOF message 
    .982 [DSProof] Failure handling double spend proof. Peer: 8 Reason: DSProof didn't validate 
    .982 [Net] Misbehaving Id: 8 75 => 90 
16:50:12 [DSProof] Got DSPROOF message 
16:50:52 [DSProof] Got DSPROOF message 
    .896 [DSProof] Failure handling double spend proof. Peer: 6 Reason: DSProof didn't validate 
    .896 [Net] Misbehaving Id: 6 47 => 62 
16:54:37 [DSProof] Got DSPROOF message 
    .177 [DSProof] Failure handling double spend proof. Peer: 6 Reason: DSProof didn't validate 
    .177 [Net] Misbehaving Id: 6 62 => 77 
16:56:13 [DSProof] Got DSPROOF message 
    .747 [DSProof] Failure handling double spend proof. Peer: 8 Reason: DSProof didn't validate 
    .747 [Net] Id: 8 90 => 105 Ban threshold exceeded 
17:00:16 [DSProof] Got DSPROOF message 
    .935 [DSProof] Failure handling double spend proof. Peer: 6 Reason: DSProof didn't validate 
    .935 [Net] Misbehaving Id: 6 77 => 92 
17:09:36 [DSProof] Got DSPROOF message 
17:09:44 [DSProof] Got DSPROOF message 
17:12:32 [DSProof] Got DSPROOF message 
    . 63 [DSProof] Failure handling double spend proof. Peer: 10 Reason: DSProof didn't validate 
    . 63 [Net] Misbehaving Id: 10 1 => 16 
    .919 [DSProof] Got DSPROOF message 
17:13:12 [DSProof] Got DSPROOF message 
17:13:15 [DSProof] Got DSPROOF message 
17:13:18 [DSProof] Got DSPROOF message 
    .664 [DSProof] Got DSPROOF message 
17:39:04 [DSProof] Got DSPROOF message 
    .600 [DSProof] Got DSPROOF message 
17:39:12 [DSProof] Got DSPROOF message 
17:39:16 [DSProof] Got DSPROOF message 
17:50:02 [DSProof] Double spend found, creating double spend proof 9b70d30e5ce7a27f28b34c038d3fc31ff7d86f6d6de0865d5ac2d4b89363d5d0 6b07c4c61b11982fffa25ed703743c9310cb3abbb1f17901edd7c7f182938991 
    .406 [DSProof] Got DSPROOF message 
17:58:05 [DSProof] Got DSPROOF message 
17:58:09 [DSProof] Got DSPROOF message 
17:58:12 [DSProof] Got DSPROOF message 
17:58:15 [DSProof] Got DSPROOF message 
    .581 [DSProof] Got DSPROOF message 
18:08:00 [DSProof] Got DSPROOF message 
18:09:55 [DSProof] Got DSPROOF message 
    .800 [DSProof] Got DSPROOF message 
18:53:20 [DSProof] Got DSPROOF message 
18:53:24 [DSProof] Got DSPROOF message 
18:53:29 [DSProof] Got DSPROOF message 
18:53:34 [DSProof] Got DSPROOF message 
18:53:38 [DSProof] Got DSPROOF message 
18:57:57 [DSProof] Got DSPROOF message 
18:58:00 [DSProof] Got DSPROOF message 
19:03:01 [DSProof] Got DSPROOF message 
19:03:04 [DSProof] Got DSPROOF message 
19:03:20 [DSProof] Got DSPROOF message 
19:17:44 [DSProof] Got DSPROOF message 
    .830 [DSProof] Got DSPROOF message 
19:17:49 [DSProof] Got DSPROOF message 
19:17:51 [DSProof] Got DSPROOF message 
19:17:53 [DSProof] Got DSPROOF message 
19:17:56 [DSProof] Got DSPROOF message 
19:18:00 [DSProof] Got DSPROOF message 
19:18:02 [DSProof] Got DSPROOF message 
19:18:05 [DSProof] Got DSPROOF message 
19:18:09 [DSProof] Got DSPROOF message 
19:18:11 [DSProof] Got DSPROOF message 
19:18:14 [DSProof] Got DSPROOF message 
19:55:46 [DSProof] Got DSPROOF message 
    .263 [DSProof] Failure handling double spend proof. Peer: 6 Reason: DSProof didn't validate 
    .263 [Net] Id: 6 92 => 107 Ban threshold exceeded 
20:03:19 [DSProof] Got DSPROOF message 
20:03:23 [DSProof] Got DSPROOF message 
    .331 [DSProof] Got DSPROOF message 
20:03:25 [DSProof] Got DSPROOF message 
20:03:28 [DSProof] Got DSPROOF message 
20:03:29 [DSProof] Got DSPROOF message 
20:03:31 [DSProof] Got DSPROOF message 
20:03:33 [DSProof] Got DSPROOF message 
20:03:37 [DSProof] Got DSPROOF message 
20:03:40 [DSProof] Got DSPROOF message 
20:03:43 [DSProof] Got DSPROOF message 
20:03:46 [DSProof] Got DSPROOF message 
20:05:33 [DSProof] Got DSPROOF message 
20:12:01 [DSProof] Got DSPROOF message 
    .139 [DSProof] DoubleSpend Proof postponed: is orphan 
20:12:57 [DSProof] Got DSPROOF message 
20:13:00 [DSProof] Got DSPROOF message 
20:13:02 [DSProof] Got DSPROOF message 
20:16:01 [DSProof] Got DSPROOF message 
    .399 [DSProof] DoubleSpend Proof postponed: is orphan 
20:16:55 [DSProof] Got DSPROOF message 
    .258 [DSProof] Failure handling double spend proof. Peer: 2 Reason: DSProof didn't validate 
    .258 [Net] Misbehaving Id: 2 1 => 16 
20:22:14 [DSProof] Got DSPROOF message 
20:38:06 [DSProof] Got DSPROOF message 
20:38:12 [DSProof] Got DSPROOF message 
20:43:06 [DSProof] Got DSPROOF message 
20:43:08 [DSProof] Got DSPROOF message 
21:03:12 [DSProof] Got DSPROOF message 
21:03:15 [DSProof] Got DSPROOF message 
21:03:18 [DSProof] Got DSPROOF message 
21:03:22 [DSProof] Got DSPROOF message 
21:33:38 [DSProof] Got DSPROOF message 
21:33:41 [DSProof] Got DSPROOF message 
21:33:43 [DSProof] Got DSPROOF message 
21:33:46 [DSProof] Got DSPROOF message 
21:37:04 [DSProof] Got DSPROOF message 
21:53:26 [DSProof] Got DSPROOF message 
21:53:29 [DSProof] Got DSPROOF message