mirror of
https://github.com/mempool/mempool.git
synced 2025-03-03 17:47:01 +01:00
Merge pull request #3753 from mempool/mononaut/fix-difficulty-estimate
Fix difficulty estimate
This commit is contained in:
commit
6141516eb2
2 changed files with 28 additions and 4 deletions
|
@ -14,11 +14,11 @@ describe('Mempool Difficulty Adjustment', () => {
|
||||||
750134, // Current block height
|
750134, // Current block height
|
||||||
0.6280047707459726, // Previous retarget % (Passed through)
|
0.6280047707459726, // Previous retarget % (Passed through)
|
||||||
'mainnet', // Network (if testnet, next value is non-zero)
|
'mainnet', // Network (if testnet, next value is non-zero)
|
||||||
0, // If not testnet, not used
|
0, // Latest block timestamp in seconds (only used if difficulty already locked in)
|
||||||
],
|
],
|
||||||
{ // Expected Result
|
{ // Expected Result
|
||||||
progressPercent: 9.027777777777777,
|
progressPercent: 9.027777777777777,
|
||||||
difficultyChange: 12.562233927411782,
|
difficultyChange: 13.180707740199772,
|
||||||
estimatedRetargetDate: 1661895424692,
|
estimatedRetargetDate: 1661895424692,
|
||||||
remainingBlocks: 1834,
|
remainingBlocks: 1834,
|
||||||
remainingTime: 977591692,
|
remainingTime: 977591692,
|
||||||
|
@ -41,7 +41,7 @@ describe('Mempool Difficulty Adjustment', () => {
|
||||||
],
|
],
|
||||||
{ // Expected Result is same other than timeOffset
|
{ // Expected Result is same other than timeOffset
|
||||||
progressPercent: 9.027777777777777,
|
progressPercent: 9.027777777777777,
|
||||||
difficultyChange: 12.562233927411782,
|
difficultyChange: 13.180707740199772,
|
||||||
estimatedRetargetDate: 1661895424692,
|
estimatedRetargetDate: 1661895424692,
|
||||||
remainingBlocks: 1834,
|
remainingBlocks: 1834,
|
||||||
remainingTime: 977591692,
|
remainingTime: 977591692,
|
||||||
|
@ -54,6 +54,29 @@ describe('Mempool Difficulty Adjustment', () => {
|
||||||
expectedBlocks: 161.68833333333333,
|
expectedBlocks: 161.68833333333333,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
[ // Vector 3 (mainnet lock-in (epoch ending 788255))
|
||||||
|
[ // Inputs
|
||||||
|
dt('2023-04-20T09:57:33.000Z'), // Last DA time (in seconds)
|
||||||
|
dt('2023-05-04T14:54:09.000Z'), // Current time (now) (in seconds)
|
||||||
|
788255, // Current block height
|
||||||
|
1.7220298879531821, // Previous retarget % (Passed through)
|
||||||
|
'mainnet', // Network (if testnet, next value is non-zero)
|
||||||
|
dt('2023-05-04T14:54:26.000Z'), // Latest block timestamp in seconds
|
||||||
|
],
|
||||||
|
{ // Expected Result
|
||||||
|
progressPercent: 99.95039682539682,
|
||||||
|
difficultyChange: -1.4512637555574193,
|
||||||
|
estimatedRetargetDate: 1683212658129,
|
||||||
|
remainingBlocks: 1,
|
||||||
|
remainingTime: 609129,
|
||||||
|
previousRetarget: 1.7220298879531821,
|
||||||
|
previousTime: 1681984653,
|
||||||
|
nextRetargetHeight: 788256,
|
||||||
|
timeAvg: 609129,
|
||||||
|
timeOffset: 0,
|
||||||
|
expectedBlocks: 2045.66,
|
||||||
|
},
|
||||||
|
],
|
||||||
] as [[number, number, number, number, string, number], DifficultyAdjustment][];
|
] as [[number, number, number, number, string, number], DifficultyAdjustment][];
|
||||||
|
|
||||||
for (const vector of vectors) {
|
for (const vector of vectors) {
|
||||||
|
|
|
@ -34,11 +34,12 @@ export function calcDifficultyAdjustment(
|
||||||
const remainingBlocks = EPOCH_BLOCK_LENGTH - blocksInEpoch;
|
const remainingBlocks = EPOCH_BLOCK_LENGTH - blocksInEpoch;
|
||||||
const nextRetargetHeight = (blockHeight >= 0) ? blockHeight + remainingBlocks : 0;
|
const nextRetargetHeight = (blockHeight >= 0) ? blockHeight + remainingBlocks : 0;
|
||||||
const expectedBlocks = diffSeconds / BLOCK_SECONDS_TARGET;
|
const expectedBlocks = diffSeconds / BLOCK_SECONDS_TARGET;
|
||||||
|
const actualTimespan = (blocksInEpoch === 2015 ? latestBlockTimestamp : nowSeconds) - DATime;
|
||||||
|
|
||||||
let difficultyChange = 0;
|
let difficultyChange = 0;
|
||||||
let timeAvgSecs = blocksInEpoch ? diffSeconds / blocksInEpoch : BLOCK_SECONDS_TARGET;
|
let timeAvgSecs = blocksInEpoch ? diffSeconds / blocksInEpoch : BLOCK_SECONDS_TARGET;
|
||||||
|
|
||||||
difficultyChange = (BLOCK_SECONDS_TARGET / timeAvgSecs - 1) * 100;
|
difficultyChange = (BLOCK_SECONDS_TARGET / (actualTimespan / (blocksInEpoch + 1)) - 1) * 100;
|
||||||
// Max increase is x4 (+300%)
|
// Max increase is x4 (+300%)
|
||||||
if (difficultyChange > 300) {
|
if (difficultyChange > 300) {
|
||||||
difficultyChange = 300;
|
difficultyChange = 300;
|
||||||
|
|
Loading…
Add table
Reference in a new issue