Skip to content

Conversation

@Sjors
Copy link
Member

@Sjors Sjors commented Jan 23, 2025

Adjust the timewarp test to better illustrate the griefing attack discussed here: https://delvingbitcoin.org/t/timewarp-attack-600-second-grace-period/1326/19

Changing MAX_TIMEWARP to something > MAX_FUTURE_BLOCK_TIME in consensus.h and mining_basic.py will cause the updated test to fail. I'm not proposing such a change here of course. The new test should be useful guidance for pool software developers, for why they really should use curtime, or least not ignore mintime.

Additionally, if the proposal is changed to make MAX_TIMEWARP > MAX_FUTURE_BLOCK_TIME then this test will break, which could be used to demonstrate there's no such griefing attack anymore.

Originally part of #31600.

@DrahtBot
Copy link
Contributor

DrahtBot commented Jan 23, 2025

The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

Code Coverage & Benchmarks

For details see: https://corecheck.dev/bitcoin/bitcoin/pulls/31725.

Reviews

See the guideline for information on the review process.

Type Reviewers
ACK Prabhat1308
Concept NACK darosior

If your review is incorrectly listed, please copy-paste <!--meta-tag:bot-skip--> into the comment that the bot should ignore.

Conflicts

No conflicts as of last run.

@Sjors
Copy link
Member Author

Sjors commented Feb 1, 2025

#31600 landed, ready for review

Copy link
Contributor

@Prabhat1308 Prabhat1308 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ACK 6065b78

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The log mentions t to be strictly less than MAX_FUTURE_BLOCK_TIME. But in line 165 , the assert statement is for future<=MAX_FUTURE_BLOCK_TIME.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed the log statement to <=

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

on previous line 199 , mtp is set to node.getblock(node.getbestblockhash())["mediantime"] + 1 . from the rpc commands , shouldnt mtp be just node.getblock(node.getbestblockhash())["mediantime"] ? and then nTime is correct with mtp + 1. Have checked it locally and the test passes.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, fixed.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is introducing a more stricter equality. Is it because we now have the liberty to choose future as we wish whereas previously it was t + MAX_FUTURE_BLOCK_TIME which not necessarily be equal to template's curtime ?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

more stricter equality.

Stricter than what? I don't fully remember what the original test was trying to do here. But we know the exact value to expect.

curtime is equal to nTime of the template, which is controlled by UpdateTime() in node/miner.cpp. It starts with the actual current time, but then increases if needed to account for the MTP+1 rule and timewarp - and no more than that.

@Sjors Sjors force-pushed the 2025/01/timewarp-grief branch from 6065b78 to d016d4f Compare February 12, 2025 09:19
@DrahtBot
Copy link
Contributor

There hasn't been much activity lately. What is the status here?

Finding reviewers may take time. However, if the patch is no longer relevant, please close this pull request. If the author lost interest or time to work on this, please close it and mark it 'Up for grabs' with the label, so that it can be picked up in the future.

1 similar comment
@DrahtBot
Copy link
Contributor

There hasn't been much activity lately. What is the status here?

Finding reviewers may take time. However, if the patch is no longer relevant, please close this pull request. If the author lost interest or time to work on this, please close it and mark it 'Up for grabs' with the label, so that it can be picked up in the future.

On testnet4 with the timewarp mitigation active, when pool software
ignores the curtime and mintime fields provided by the getblocktemplate
RPC or by createNewBlock() in the Mining interface, they are vulnerable
to a griefing attack.

The test is expanded to illustrate this.
@Sjors Sjors force-pushed the 2025/01/timewarp-grief branch from d016d4f to 37d2246 Compare August 25, 2025 12:13
@Sjors
Copy link
Member Author

Sjors commented Aug 25, 2025

@Prabhat1308 can you update your review to the latest version?

I've rebased it just in case.

@Prabhat1308
Copy link
Contributor

re-ACK 37d2246

@fanquake
Copy link
Member

fanquake commented Dec 3, 2025

@darosior @sedited want to leave a conceptual opinion here, given your comments in #31600?

Copy link
Member

@darosior darosior left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is adding a test that demonstrates how Bitcoin Core would reject a block from a broken mining pool software that:

  • ignores the block chain and set the block timestamp using wall clock time;
  • ignores the mintime value provided by Bitcoin Core's block template;
  • ignores the curtime value provided by Bitcoin Core's block template.

There is many, many ways a mining pool software that disregards consensus rules and values provided by Bitcoin Core's block template may create an invalid block. I don't think it's useful to exercise one such convoluted scenario in particular in Bitcoin Core's functional test suite. For this reason i am by default a (weakly held) Concept NACK on this change.

Weakly held because it's simply a test change and i'm happy to be convinced otherwise.

@Sjors
Copy link
Member Author

Sjors commented Dec 3, 2025

BIP54 has been updated to use a 2 hour grace period rather than the MAX_TIMEWARP = 600; which our code still uses.

If you change MAX_TIMEWARP to 7200 there's no way to make the test in this PR pass. I'll leave that as an exercise to the reader.

Note that the list of three bullet items boils down to a single mistake: using wall time for nTime. And as documented in the Delving post, that's not a hypothetical mistake. It's no longer a problem because BIP54 uses the longer grace period.

@Sjors Sjors closed this Dec 3, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants