|
|
|
@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
|
|
|
|
|
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
|
|
|
|
// Copyright (c) 2009-2013 The Bitcoin developers
|
|
|
|
|
// Copyright (c) 2009-2014 The Bitcoin developers
|
|
|
|
|
// Distributed under the MIT/X11 software license, see the accompanying
|
|
|
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
|
|
|
|
|
@ -19,17 +19,56 @@ inline signed char HexDigit(char c)
@@ -19,17 +19,56 @@ inline signed char HexDigit(char c)
|
|
|
|
|
return p_util_hexdigit[(unsigned char)c]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** Base class without constructors for uint256 and uint160.
|
|
|
|
|
* This makes the compiler let you use it in a union. |
|
|
|
|
*/ |
|
|
|
|
/** Template base class for unsigned big integers. */ |
|
|
|
|
template<unsigned int BITS> |
|
|
|
|
class base_uint |
|
|
|
|
{ |
|
|
|
|
protected: |
|
|
|
|
private: |
|
|
|
|
enum { WIDTH=BITS/32 }; |
|
|
|
|
uint32_t pn[WIDTH]; |
|
|
|
|
public: |
|
|
|
|
|
|
|
|
|
base_uint() |
|
|
|
|
{ |
|
|
|
|
for (int i = 0; i < WIDTH; i++) |
|
|
|
|
pn[i] = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
base_uint(const base_uint& b) |
|
|
|
|
{ |
|
|
|
|
for (int i = 0; i < WIDTH; i++) |
|
|
|
|
pn[i] = b.pn[i]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
base_uint& operator=(const base_uint& b) |
|
|
|
|
{ |
|
|
|
|
for (int i = 0; i < WIDTH; i++) |
|
|
|
|
pn[i] = b.pn[i]; |
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
base_uint(uint64_t b) |
|
|
|
|
{ |
|
|
|
|
pn[0] = (unsigned int)b; |
|
|
|
|
pn[1] = (unsigned int)(b >> 32); |
|
|
|
|
for (int i = 2; i < WIDTH; i++) |
|
|
|
|
pn[i] = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
explicit base_uint(const std::string& str) |
|
|
|
|
{ |
|
|
|
|
SetHex(str); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
explicit base_uint(const std::vector<unsigned char>& vch) |
|
|
|
|
{ |
|
|
|
|
if (vch.size() == sizeof(pn)) { |
|
|
|
|
memcpy(pn, &vch[0], sizeof(pn)); |
|
|
|
|
} else { |
|
|
|
|
*this = 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool operator!() const |
|
|
|
|
{ |
|
|
|
|
for (int i = 0; i < WIDTH; i++) |
|
|
|
@ -292,7 +331,13 @@ public:
@@ -292,7 +331,13 @@ public:
|
|
|
|
|
return (!(a == b)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
friend inline const base_uint operator+(const base_uint& a, const base_uint& b) { return base_uint(a) += b; } |
|
|
|
|
friend inline const base_uint operator-(const base_uint& a, const base_uint& b) { return base_uint(a) -= b; } |
|
|
|
|
friend inline const base_uint operator|(const base_uint& a, const base_uint& b) { return base_uint(a) |= b; } |
|
|
|
|
friend inline const base_uint operator&(const base_uint& a, const base_uint& b) { return base_uint(a) &= b; } |
|
|
|
|
friend inline const base_uint operator^(const base_uint& a, const base_uint& b) { return base_uint(a) ^= b; } |
|
|
|
|
friend inline const base_uint operator>>(const base_uint& a, int shift) { return base_uint(a) >>= shift; } |
|
|
|
|
friend inline const base_uint operator<<(const base_uint& a, int shift) { return base_uint(a) <<= shift; } |
|
|
|
|
|
|
|
|
|
std::string GetHex() const |
|
|
|
|
{ |
|
|
|
@ -373,263 +418,42 @@ public:
@@ -373,263 +418,42 @@ public:
|
|
|
|
|
return pn[0] | (uint64_t)pn[1] << 32; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// unsigned int GetSerializeSize(int nType=0, int nVersion=PROTOCOL_VERSION) const
|
|
|
|
|
unsigned int GetSerializeSize(int nType, int nVersion) const |
|
|
|
|
{ |
|
|
|
|
return sizeof(pn); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template<typename Stream> |
|
|
|
|
// void Serialize(Stream& s, int nType=0, int nVersion=PROTOCOL_VERSION) const
|
|
|
|
|
void Serialize(Stream& s, int nType, int nVersion) const |
|
|
|
|
{ |
|
|
|
|
s.write((char*)pn, sizeof(pn)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template<typename Stream> |
|
|
|
|
// void Unserialize(Stream& s, int nType=0, int nVersion=PROTOCOL_VERSION)
|
|
|
|
|
void Unserialize(Stream& s, int nType, int nVersion) |
|
|
|
|
{ |
|
|
|
|
s.read((char*)pn, sizeof(pn)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
friend class uint160; |
|
|
|
|
friend class uint256; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
typedef base_uint<160> base_uint160; |
|
|
|
|
typedef base_uint<256> base_uint256; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// uint160 and uint256 could be implemented as templates, but to keep
|
|
|
|
|
// compile errors and debugging cleaner, they're copy and pasted.
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
//
|
|
|
|
|
// uint160
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
/** 160-bit unsigned integer */ |
|
|
|
|
class uint160 : public base_uint160 |
|
|
|
|
{ |
|
|
|
|
/** 160-bit unsigned big integer. */ |
|
|
|
|
class uint160 : public base_uint<160> { |
|
|
|
|
public: |
|
|
|
|
typedef base_uint160 basetype; |
|
|
|
|
|
|
|
|
|
uint160() |
|
|
|
|
{ |
|
|
|
|
for (int i = 0; i < WIDTH; i++) |
|
|
|
|
pn[i] = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint160(const basetype& b) |
|
|
|
|
{ |
|
|
|
|
for (int i = 0; i < WIDTH; i++) |
|
|
|
|
pn[i] = b.pn[i]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint160& operator=(const basetype& b) |
|
|
|
|
{ |
|
|
|
|
for (int i = 0; i < WIDTH; i++) |
|
|
|
|
pn[i] = b.pn[i]; |
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint160(uint64_t b) |
|
|
|
|
{ |
|
|
|
|
pn[0] = (unsigned int)b; |
|
|
|
|
pn[1] = (unsigned int)(b >> 32); |
|
|
|
|
for (int i = 2; i < WIDTH; i++) |
|
|
|
|
pn[i] = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint160& operator=(uint64_t b) |
|
|
|
|
{ |
|
|
|
|
pn[0] = (unsigned int)b; |
|
|
|
|
pn[1] = (unsigned int)(b >> 32); |
|
|
|
|
for (int i = 2; i < WIDTH; i++) |
|
|
|
|
pn[i] = 0; |
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
explicit uint160(const std::string& str) |
|
|
|
|
{ |
|
|
|
|
SetHex(str); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
explicit uint160(const std::vector<unsigned char>& vch) |
|
|
|
|
{ |
|
|
|
|
if (vch.size() == sizeof(pn)) |
|
|
|
|
memcpy(pn, &vch[0], sizeof(pn)); |
|
|
|
|
else |
|
|
|
|
*this = 0; |
|
|
|
|
} |
|
|
|
|
uint160() {} |
|
|
|
|
uint160(const base_uint<160>& b) : base_uint<160>(b) {} |
|
|
|
|
uint160(uint64_t b) : base_uint<160>(b) {} |
|
|
|
|
explicit uint160(const std::string& str) : base_uint<160>(str) {} |
|
|
|
|
explicit uint160(const std::vector<unsigned char>& vch) : base_uint<160>(vch) {} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
inline bool operator==(const uint160& a, uint64_t b) { return (base_uint160)a == b; } |
|
|
|
|
inline bool operator!=(const uint160& a, uint64_t b) { return (base_uint160)a != b; } |
|
|
|
|
inline const uint160 operator<<(const base_uint160& a, unsigned int shift) { return uint160(a) <<= shift; } |
|
|
|
|
inline const uint160 operator>>(const base_uint160& a, unsigned int shift) { return uint160(a) >>= shift; } |
|
|
|
|
inline const uint160 operator<<(const uint160& a, unsigned int shift) { return uint160(a) <<= shift; } |
|
|
|
|
inline const uint160 operator>>(const uint160& a, unsigned int shift) { return uint160(a) >>= shift; } |
|
|
|
|
|
|
|
|
|
inline const uint160 operator^(const base_uint160& a, const base_uint160& b) { return uint160(a) ^= b; } |
|
|
|
|
inline const uint160 operator&(const base_uint160& a, const base_uint160& b) { return uint160(a) &= b; } |
|
|
|
|
inline const uint160 operator|(const base_uint160& a, const base_uint160& b) { return uint160(a) |= b; } |
|
|
|
|
inline const uint160 operator+(const base_uint160& a, const base_uint160& b) { return uint160(a) += b; } |
|
|
|
|
inline const uint160 operator-(const base_uint160& a, const base_uint160& b) { return uint160(a) -= b; } |
|
|
|
|
|
|
|
|
|
inline bool operator<(const base_uint160& a, const uint160& b) { return (base_uint160)a < (base_uint160)b; } |
|
|
|
|
inline bool operator<=(const base_uint160& a, const uint160& b) { return (base_uint160)a <= (base_uint160)b; } |
|
|
|
|
inline bool operator>(const base_uint160& a, const uint160& b) { return (base_uint160)a > (base_uint160)b; } |
|
|
|
|
inline bool operator>=(const base_uint160& a, const uint160& b) { return (base_uint160)a >= (base_uint160)b; } |
|
|
|
|
inline bool operator==(const base_uint160& a, const uint160& b) { return (base_uint160)a == (base_uint160)b; } |
|
|
|
|
inline bool operator!=(const base_uint160& a, const uint160& b) { return (base_uint160)a != (base_uint160)b; } |
|
|
|
|
inline const uint160 operator^(const base_uint160& a, const uint160& b) { return (base_uint160)a ^ (base_uint160)b; } |
|
|
|
|
inline const uint160 operator&(const base_uint160& a, const uint160& b) { return (base_uint160)a & (base_uint160)b; } |
|
|
|
|
inline const uint160 operator|(const base_uint160& a, const uint160& b) { return (base_uint160)a | (base_uint160)b; } |
|
|
|
|
inline const uint160 operator+(const base_uint160& a, const uint160& b) { return (base_uint160)a + (base_uint160)b; } |
|
|
|
|
inline const uint160 operator-(const base_uint160& a, const uint160& b) { return (base_uint160)a - (base_uint160)b; } |
|
|
|
|
|
|
|
|
|
inline bool operator<(const uint160& a, const base_uint160& b) { return (base_uint160)a < (base_uint160)b; } |
|
|
|
|
inline bool operator<=(const uint160& a, const base_uint160& b) { return (base_uint160)a <= (base_uint160)b; } |
|
|
|
|
inline bool operator>(const uint160& a, const base_uint160& b) { return (base_uint160)a > (base_uint160)b; } |
|
|
|
|
inline bool operator>=(const uint160& a, const base_uint160& b) { return (base_uint160)a >= (base_uint160)b; } |
|
|
|
|
inline bool operator==(const uint160& a, const base_uint160& b) { return (base_uint160)a == (base_uint160)b; } |
|
|
|
|
inline bool operator!=(const uint160& a, const base_uint160& b) { return (base_uint160)a != (base_uint160)b; } |
|
|
|
|
inline const uint160 operator^(const uint160& a, const base_uint160& b) { return (base_uint160)a ^ (base_uint160)b; } |
|
|
|
|
inline const uint160 operator&(const uint160& a, const base_uint160& b) { return (base_uint160)a & (base_uint160)b; } |
|
|
|
|
inline const uint160 operator|(const uint160& a, const base_uint160& b) { return (base_uint160)a | (base_uint160)b; } |
|
|
|
|
inline const uint160 operator+(const uint160& a, const base_uint160& b) { return (base_uint160)a + (base_uint160)b; } |
|
|
|
|
inline const uint160 operator-(const uint160& a, const base_uint160& b) { return (base_uint160)a - (base_uint160)b; } |
|
|
|
|
|
|
|
|
|
inline bool operator<(const uint160& a, const uint160& b) { return (base_uint160)a < (base_uint160)b; } |
|
|
|
|
inline bool operator<=(const uint160& a, const uint160& b) { return (base_uint160)a <= (base_uint160)b; } |
|
|
|
|
inline bool operator>(const uint160& a, const uint160& b) { return (base_uint160)a > (base_uint160)b; } |
|
|
|
|
inline bool operator>=(const uint160& a, const uint160& b) { return (base_uint160)a >= (base_uint160)b; } |
|
|
|
|
inline bool operator==(const uint160& a, const uint160& b) { return (base_uint160)a == (base_uint160)b; } |
|
|
|
|
inline bool operator!=(const uint160& a, const uint160& b) { return (base_uint160)a != (base_uint160)b; } |
|
|
|
|
inline const uint160 operator^(const uint160& a, const uint160& b) { return (base_uint160)a ^ (base_uint160)b; } |
|
|
|
|
inline const uint160 operator&(const uint160& a, const uint160& b) { return (base_uint160)a & (base_uint160)b; } |
|
|
|
|
inline const uint160 operator|(const uint160& a, const uint160& b) { return (base_uint160)a | (base_uint160)b; } |
|
|
|
|
inline const uint160 operator+(const uint160& a, const uint160& b) { return (base_uint160)a + (base_uint160)b; } |
|
|
|
|
inline const uint160 operator-(const uint160& a, const uint160& b) { return (base_uint160)a - (base_uint160)b; } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
//
|
|
|
|
|
// uint256
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
/** 256-bit unsigned integer */ |
|
|
|
|
class uint256 : public base_uint256 |
|
|
|
|
{ |
|
|
|
|
/** 256-bit unsigned big integer. */ |
|
|
|
|
class uint256 : public base_uint<256> { |
|
|
|
|
public: |
|
|
|
|
typedef base_uint256 basetype; |
|
|
|
|
|
|
|
|
|
uint256() |
|
|
|
|
{ |
|
|
|
|
for (int i = 0; i < WIDTH; i++) |
|
|
|
|
pn[i] = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint256(const basetype& b) |
|
|
|
|
{ |
|
|
|
|
for (int i = 0; i < WIDTH; i++) |
|
|
|
|
pn[i] = b.pn[i]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint256& operator=(const basetype& b) |
|
|
|
|
{ |
|
|
|
|
for (int i = 0; i < WIDTH; i++) |
|
|
|
|
pn[i] = b.pn[i]; |
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint256(uint64_t b) |
|
|
|
|
{ |
|
|
|
|
pn[0] = (unsigned int)b; |
|
|
|
|
pn[1] = (unsigned int)(b >> 32); |
|
|
|
|
for (int i = 2; i < WIDTH; i++) |
|
|
|
|
pn[i] = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint256& operator=(uint64_t b) |
|
|
|
|
{ |
|
|
|
|
pn[0] = (unsigned int)b; |
|
|
|
|
pn[1] = (unsigned int)(b >> 32); |
|
|
|
|
for (int i = 2; i < WIDTH; i++) |
|
|
|
|
pn[i] = 0; |
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
explicit uint256(const std::string& str) |
|
|
|
|
{ |
|
|
|
|
SetHex(str); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
explicit uint256(const std::vector<unsigned char>& vch) |
|
|
|
|
{ |
|
|
|
|
if (vch.size() == sizeof(pn)) |
|
|
|
|
memcpy(pn, &vch[0], sizeof(pn)); |
|
|
|
|
else |
|
|
|
|
*this = 0; |
|
|
|
|
} |
|
|
|
|
uint256() {} |
|
|
|
|
uint256(const base_uint<256>& b) : base_uint<256>(b) {} |
|
|
|
|
uint256(uint64_t b) : base_uint<256>(b) {} |
|
|
|
|
explicit uint256(const std::string& str) : base_uint<256>(str) {} |
|
|
|
|
explicit uint256(const std::vector<unsigned char>& vch) : base_uint<256>(vch) {} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
inline bool operator==(const uint256& a, uint64_t b) { return (base_uint256)a == b; } |
|
|
|
|
inline bool operator!=(const uint256& a, uint64_t b) { return (base_uint256)a != b; } |
|
|
|
|
inline const uint256 operator<<(const base_uint256& a, unsigned int shift) { return uint256(a) <<= shift; } |
|
|
|
|
inline const uint256 operator>>(const base_uint256& a, unsigned int shift) { return uint256(a) >>= shift; } |
|
|
|
|
inline const uint256 operator<<(const uint256& a, unsigned int shift) { return uint256(a) <<= shift; } |
|
|
|
|
inline const uint256 operator>>(const uint256& a, unsigned int shift) { return uint256(a) >>= shift; } |
|
|
|
|
|
|
|
|
|
inline const uint256 operator^(const base_uint256& a, const base_uint256& b) { return uint256(a) ^= b; } |
|
|
|
|
inline const uint256 operator&(const base_uint256& a, const base_uint256& b) { return uint256(a) &= b; } |
|
|
|
|
inline const uint256 operator|(const base_uint256& a, const base_uint256& b) { return uint256(a) |= b; } |
|
|
|
|
inline const uint256 operator+(const base_uint256& a, const base_uint256& b) { return uint256(a) += b; } |
|
|
|
|
inline const uint256 operator-(const base_uint256& a, const base_uint256& b) { return uint256(a) -= b; } |
|
|
|
|
|
|
|
|
|
inline bool operator<(const base_uint256& a, const uint256& b) { return (base_uint256)a < (base_uint256)b; } |
|
|
|
|
inline bool operator<=(const base_uint256& a, const uint256& b) { return (base_uint256)a <= (base_uint256)b; } |
|
|
|
|
inline bool operator>(const base_uint256& a, const uint256& b) { return (base_uint256)a > (base_uint256)b; } |
|
|
|
|
inline bool operator>=(const base_uint256& a, const uint256& b) { return (base_uint256)a >= (base_uint256)b; } |
|
|
|
|
inline bool operator==(const base_uint256& a, const uint256& b) { return (base_uint256)a == (base_uint256)b; } |
|
|
|
|
inline bool operator!=(const base_uint256& a, const uint256& b) { return (base_uint256)a != (base_uint256)b; } |
|
|
|
|
inline const uint256 operator^(const base_uint256& a, const uint256& b) { return (base_uint256)a ^ (base_uint256)b; } |
|
|
|
|
inline const uint256 operator&(const base_uint256& a, const uint256& b) { return (base_uint256)a & (base_uint256)b; } |
|
|
|
|
inline const uint256 operator|(const base_uint256& a, const uint256& b) { return (base_uint256)a | (base_uint256)b; } |
|
|
|
|
inline const uint256 operator+(const base_uint256& a, const uint256& b) { return (base_uint256)a + (base_uint256)b; } |
|
|
|
|
inline const uint256 operator-(const base_uint256& a, const uint256& b) { return (base_uint256)a - (base_uint256)b; } |
|
|
|
|
|
|
|
|
|
inline bool operator<(const uint256& a, const base_uint256& b) { return (base_uint256)a < (base_uint256)b; } |
|
|
|
|
inline bool operator<=(const uint256& a, const base_uint256& b) { return (base_uint256)a <= (base_uint256)b; } |
|
|
|
|
inline bool operator>(const uint256& a, const base_uint256& b) { return (base_uint256)a > (base_uint256)b; } |
|
|
|
|
inline bool operator>=(const uint256& a, const base_uint256& b) { return (base_uint256)a >= (base_uint256)b; } |
|
|
|
|
inline bool operator==(const uint256& a, const base_uint256& b) { return (base_uint256)a == (base_uint256)b; } |
|
|
|
|
inline bool operator!=(const uint256& a, const base_uint256& b) { return (base_uint256)a != (base_uint256)b; } |
|
|
|
|
inline const uint256 operator^(const uint256& a, const base_uint256& b) { return (base_uint256)a ^ (base_uint256)b; } |
|
|
|
|
inline const uint256 operator&(const uint256& a, const base_uint256& b) { return (base_uint256)a & (base_uint256)b; } |
|
|
|
|
inline const uint256 operator|(const uint256& a, const base_uint256& b) { return (base_uint256)a | (base_uint256)b; } |
|
|
|
|
inline const uint256 operator+(const uint256& a, const base_uint256& b) { return (base_uint256)a + (base_uint256)b; } |
|
|
|
|
inline const uint256 operator-(const uint256& a, const base_uint256& b) { return (base_uint256)a - (base_uint256)b; } |
|
|
|
|
|
|
|
|
|
inline bool operator<(const uint256& a, const uint256& b) { return (base_uint256)a < (base_uint256)b; } |
|
|
|
|
inline bool operator<=(const uint256& a, const uint256& b) { return (base_uint256)a <= (base_uint256)b; } |
|
|
|
|
inline bool operator>(const uint256& a, const uint256& b) { return (base_uint256)a > (base_uint256)b; } |
|
|
|
|
inline bool operator>=(const uint256& a, const uint256& b) { return (base_uint256)a >= (base_uint256)b; } |
|
|
|
|
inline bool operator==(const uint256& a, const uint256& b) { return (base_uint256)a == (base_uint256)b; } |
|
|
|
|
inline bool operator!=(const uint256& a, const uint256& b) { return (base_uint256)a != (base_uint256)b; } |
|
|
|
|
inline const uint256 operator^(const uint256& a, const uint256& b) { return (base_uint256)a ^ (base_uint256)b; } |
|
|
|
|
inline const uint256 operator&(const uint256& a, const uint256& b) { return (base_uint256)a & (base_uint256)b; } |
|
|
|
|
inline const uint256 operator|(const uint256& a, const uint256& b) { return (base_uint256)a | (base_uint256)b; } |
|
|
|
|
inline const uint256 operator+(const uint256& a, const uint256& b) { return (base_uint256)a + (base_uint256)b; } |
|
|
|
|
inline const uint256 operator-(const uint256& a, const uint256& b) { return (base_uint256)a - (base_uint256)b; } |
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
|