OSDN Git Service

Merge pull request #41 from Bytom/dev
[bytom/vapor.git] / vendor / github.com / btcsuite / btcd / blockchain / difficulty.go
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.
4
5 package blockchain
6
7 import (
8         "math/big"
9         "time"
10
11         "github.com/btcsuite/btcd/chaincfg/chainhash"
12 )
13
14 var (
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)
18
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)
22 )
23
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.
29         buf := *hash
30         blen := len(buf)
31         for i := 0; i < blen/2; i++ {
32                 buf[i], buf[blen-1-i] = buf[blen-1-i], buf[i]
33         }
34
35         return new(big.Int).SetBytes(buf[:])
36 }
37
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
40 // point numbers.
41 //
42 // Like IEEE754 floating point, there are three basic components: the sign,
43 // the exponent, and the mantissa.  They are broken out as follows:
44 //
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
48 //
49 //      -------------------------------------------------
50 //      |   Exponent     |    Sign    |    Mantissa     |
51 //      -------------------------------------------------
52 //      | 8 bits [31-24] | 1 bit [23] | 23 bits [22-00] |
53 //      -------------------------------------------------
54 //
55 // The formula to calculate N is:
56 //      N = (-1^sign) * mantissa * 256^(exponent-3)
57 //
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)
66
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)
72         var bn *big.Int
73         if exponent <= 3 {
74                 mantissa >>= 8 * (3 - exponent)
75                 bn = big.NewInt(int64(mantissa))
76         } else {
77                 bn = big.NewInt(int64(mantissa))
78                 bn.Lsh(bn, 8*(exponent-3))
79         }
80
81         // Make it negative if the sign bit is set.
82         if isNegative {
83                 bn = bn.Neg(bn)
84         }
85
86         return bn
87 }
88
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.
95         if n.Sign() == 0 {
96                 return 0
97         }
98
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)
103         var mantissa uint32
104         exponent := uint(len(n.Bytes()))
105         if exponent <= 3 {
106                 mantissa = uint32(n.Bits()[0])
107                 mantissa <<= 8 * (3 - exponent)
108         } else {
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])
112         }
113
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 {
118                 mantissa >>= 8
119                 exponent++
120         }
121
122         // Pack the exponent, sign bit, and mantissa into an unsigned 32-bit
123         // int and return it.
124         compact := uint32(exponent<<24) | mantissa
125         if n.Sign() < 0 {
126                 compact |= 0x00800000
127         }
128         return compact
129 }
130
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 {
147                 return big.NewInt(0)
148         }
149
150         // (1 << 256) / (difficultyNum + 1)
151         denominator := new(big.Int).Add(difficultyNum, bigOne)
152         return new(big.Int).Div(oneLsh256, denominator)
153 }
154
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)
163
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
166         // elapsed.
167         if b.chainParams.ReduceMinDifficulty {
168                 reductionTime := int64(b.chainParams.MinDiffReductionTime /
169                         time.Second)
170                 if durationVal > reductionTime {
171                         return b.chainParams.PowLimitBits
172                 }
173         }
174
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
183         }
184
185         // Limit new value to the proof of work limit.
186         if newTarget.Cmp(b.chainParams.PowLimit) > 0 {
187                 newTarget.Set(b.chainParams.PowLimit)
188         }
189
190         return BigToCompact(newTarget)
191 }
192
193 // findPrevTestNetDifficulty returns the difficulty of the previous block which
194 // did not have the special testnet minimum difficulty rule applied.
195 //
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 {
203
204                 iterNode = iterNode.parent
205         }
206
207         // Return the found difficulty or the minimum difficulty if no
208         // appropriate block was found.
209         lastBits := b.chainParams.PowLimitBits
210         if iterNode != nil {
211                 lastBits = iterNode.bits
212         }
213         return lastBits
214 }
215
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) {
222         // Genesis block.
223         if lastNode == nil {
224                 return b.chainParams.PowLimitBits, nil
225         }
226
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
232                 // mining a block.
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 /
237                                 time.Second)
238                         allowMinTime := lastNode.timestamp + reductionTime
239                         if newBlockTime.Unix() > allowMinTime {
240                                 return b.chainParams.PowLimitBits, nil
241                         }
242
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
247                 }
248
249                 // For the main network (or any unrecognized networks), simply
250                 // return the previous block's difficulty requirements.
251                 return lastNode.bits, nil
252         }
253
254         // Get the block node at the previous retarget (targetTimespan days
255         // worth of blocks).
256         firstNode := lastNode.RelativeAncestor(b.blocksPerRetarget - 1)
257         if firstNode == nil {
258                 return 0, AssertError("unable to obtain previous retarget block")
259         }
260
261         // Limit the amount of adjustment that can occur to the previous
262         // difficulty.
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
269         }
270
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
275         // result.
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))
280
281         // Limit new value to the proof of work limit.
282         if newTarget.Cmp(b.chainParams.PowLimit) > 0 {
283                 newTarget.Set(b.chainParams.PowLimit)
284         }
285
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
289         // precision.
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)
298
299         return newTargetBits, nil
300 }
301
302 // CalcNextRequiredDifficulty calculates the required difficulty for the block
303 // after the end of the current best chain based on the difficulty retarget
304 // rules.
305 //
306 // This function is safe for concurrent access.
307 func (b *BlockChain) CalcNextRequiredDifficulty(timestamp time.Time) (uint32, error) {
308         b.chainLock.Lock()
309         difficulty, err := b.calcNextRequiredDifficulty(b.bestChain.Tip(), timestamp)
310         b.chainLock.Unlock()
311         return difficulty, err
312 }