github.com/palcoin-project/palcd@v1.0.0/blockchain/difficulty.go (about) 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/palcoin-project/palcd/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 }