1 // Copyright (c) 2013-2017 The btcsuite developers
2 // Use of this source code is governed by an ISC
3 // license that can be found in the LICENSE file.
11 "github.com/btcsuite/btcd/chaincfg/chainhash"
15 // bigOne is 1 represented as a big.Int. It is defined here to avoid
16 // the overhead of creating it multiple times.
17 bigOne = big.NewInt(1)
19 // oneLsh256 is 1 shifted left 256 bits. It is defined here to avoid
20 // the overhead of creating it multiple times.
21 oneLsh256 = new(big.Int).Lsh(bigOne, 256)
24 // HashToBig converts a chainhash.Hash into a big.Int that can be used to
25 // perform math comparisons.
26 func HashToBig(hash *chainhash.Hash) *big.Int {
27 // A Hash is in little-endian, but the big package wants the bytes in
28 // big-endian, so reverse them.
31 for i := 0; i < blen/2; i++ {
32 buf[i], buf[blen-1-i] = buf[blen-1-i], buf[i]
35 return new(big.Int).SetBytes(buf[:])
38 // CompactToBig converts a compact representation of a whole number N to an
39 // unsigned 32-bit number. The representation is similar to IEEE754 floating
42 // Like IEEE754 floating point, there are three basic components: the sign,
43 // the exponent, and the mantissa. They are broken out as follows:
45 // * the most significant 8 bits represent the unsigned base 256 exponent
46 // * bit 23 (the 24th bit) represents the sign bit
47 // * the least significant 23 bits represent the mantissa
49 // -------------------------------------------------
50 // | Exponent | Sign | Mantissa |
51 // -------------------------------------------------
52 // | 8 bits [31-24] | 1 bit [23] | 23 bits [22-00] |
53 // -------------------------------------------------
55 // The formula to calculate N is:
56 // N = (-1^sign) * mantissa * 256^(exponent-3)
58 // This compact form is only used in bitcoin to encode unsigned 256-bit numbers
59 // which represent difficulty targets, thus there really is not a need for a
60 // sign bit, but it is implemented here to stay consistent with bitcoind.
61 func CompactToBig(compact uint32) *big.Int {
62 // Extract the mantissa, sign bit, and exponent.
63 mantissa := compact & 0x007fffff
64 isNegative := compact&0x00800000 != 0
65 exponent := uint(compact >> 24)
67 // Since the base for the exponent is 256, the exponent can be treated
68 // as the number of bytes to represent the full 256-bit number. So,
69 // treat the exponent as the number of bytes and shift the mantissa
70 // right or left accordingly. This is equivalent to:
71 // N = mantissa * 256^(exponent-3)
74 mantissa >>= 8 * (3 - exponent)
75 bn = big.NewInt(int64(mantissa))
77 bn = big.NewInt(int64(mantissa))
78 bn.Lsh(bn, 8*(exponent-3))
81 // Make it negative if the sign bit is set.
89 // BigToCompact converts a whole number N to a compact representation using
90 // an unsigned 32-bit number. The compact representation only provides 23 bits
91 // of precision, so values larger than (2^23 - 1) only encode the most
92 // significant digits of the number. See CompactToBig for details.
93 func BigToCompact(n *big.Int) uint32 {
94 // No need to do any work if it's zero.
99 // Since the base for the exponent is 256, the exponent can be treated
100 // as the number of bytes. So, shift the number right or left
101 // accordingly. This is equivalent to:
102 // mantissa = mantissa / 256^(exponent-3)
104 exponent := uint(len(n.Bytes()))
106 mantissa = uint32(n.Bits()[0])
107 mantissa <<= 8 * (3 - exponent)
109 // Use a copy to avoid modifying the caller's original number.
110 tn := new(big.Int).Set(n)
111 mantissa = uint32(tn.Rsh(tn, 8*(exponent-3)).Bits()[0])
114 // When the mantissa already has the sign bit set, the number is too
115 // large to fit into the available 23-bits, so divide the number by 256
116 // and increment the exponent accordingly.
117 if mantissa&0x00800000 != 0 {
122 // Pack the exponent, sign bit, and mantissa into an unsigned 32-bit
123 // int and return it.
124 compact := uint32(exponent<<24) | mantissa
126 compact |= 0x00800000
131 // CalcWork calculates a work value from difficulty bits. Bitcoin increases
132 // the difficulty for generating a block by decreasing the value which the
133 // generated hash must be less than. This difficulty target is stored in each
134 // block header using a compact representation as described in the documentation
135 // for CompactToBig. The main chain is selected by choosing the chain that has
136 // the most proof of work (highest difficulty). Since a lower target difficulty
137 // value equates to higher actual difficulty, the work value which will be
138 // accumulated must be the inverse of the difficulty. Also, in order to avoid
139 // potential division by zero and really small floating point numbers, the
140 // result adds 1 to the denominator and multiplies the numerator by 2^256.
141 func CalcWork(bits uint32) *big.Int {
142 // Return a work value of zero if the passed difficulty bits represent
143 // a negative number. Note this should not happen in practice with valid
144 // blocks, but an invalid block could trigger it.
145 difficultyNum := CompactToBig(bits)
146 if difficultyNum.Sign() <= 0 {
150 // (1 << 256) / (difficultyNum + 1)
151 denominator := new(big.Int).Add(difficultyNum, bigOne)
152 return new(big.Int).Div(oneLsh256, denominator)
155 // calcEasiestDifficulty calculates the easiest possible difficulty that a block
156 // can have given starting difficulty bits and a duration. It is mainly used to
157 // verify that claimed proof of work by a block is sane as compared to a
158 // known good checkpoint.
159 func (b *BlockChain) calcEasiestDifficulty(bits uint32, duration time.Duration) uint32 {
160 // Convert types used in the calculations below.
161 durationVal := int64(duration / time.Second)
162 adjustmentFactor := big.NewInt(b.chainParams.RetargetAdjustmentFactor)
164 // The test network rules allow minimum difficulty blocks after more
165 // than twice the desired amount of time needed to generate a block has
167 if b.chainParams.ReduceMinDifficulty {
168 reductionTime := int64(b.chainParams.MinDiffReductionTime /
170 if durationVal > reductionTime {
171 return b.chainParams.PowLimitBits
175 // Since easier difficulty equates to higher numbers, the easiest
176 // difficulty for a given duration is the largest value possible given
177 // the number of retargets for the duration and starting difficulty
178 // multiplied by the max adjustment factor.
179 newTarget := CompactToBig(bits)
180 for durationVal > 0 && newTarget.Cmp(b.chainParams.PowLimit) < 0 {
181 newTarget.Mul(newTarget, adjustmentFactor)
182 durationVal -= b.maxRetargetTimespan
185 // Limit new value to the proof of work limit.
186 if newTarget.Cmp(b.chainParams.PowLimit) > 0 {
187 newTarget.Set(b.chainParams.PowLimit)
190 return BigToCompact(newTarget)
193 // findPrevTestNetDifficulty returns the difficulty of the previous block which
194 // did not have the special testnet minimum difficulty rule applied.
196 // This function MUST be called with the chain state lock held (for writes).
197 func (b *BlockChain) findPrevTestNetDifficulty(startNode *blockNode) uint32 {
198 // Search backwards through the chain for the last block without
199 // the special rule applied.
200 iterNode := startNode
201 for iterNode != nil && iterNode.height%b.blocksPerRetarget != 0 &&
202 iterNode.bits == b.chainParams.PowLimitBits {
204 iterNode = iterNode.parent
207 // Return the found difficulty or the minimum difficulty if no
208 // appropriate block was found.
209 lastBits := b.chainParams.PowLimitBits
211 lastBits = iterNode.bits
216 // calcNextRequiredDifficulty calculates the required difficulty for the block
217 // after the passed previous block node based on the difficulty retarget rules.
218 // This function differs from the exported CalcNextRequiredDifficulty in that
219 // the exported version uses the current best chain as the previous block node
220 // while this function accepts any block node.
221 func (b *BlockChain) calcNextRequiredDifficulty(lastNode *blockNode, newBlockTime time.Time) (uint32, error) {
224 return b.chainParams.PowLimitBits, nil
227 // Return the previous block's difficulty requirements if this block
228 // is not at a difficulty retarget interval.
229 if (lastNode.height+1)%b.blocksPerRetarget != 0 {
230 // For networks that support it, allow special reduction of the
231 // required difficulty once too much time has elapsed without
233 if b.chainParams.ReduceMinDifficulty {
234 // Return minimum difficulty when more than the desired
235 // amount of time has elapsed without mining a block.
236 reductionTime := int64(b.chainParams.MinDiffReductionTime /
238 allowMinTime := lastNode.timestamp + reductionTime
239 if newBlockTime.Unix() > allowMinTime {
240 return b.chainParams.PowLimitBits, nil
243 // The block was mined within the desired timeframe, so
244 // return the difficulty for the last block which did
245 // not have the special minimum difficulty rule applied.
246 return b.findPrevTestNetDifficulty(lastNode), nil
249 // For the main network (or any unrecognized networks), simply
250 // return the previous block's difficulty requirements.
251 return lastNode.bits, nil
254 // Get the block node at the previous retarget (targetTimespan days
256 firstNode := lastNode.RelativeAncestor(b.blocksPerRetarget - 1)
257 if firstNode == nil {
258 return 0, AssertError("unable to obtain previous retarget block")
261 // Limit the amount of adjustment that can occur to the previous
263 actualTimespan := lastNode.timestamp - firstNode.timestamp
264 adjustedTimespan := actualTimespan
265 if actualTimespan < b.minRetargetTimespan {
266 adjustedTimespan = b.minRetargetTimespan
267 } else if actualTimespan > b.maxRetargetTimespan {
268 adjustedTimespan = b.maxRetargetTimespan
271 // Calculate new target difficulty as:
272 // currentDifficulty * (adjustedTimespan / targetTimespan)
273 // The result uses integer division which means it will be slightly
274 // rounded down. Bitcoind also uses integer division to calculate this
276 oldTarget := CompactToBig(lastNode.bits)
277 newTarget := new(big.Int).Mul(oldTarget, big.NewInt(adjustedTimespan))
278 targetTimeSpan := int64(b.chainParams.TargetTimespan / time.Second)
279 newTarget.Div(newTarget, big.NewInt(targetTimeSpan))
281 // Limit new value to the proof of work limit.
282 if newTarget.Cmp(b.chainParams.PowLimit) > 0 {
283 newTarget.Set(b.chainParams.PowLimit)
286 // Log new target difficulty and return it. The new target logging is
287 // intentionally converting the bits back to a number instead of using
288 // newTarget since conversion to the compact representation loses
290 newTargetBits := BigToCompact(newTarget)
291 log.Debugf("Difficulty retarget at block height %d", lastNode.height+1)
292 log.Debugf("Old target %08x (%064x)", lastNode.bits, oldTarget)
293 log.Debugf("New target %08x (%064x)", newTargetBits, CompactToBig(newTargetBits))
294 log.Debugf("Actual timespan %v, adjusted timespan %v, target timespan %v",
295 time.Duration(actualTimespan)*time.Second,
296 time.Duration(adjustedTimespan)*time.Second,
297 b.chainParams.TargetTimespan)
299 return newTargetBits, nil
302 // CalcNextRequiredDifficulty calculates the required difficulty for the block
303 // after the end of the current best chain based on the difficulty retarget
306 // This function is safe for concurrent access.
307 func (b *BlockChain) CalcNextRequiredDifficulty(timestamp time.Time) (uint32, error) {
309 difficulty, err := b.calcNextRequiredDifficulty(b.bestChain.Tip(), timestamp)
311 return difficulty, err