Bitcoin Cash
November 13th Bitcoin Cash Hardfork Technical Details
Summary
When the median time past1 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-111 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 chosen2 from B_n-2, B_n-1, B_n.
- Let B_first be chosen2 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 chainwork3 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(S0) greater than timestamp(S2) then swap S0 and S2. b. If timestamp(S0) greater than timestamp(S1) then swap S0 and S1. c. If timestamp(S1) greater than timestamp(S2) then swap S1 and S2. d. Return S1. 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