Branch data Line data Source code
1 : : // Copyright (c) 2009-2010 Satoshi Nakamoto 2 : : // Copyright (c) 2009-2022 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 <cstdint> 10 : : #include <cstring> 11 : : #include <limits> 12 : : #include <stdexcept> 13 : : #include <string> 14 : : 15 : : class uint256; 16 : : 17 : 0 : class uint_error : public std::runtime_error { 18 : : public: 19 : 0 : 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_assert(BITS / 32 > 0 && BITS % 32 == 0, "Template parameter BITS must be a positive multiple of 32."); 28 : : static constexpr int WIDTH = BITS / 32; 29 : : uint32_t pn[WIDTH]; 30 : : public: 31 : : 32 : 0 : base_uint() 33 : : { 34 [ # # ]: 0 : for (int i = 0; i < WIDTH; i++) 35 : 0 : pn[i] = 0; 36 : 0 : } 37 : : 38 : 0 : base_uint(const base_uint& b) 39 : : { 40 [ # # ]: 0 : for (int i = 0; i < WIDTH; i++) 41 : 0 : pn[i] = b.pn[i]; 42 : 0 : } 43 : : 44 : 0 : base_uint& operator=(const base_uint& b) 45 : : { 46 [ # # ]: 0 : for (int i = 0; i < WIDTH; i++) 47 : 0 : pn[i] = b.pn[i]; 48 : 0 : return *this; 49 : : } 50 : : 51 : 0 : base_uint(uint64_t b) 52 : : { 53 : 0 : pn[0] = (unsigned int)b; 54 : 0 : pn[1] = (unsigned int)(b >> 32); 55 [ # # ]: 0 : for (int i = 2; i < WIDTH; i++) 56 : 0 : pn[i] = 0; 57 : 0 : } 58 : : 59 : 0 : base_uint operator~() const 60 : : { 61 : 0 : base_uint ret; 62 [ # # ]: 0 : for (int i = 0; i < WIDTH; i++) 63 : 0 : ret.pn[i] = ~pn[i]; 64 : 0 : return ret; 65 : : } 66 : : 67 : 0 : base_uint operator-() const 68 : : { 69 : 0 : base_uint ret; 70 [ # # ]: 0 : for (int i = 0; i < WIDTH; i++) 71 : 0 : ret.pn[i] = ~pn[i]; 72 : 0 : ++ret; 73 : 0 : return ret; 74 : : } 75 : : 76 : : double getdouble() const; 77 : : 78 : 0 : base_uint& operator=(uint64_t b) 79 : : { 80 : 0 : pn[0] = (unsigned int)b; 81 : 0 : pn[1] = (unsigned int)(b >> 32); 82 [ # # ]: 0 : for (int i = 2; i < WIDTH; i++) 83 : 0 : pn[i] = 0; 84 : 0 : return *this; 85 : : } 86 : : 87 : 0 : base_uint& operator^=(const base_uint& b) 88 : : { 89 [ # # ]: 0 : for (int i = 0; i < WIDTH; i++) 90 : 0 : pn[i] ^= b.pn[i]; 91 : 0 : return *this; 92 : : } 93 : : 94 : 0 : base_uint& operator&=(const base_uint& b) 95 : : { 96 [ # # ]: 0 : for (int i = 0; i < WIDTH; i++) 97 : 0 : pn[i] &= b.pn[i]; 98 : 0 : return *this; 99 : : } 100 : : 101 : 0 : base_uint& operator|=(const base_uint& b) 102 : : { 103 [ # # ]: 0 : for (int i = 0; i < WIDTH; i++) 104 : 0 : pn[i] |= b.pn[i]; 105 : 0 : return *this; 106 : : } 107 : : 108 : 0 : base_uint& operator^=(uint64_t b) 109 : : { 110 : 0 : pn[0] ^= (unsigned int)b; 111 : 0 : pn[1] ^= (unsigned int)(b >> 32); 112 : 0 : return *this; 113 : : } 114 : : 115 : 0 : base_uint& operator|=(uint64_t b) 116 : : { 117 : 0 : pn[0] |= (unsigned int)b; 118 : 0 : pn[1] |= (unsigned int)(b >> 32); 119 : 0 : return *this; 120 : : } 121 : : 122 : : base_uint& operator<<=(unsigned int shift); 123 : : base_uint& operator>>=(unsigned int shift); 124 : : 125 : 0 : base_uint& operator+=(const base_uint& b) 126 : : { 127 : 0 : uint64_t carry = 0; 128 [ # # ]: 0 : for (int i = 0; i < WIDTH; i++) 129 : : { 130 : 0 : uint64_t n = carry + pn[i] + b.pn[i]; 131 : 0 : pn[i] = n & 0xffffffff; 132 : 0 : carry = n >> 32; 133 : 0 : } 134 : 0 : return *this; 135 : : } 136 : : 137 : 0 : base_uint& operator-=(const base_uint& b) 138 : : { 139 : 0 : *this += -b; 140 : 0 : return *this; 141 : : } 142 : : 143 : 0 : base_uint& operator+=(uint64_t b64) 144 : : { 145 : 0 : base_uint b; 146 : 0 : b = b64; 147 : 0 : *this += b; 148 : 0 : return *this; 149 : : } 150 : : 151 : 0 : base_uint& operator-=(uint64_t b64) 152 : : { 153 : 0 : base_uint b; 154 : 0 : b = b64; 155 : 0 : *this += -b; 156 : 0 : return *this; 157 : : } 158 : : 159 : : base_uint& operator*=(uint32_t b32); 160 : : base_uint& operator*=(const base_uint& b); 161 : : base_uint& operator/=(const base_uint& b); 162 : : 163 : 0 : base_uint& operator++() 164 : : { 165 : : // prefix operator 166 : 0 : int i = 0; 167 [ # # ][ # # ]: 0 : while (i < WIDTH && ++pn[i] == 0) 168 : 0 : i++; 169 : 0 : return *this; 170 : : } 171 : : 172 : 0 : base_uint operator++(int) 173 : : { 174 : : // postfix operator 175 : 0 : const base_uint ret = *this; 176 : 0 : ++(*this); 177 : 0 : return ret; 178 : : } 179 : : 180 : 0 : base_uint& operator--() 181 : : { 182 : : // prefix operator 183 : 0 : int i = 0; 184 [ # # ][ # # ]: 0 : while (i < WIDTH && --pn[i] == std::numeric_limits<uint32_t>::max()) 185 : 0 : i++; 186 : 0 : return *this; 187 : : } 188 : : 189 : 0 : base_uint operator--(int) 190 : : { 191 : : // postfix operator 192 : 0 : const base_uint ret = *this; 193 : 0 : --(*this); 194 : 0 : return ret; 195 : : } 196 : : 197 : : int CompareTo(const base_uint& b) const; 198 : : bool EqualTo(uint64_t b) const; 199 : : 200 : 0 : friend inline base_uint operator+(const base_uint& a, const base_uint& b) { return base_uint(a) += b; } 201 : 0 : friend inline base_uint operator-(const base_uint& a, const base_uint& b) { return base_uint(a) -= b; } 202 : 0 : friend inline base_uint operator*(const base_uint& a, const base_uint& b) { return base_uint(a) *= b; } 203 : 0 : friend inline base_uint operator/(const base_uint& a, const base_uint& b) { return base_uint(a) /= b; } 204 : : friend inline base_uint operator|(const base_uint& a, const base_uint& b) { return base_uint(a) |= b; } 205 : : friend inline base_uint operator&(const base_uint& a, const base_uint& b) { return base_uint(a) &= b; } 206 : : friend inline base_uint operator^(const base_uint& a, const base_uint& b) { return base_uint(a) ^= b; } 207 : 0 : friend inline base_uint operator>>(const base_uint& a, int shift) { return base_uint(a) >>= shift; } 208 : : friend inline base_uint operator<<(const base_uint& a, int shift) { return base_uint(a) <<= shift; } 209 : 0 : friend inline base_uint operator*(const base_uint& a, uint32_t b) { return base_uint(a) *= b; } 210 : : friend inline bool operator==(const base_uint& a, const base_uint& b) { return memcmp(a.pn, b.pn, sizeof(a.pn)) == 0; } 211 : : friend inline bool operator!=(const base_uint& a, const base_uint& b) { return memcmp(a.pn, b.pn, sizeof(a.pn)) != 0; } 212 : 0 : friend inline bool operator>(const base_uint& a, const base_uint& b) { return a.CompareTo(b) > 0; } 213 : 0 : friend inline bool operator<(const base_uint& a, const base_uint& b) { return a.CompareTo(b) < 0; } 214 : 0 : friend inline bool operator>=(const base_uint& a, const base_uint& b) { return a.CompareTo(b) >= 0; } 215 : 0 : friend inline bool operator<=(const base_uint& a, const base_uint& b) { return a.CompareTo(b) <= 0; } 216 : 0 : friend inline bool operator==(const base_uint& a, uint64_t b) { return a.EqualTo(b); } 217 : : friend inline bool operator!=(const base_uint& a, uint64_t b) { return !a.EqualTo(b); } 218 : : 219 : : std::string GetHex() const; 220 : : std::string ToString() const; 221 : : 222 : 0 : unsigned int size() const 223 : : { 224 : 0 : return sizeof(pn); 225 : : } 226 : : 227 : : /** 228 : : * Returns the position of the highest bit set plus one, or zero if the 229 : : * value is zero. 230 : : */ 231 : : unsigned int bits() const; 232 : : 233 : 0 : uint64_t GetLow64() const 234 : : { 235 : : static_assert(WIDTH >= 2, "Assertion WIDTH >= 2 failed (WIDTH = BITS / 32). BITS is a template parameter."); 236 : 0 : return pn[0] | (uint64_t)pn[1] << 32; 237 : : } 238 : : }; 239 : : 240 : : /** 256-bit unsigned big integer. */ 241 : 0 : class arith_uint256 : public base_uint<256> { 242 : : public: 243 : 0 : arith_uint256() {} 244 : 0 : arith_uint256(const base_uint<256>& b) : base_uint<256>(b) {} 245 : 0 : arith_uint256(uint64_t b) : base_uint<256>(b) {} 246 : : 247 : : /** 248 : : * The "compact" format is a representation of a whole 249 : : * number N using an unsigned 32bit number similar to a 250 : : * floating point format. 251 : : * The most significant 8 bits are the unsigned exponent of base 256. 252 : : * This exponent can be thought of as "number of bytes of N". 253 : : * The lower 23 bits are the mantissa. 254 : : * Bit number 24 (0x800000) represents the sign of N. 255 : : * N = (-1^sign) * mantissa * 256^(exponent-3) 256 : : * 257 : : * Satoshi's original implementation used BN_bn2mpi() and BN_mpi2bn(). 258 : : * MPI uses the most significant bit of the first byte as sign. 259 : : * Thus 0x1234560000 is compact (0x05123456) 260 : : * and 0xc0de000000 is compact (0x0600c0de) 261 : : * 262 : : * Bitcoin only uses this "compact" format for encoding difficulty 263 : : * targets, which are unsigned 256bit quantities. Thus, all the 264 : : * complexities of the sign bit and using base 256 are probably an 265 : : * implementation accident. 266 : : */ 267 : : arith_uint256& SetCompact(uint32_t nCompact, bool *pfNegative = nullptr, bool *pfOverflow = nullptr); 268 : : uint32_t GetCompact(bool fNegative = false) const; 269 : : 270 : : friend uint256 ArithToUint256(const arith_uint256 &); 271 : : friend arith_uint256 UintToArith256(const uint256 &); 272 : : }; 273 : : 274 : : uint256 ArithToUint256(const arith_uint256 &); 275 : : arith_uint256 UintToArith256(const uint256 &); 276 : : 277 : : extern template class base_uint<256>; 278 : : 279 : : #endif // BITCOIN_ARITH_UINT256_H