How to get next Zcash halving height?

Hello friends!
I’m working on this simple “Zcash Halving Countdown”, but I’m not sure how to get the next halving block height.
Reading the Zcash Protocol Specification page 134, I got the following formula:

But this formula returns the halving number, e.g. 0, 1, 2, and so on…

I can bruteforce every block height incremently, until `halving == 2`, but I don’t like this solution.

I would like to know if there’s a formula to get the next halving height, or the remaining blocks until next halving?

edit
Running a bruteforce for few iterations:

``````Next halving: 2726400
Next halving: 4406400
Next halving: 6086400
``````

Looks like halvings occurs every 1680000 blocks, is that correct?

2 Likes

If you look at the equation, N changes every `PostBlossomHalvingInterval`.

PS: It is a staircase function.

2 Likes

Hello @hanh
Could you share more details here please ?

Hello @hanh
Please do it fast so we could work on it .

`postBlossomHalvingInterval` is defined by:

``````const postBlossomHalvingInterval = Math.floor(preBlossomHalvingInterval * blossomPoWTargetSpacingRatio)
``````

Where:

• `preBlossomHalvingInterval` is a constant with the value `840000`
• `blossomPoWTargetSpacingRatio` is the ratio between:
• `preBlossomPoWTargetSpacing` = 150
• `postBlossomPoWTargetSpacing` = 75

Meaning `postBlossomHalvingInterval` equals `840000 * 2 = 1680000`.

So `N` changes every `1680000` blocks counting from the first halving, e.g.:

Halving N Height
1 1046400
2 2726400
3 4406400

Not 100% sure, but I think this is correct.

1 Like

Full javascript code for `height > SlowStartShift` AND `isBlossomActivated(height)`

``````function calculateHalvingNumber(height) {
const blossomActivationHeight = 653600;
const preBlossomHalvingInterval = 840000;

const preBlossomPoWTargetSpacing = 150;
const postBlossomPoWTargetSpacing = 75;

const blossomPoWTargetSpacingRatio = preBlossomPoWTargetSpacing / postBlossomPoWTargetSpacing;
const postBlossomHalvingInterval = Math.floor(preBlossomHalvingInterval * blossomPoWTargetSpacingRatio)

const slowStartInterval = 20000;
const slowStartShift = slowStartInterval / 2;

const halving = Math.floor(( (blossomActivationHeight - slowStartShift) / preBlossomHalvingInterval ) + ( (height - blossomActivationHeight) / postBlossomHalvingInterval ));

return halving;
}
``````
2 Likes