Line data Source code
1 : // Copyright (c) 2009-2010 Satoshi Nakamoto 2 : // Copyright (c) 2009-2019 The Bitcoin Core developers 3 : // Distributed under the MIT software license, see the accompanying 4 : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 5 : 6 : #ifndef BITCOIN_ARITH_UINT256_H 7 : #define BITCOIN_ARITH_UINT256_H 8 : 9 : #include <cstring> 10 : #include <limits> 11 : #include <stdexcept> 12 : #include <stdint.h> 13 : #include <string> 14 : 15 : class uint256; 16 : 17 4 : class uint_error : public std::runtime_error { 18 : public: 19 4 : explicit uint_error(const std::string& str) : std::runtime_error(str) {} 20 : }; 21 : 22 : /** Template base class for unsigned big integers. */ 23 : template<unsigned int BITS> 24 : class base_uint 25 : { 26 : protected: 27 : static constexpr int WIDTH = BITS / 32; 28 : uint32_t pn[WIDTH]; 29 : public: 30 : 31 6690286 : base_uint() 32 241838 : { 33 : static_assert(BITS/32 > 0 && BITS%32 == 0, "Template parameter BITS must be a positive multiple of 32."); 34 : 35 58036027 : for (int i = 0; i < WIDTH; i++) 36 51587579 : pn[i] = 0; 37 6690286 : } 38 : 39 5671636 : base_uint(const base_uint& b) 40 2567852 : { 41 : static_assert(BITS/32 > 0 && BITS%32 == 0, "Template parameter BITS must be a positive multiple of 32."); 42 : 43 27934058 : for (int i = 0; i < WIDTH; i++) 44 24830274 : pn[i] = b.pn[i]; 45 5671638 : } 46 : 47 521215 : base_uint& operator=(const base_uint& b) 48 : { 49 4690944 : for (int i = 0; i < WIDTH; i++) 50 4169729 : pn[i] = b.pn[i]; 51 521216 : return *this; 52 : } 53 : 54 1245092 : base_uint(uint64_t b) 55 293697 : { 56 : static_assert(BITS/32 > 0 && BITS%32 == 0, "Template parameter BITS must be a positive multiple of 32."); 57 : 58 951395 : pn[0] = (unsigned int)b; 59 951395 : pn[1] = (unsigned int)(b >> 32); 60 6659768 : for (int i = 2; i < WIDTH; i++) 61 5708373 : pn[i] = 0; 62 1245092 : } 63 : 64 : explicit base_uint(const std::string& str); 65 : 66 112404 : const base_uint operator~() const 67 : { 68 112404 : base_uint ret; 69 1011636 : for (int i = 0; i < WIDTH; i++) 70 899232 : ret.pn[i] = ~pn[i]; 71 112404 : return ret; 72 : } 73 : 74 127955 : const base_uint operator-() const 75 : { 76 127955 : base_uint ret; 77 1151595 : for (int i = 0; i < WIDTH; i++) 78 1023640 : ret.pn[i] = ~pn[i]; 79 127955 : ++ret; 80 127955 : return ret; 81 : } 82 : 83 : double getdouble() const; 84 : 85 113837 : base_uint& operator=(uint64_t b) 86 : { 87 113837 : pn[0] = (unsigned int)b; 88 113837 : pn[1] = (unsigned int)(b >> 32); 89 796859 : for (int i = 2; i < WIDTH; i++) 90 683022 : pn[i] = 0; 91 113837 : return *this; 92 : } 93 : 94 534 : base_uint& operator^=(const base_uint& b) 95 : { 96 4806 : for (int i = 0; i < WIDTH; i++) 97 4272 : pn[i] ^= b.pn[i]; 98 534 : return *this; 99 : } 100 : 101 18 : base_uint& operator&=(const base_uint& b) 102 : { 103 162 : for (int i = 0; i < WIDTH; i++) 104 144 : pn[i] &= b.pn[i]; 105 18 : return *this; 106 : } 107 : 108 274 : base_uint& operator|=(const base_uint& b) 109 : { 110 2466 : for (int i = 0; i < WIDTH; i++) 111 2192 : pn[i] |= b.pn[i]; 112 274 : return *this; 113 : } 114 : 115 2 : base_uint& operator^=(uint64_t b) 116 : { 117 2 : pn[0] ^= (unsigned int)b; 118 2 : pn[1] ^= (unsigned int)(b >> 32); 119 2 : return *this; 120 : } 121 : 122 2 : base_uint& operator|=(uint64_t b) 123 : { 124 2 : pn[0] |= (unsigned int)b; 125 2 : pn[1] |= (unsigned int)(b >> 32); 126 2 : return *this; 127 : } 128 : 129 : base_uint& operator<<=(unsigned int shift); 130 : base_uint& operator>>=(unsigned int shift); 131 : 132 514150 : base_uint& operator+=(const base_uint& b) 133 : { 134 : uint64_t carry = 0; 135 4627350 : for (int i = 0; i < WIDTH; i++) 136 : { 137 4113200 : uint64_t n = carry + pn[i] + b.pn[i]; 138 4113200 : pn[i] = n & 0xffffffff; 139 4113200 : carry = n >> 32; 140 : } 141 514150 : return *this; 142 : } 143 : 144 127436 : base_uint& operator-=(const base_uint& b) 145 : { 146 127436 : *this += -b; 147 127436 : return *this; 148 : } 149 : 150 256 : base_uint& operator+=(uint64_t b64) 151 : { 152 256 : base_uint b; 153 256 : b = b64; 154 256 : *this += b; 155 256 : return *this; 156 256 : } 157 : 158 1 : base_uint& operator-=(uint64_t b64) 159 : { 160 1 : base_uint b; 161 1 : b = b64; 162 1 : *this += -b; 163 1 : return *this; 164 1 : } 165 : 166 : base_uint& operator*=(uint32_t b32); 167 : base_uint& operator*=(const base_uint& b); 168 : base_uint& operator/=(const base_uint& b); 169 : 170 128211 : base_uint& operator++() 171 : { 172 : // prefix operator 173 : int i = 0; 174 134227 : while (i < WIDTH && ++pn[i] == 0) 175 6016 : i++; 176 128211 : return *this; 177 : } 178 : 179 255 : const base_uint operator++(int) 180 : { 181 : // postfix operator 182 255 : const base_uint ret = *this; 183 255 : ++(*this); 184 255 : return ret; 185 : } 186 : 187 511 : base_uint& operator--() 188 : { 189 : // prefix operator 190 : int i = 0; 191 2303 : while (i < WIDTH && --pn[i] == std::numeric_limits<uint32_t>::max()) 192 1792 : i++; 193 511 : return *this; 194 : } 195 : 196 255 : const base_uint operator--(int) 197 : { 198 : // postfix operator 199 255 : const base_uint ret = *this; 200 255 : --(*this); 201 255 : return ret; 202 : } 203 : 204 : int CompareTo(const base_uint& b) const; 205 : bool EqualTo(uint64_t b) const; 206 : 207 386199 : friend inline const base_uint operator+(const base_uint& a, const base_uint& b) { return base_uint(a) += b; } 208 1906 : friend inline const base_uint operator-(const base_uint& a, const base_uint& b) { return base_uint(a) -= b; } 209 1221 : friend inline const base_uint operator*(const base_uint& a, const base_uint& b) { return base_uint(a) *= b; } 210 113575 : friend inline const base_uint operator/(const base_uint& a, const base_uint& b) { return base_uint(a) /= b; } 211 13 : friend inline const base_uint operator|(const base_uint& a, const base_uint& b) { return base_uint(a) |= b; } 212 13 : friend inline const base_uint operator&(const base_uint& a, const base_uint& b) { return base_uint(a) &= b; } 213 529 : friend inline const base_uint operator^(const base_uint& a, const base_uint& b) { return base_uint(a) ^= b; } 214 117663 : friend inline const base_uint operator>>(const base_uint& a, int shift) { return base_uint(a) >>= shift; } 215 54572 : friend inline const base_uint operator<<(const base_uint& a, int shift) { return base_uint(a) <<= shift; } 216 2689 : friend inline const base_uint operator*(const base_uint& a, uint32_t b) { return base_uint(a) *= b; } 217 7520 : friend inline bool operator==(const base_uint& a, const base_uint& b) { return memcmp(a.pn, b.pn, sizeof(a.pn)) == 0; } 218 774 : friend inline bool operator!=(const base_uint& a, const base_uint& b) { return memcmp(a.pn, b.pn, sizeof(a.pn)) != 0; } 219 501394274 : friend inline bool operator>(const base_uint& a, const base_uint& b) { return a.CompareTo(b) > 0; } 220 286694258 : friend inline bool operator<(const base_uint& a, const base_uint& b) { return a.CompareTo(b) < 0; } 221 191597705 : friend inline bool operator>=(const base_uint& a, const base_uint& b) { return a.CompareTo(b) >= 0; } 222 17460 : friend inline bool operator<=(const base_uint& a, const base_uint& b) { return a.CompareTo(b) <= 0; } 223 404967 : friend inline bool operator==(const base_uint& a, uint64_t b) { return a.EqualTo(b); } 224 256 : friend inline bool operator!=(const base_uint& a, uint64_t b) { return !a.EqualTo(b); } 225 : 226 : std::string GetHex() const; 227 : void SetHex(const char* psz); 228 : void SetHex(const std::string& str); 229 : std::string ToString() const; 230 : 231 4 : unsigned int size() const 232 : { 233 4 : return sizeof(pn); 234 : } 235 : 236 : /** 237 : * Returns the position of the highest bit set plus one, or zero if the 238 : * value is zero. 239 : */ 240 : unsigned int bits() const; 241 : 242 266018 : uint64_t GetLow64() const 243 : { 244 : static_assert(WIDTH >= 2, "Assertion WIDTH >= 2 failed (WIDTH = BITS / 32). BITS is a template parameter."); 245 266018 : return pn[0] | (uint64_t)pn[1] << 32; 246 : } 247 : }; 248 : 249 : /** 256-bit unsigned big integer. */ 250 804863 : class arith_uint256 : public base_uint<256> { 251 : public: 252 12413217 : arith_uint256() {} 253 786974 : arith_uint256(const base_uint<256>& b) : base_uint<256>(b) {} 254 1315395 : arith_uint256(uint64_t b) : base_uint<256>(b) {} 255 32 : explicit arith_uint256(const std::string& str) : base_uint<256>(str) {} 256 : 257 : /** 258 : * The "compact" format is a representation of a whole 259 : * number N using an unsigned 32bit number similar to a 260 : * floating point format. 261 : * The most significant 8 bits are the unsigned exponent of base 256. 262 : * This exponent can be thought of as "number of bytes of N". 263 : * The lower 23 bits are the mantissa. 264 : * Bit number 24 (0x800000) represents the sign of N. 265 : * N = (-1^sign) * mantissa * 256^(exponent-3) 266 : * 267 : * Satoshi's original implementation used BN_bn2mpi() and BN_mpi2bn(). 268 : * MPI uses the most significant bit of the first byte as sign. 269 : * Thus 0x1234560000 is compact (0x05123456) 270 : * and 0xc0de000000 is compact (0x0600c0de) 271 : * 272 : * Bitcoin only uses this "compact" format for encoding difficulty 273 : * targets, which are unsigned 256bit quantities. Thus, all the 274 : * complexities of the sign bit and using base 256 are probably an 275 : * implementation accident. 276 : */ 277 : arith_uint256& SetCompact(uint32_t nCompact, bool *pfNegative = nullptr, bool *pfOverflow = nullptr); 278 : uint32_t GetCompact(bool fNegative = false) const; 279 : 280 : friend uint256 ArithToUint256(const arith_uint256 &); 281 : friend arith_uint256 UintToArith256(const uint256 &); 282 : }; 283 : 284 : uint256 ArithToUint256(const arith_uint256 &); 285 : arith_uint256 UintToArith256(const uint256 &); 286 : 287 : #endif // BITCOIN_ARITH_UINT256_H