November 13th Bitcoin Cash Hardfork Technical Details
Summary
When the median time past[1] of the most recent 11 blocks (MTP-11) is greater than or equal to UNIX timestamp 1510600000 Bitcoin Cash will execute a hardfork according to this specification. Starting from the next block these three consensus rules changes will take effect:
- Enforcement of LOW_S signatures (BIP 0146)
- Enforcement of NULLFAIL (BIP 0146)
- A replacement for the emergency difficulty adjustment. The algorithm for the new difficulty adjustment is described below
Difficulty Adjustment Algorithm Description
To calculate the difficulty of a given block (B_n+1), with an MTP-11[1] greater than or equal to the unix timestamp 1510600000, perform the following steps:
- NOTE: Implementations must use integer arithmetic only
- Let B_n be the Nth block in a Bitcoin Cash Blockchain.
- Let B_last be chosen[2] from [B_n-2, B_n-1, B_n].
- Let B_first be chosen[2] from [B_n-146, B_n-145, B_n-144].
- Let the Timespan (TS) be equal to the difference in UNIX timestamps (in seconds) between B_last and B_first within the range [72 * 600, 288 * 600]. Values outside should be treated as their respective limit
- Let the Work Performed (W) be equal to the difference in chainwork[3] between B_last and B_first.
- Let the Projected Work (PW) be equal to (W * 600) / TS.
- Let Target (T) be equal to the (2^256 - PW) / PW. This is calculated by taking the two’s complement of PW (-PW) and dividing it by PW (-PW / PW).
- The target difficulty for block B_n+1 is then equal to the lesser of T and 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
Test Case
- Create a genesis block with the following data:
nHeight = 0;
nTime = 1269211443;
nBits = 0x1c0fffff;
- Add 2049 blocks at 600 second intervals with the same nBits.
- Add another 10 blocks at 600 second intervals. nBits should remain constant.
- Add a block 6000 seconds in the future with nBits remaining the same.
- Add a block -4800 seconds from the previous block. nBits should remain the constant.
- Add 20 blocks at 600 second intervals. nBits should remain constant.
- Add a block at a 550 second interval. nBits should remain constant.
- Add 10 blocks at 550 second intervals. The target difficulty should slowly decrease.
- nBits should be 0x1c0fe7b1.
- Add 20 more blocks at 10 second intervals. The target difficulty decrease quickly.
- nBits should be 0x1c0db19f.
- Add 1 block at an interval of 6000 seconds.
- nBits should be 0x1c0d9222.
- Produce 93 blocks at 6000 second intervals. The target difficulty should increase.
- nBits should be 0x1c2f13b9.
- Add one block at 6000 seconds.
- nBits should be 0x1c2ee9bf.
- Add 192 blocks at 6000 second intervals. The target difficulty should increase.
- nBits should be 0x1d00ffff.
- Add 5 blocks at 6000 second intervals. Target should stay constant at the maximum value.
References
FAQ position: 100
Q: Does this imply that if the blocks are timestamped sequentially, the last block has no effect since it will look at the block before that one?
A: Yes
Footnotes
- The MTP-11 of a block is defined as the median timestamp of the last 11 blocks prior to, and including, a specific block
- A block is chosen via the following mechanism: Given a list: S = [B_n-2, B_n-1, B_n] a. If timestamp(S[0]) greater than timestamp(S[2]) then swap S[0] and S[2]. b. If timestamp(S[0]) greater than timestamp(S[1]) then swap S[0] and S[1]. c. If timestamp(S[1]) greater than timestamp(S[2]) then swap S[1] and S[2]. d. Return S[1]. See GetSuitableBlock
- Chainwork for a Block (B) is the sum of block proofs from the genesis block up to and including block
B
.Block proof
is defined in chain.cpp