So what is the attack scenario here? Minority miner A tries to get miner B to waste its hashrate by producing an invalid block. Miner A somehow figures out miner B is using nTime
rolling past 600 seconds and its local clock is ahead of everyone else’s. Miner A mines a block such as it is invalid to everyone else but miner B, in the hope that miner B would start mining with nTime_A - 600
, roll the timestamp past nTime_A
, and find a block with nTime_B = nTime_A + s
in less than s
seconds such as A’s block is valid to the rest of the network but B’s block is not. And all that before the rest of the network found a different pair of block.
At this point this is not an attack, it’s a footgun. I don’t see how A could ever expect to gain anything from trying this.
I don’t think it’s a fair characterization of the downside. Faster subsidy emission is only one of the harms of an artificially increased block rate. And if the leeway is large enough, the block rate increase isn’t minuscule anymore. Here is some numbers:
Leeway: 10 minutes. Max diff decrease per period: 1.0004960317460319. Number of periods to take the diff to 1 is 65169.20533651417, to halve the diff is 1397.7312609540088 and to reduce it by 10% is 212.45947546985983.
Leeway: 60 minutes. Max diff decrease per period: 1.0029761904761905. Number of periods to take the diff to 1 is 10874.99226688242, to halve the diff is 233.24385460225878 and to reduce it by 10% is 35.453787426590814.
Leeway: 120 minutes. Max diff decrease per period: 1.005952380952381. Number of periods to take the diff to 1 is 5445.563646962276, to halve the diff is 116.79495712078635 and to reduce it by 10% is 17.753194781141502.
Leeway: 240 minutes. Max diff decrease per period: 1.0119047619047619. Number of periods to take the diff to 1 is 2730.8374380149667, to halve the diff is 58.57025317383194 and to reduce it by 10% is 8.902859666282216.
Code
import math
CURRENT_DIFFICULTY = 108522647629298
for leeway in [10, 60, 2*60, 4*60]:
max_rate_decrease = 1 + leeway/20160
diff_1 = math.log(CURRENT_DIFFICULTY, max_rate_decrease)
diff_half = math.log(2, max_rate_decrease)
diff_ninety = math.log(1/0.9, max_rate_decrease)
print(f"Leeway: {leeway} minutes. Max diff decrease per period: {max_rate_decrease}. Number of periods to take the diff to 1 is {diff_1}, to halve the diff is {diff_half} and to reduce it by 10% is {diff_ninety}.")