|
|
@ -159,25 +159,40 @@ inline bool DecodeBase58Check(const std::string& str, std::vector<unsigned char> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CBitcoinAddress |
|
|
|
class CBase58Data |
|
|
|
{ |
|
|
|
{ |
|
|
|
protected: |
|
|
|
protected: |
|
|
|
unsigned char nVersion; |
|
|
|
unsigned char nVersion; |
|
|
|
std::vector<unsigned char> vchData; |
|
|
|
std::vector<unsigned char> vchData; |
|
|
|
|
|
|
|
|
|
|
|
public: |
|
|
|
CBase58Data() |
|
|
|
bool SetAddress(const uint160& hash160) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
nVersion = fTestNet ? 111 : 0; |
|
|
|
nVersion = 0; |
|
|
|
vchData.resize(20); |
|
|
|
vchData.clear(); |
|
|
|
memcpy(&vchData[0], &hash160, 20); |
|
|
|
} |
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
|
|
~CBase58Data() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
memset(&vchData[0], 0, vchData.size()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SetData(int nVersionIn, const void* pdata, size_t nSize) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
nVersion = nVersionIn; |
|
|
|
|
|
|
|
vchData.resize(nSize); |
|
|
|
|
|
|
|
memcpy(&vchData[0], pdata, nSize); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SetData(int nVersionIn, const unsigned char *pbegin, const unsigned char *pend) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
SetData(nVersionIn, (void*)pbegin, pend - pbegin); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool SetAddress(const char* pszAddress) |
|
|
|
public: |
|
|
|
|
|
|
|
bool SetString(const char* psz) |
|
|
|
{ |
|
|
|
{ |
|
|
|
std::vector<unsigned char> vchTemp; |
|
|
|
std::vector<unsigned char> vchTemp; |
|
|
|
DecodeBase58Check(pszAddress, vchTemp); |
|
|
|
DecodeBase58Check(psz, vchTemp); |
|
|
|
if (vchTemp.empty()) |
|
|
|
if (vchTemp.empty()) |
|
|
|
{ |
|
|
|
{ |
|
|
|
vchData.clear(); |
|
|
|
vchData.clear(); |
|
|
@ -187,17 +202,50 @@ public: |
|
|
|
nVersion = vchTemp[0]; |
|
|
|
nVersion = vchTemp[0]; |
|
|
|
vchData.resize(vchTemp.size() - 1); |
|
|
|
vchData.resize(vchTemp.size() - 1); |
|
|
|
memcpy(&vchData[0], &vchTemp[1], vchData.size()); |
|
|
|
memcpy(&vchData[0], &vchTemp[1], vchData.size()); |
|
|
|
|
|
|
|
memset(&vchTemp[0], 0, vchTemp.size()); |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool SetAddress(const std::string& strAddress) |
|
|
|
bool SetString(const std::string& str) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return SetString(str.c_str()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::string ToString() const |
|
|
|
{ |
|
|
|
{ |
|
|
|
return SetAddress(strAddress.c_str()); |
|
|
|
std::vector<unsigned char> vch(1, nVersion); |
|
|
|
|
|
|
|
vch.insert(vch.end(), vchData.begin(), vchData.end()); |
|
|
|
|
|
|
|
return EncodeBase58Check(vch); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool SetAddress(const std::vector<unsigned char>& vchPubKey) |
|
|
|
int CompareTo(const CBase58Data& b58) const |
|
|
|
{ |
|
|
|
{ |
|
|
|
return SetAddress(Hash160(vchPubKey)); |
|
|
|
if (nVersion < b58.nVersion) return -1; |
|
|
|
|
|
|
|
if (nVersion < b58.nVersion) return 1; |
|
|
|
|
|
|
|
if (vchData < b58.vchData) return -1; |
|
|
|
|
|
|
|
if (vchData > b58.vchData) return 1; |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool operator==(const CBase58Data& b58) const { return CompareTo(b58) == 0; } |
|
|
|
|
|
|
|
bool operator<=(const CBase58Data& b58) const { return CompareTo(b58) <= 0; } |
|
|
|
|
|
|
|
bool operator>=(const CBase58Data& b58) const { return CompareTo(b58) >= 0; } |
|
|
|
|
|
|
|
bool operator< (const CBase58Data& b58) const { return CompareTo(b58) < 0; } |
|
|
|
|
|
|
|
bool operator> (const CBase58Data& b58) const { return CompareTo(b58) > 0; } |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CBitcoinAddress : public CBase58Data |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
public: |
|
|
|
|
|
|
|
bool SetHash160(const uint160& hash160) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
SetData(fTestNet ? 111 : 0, &hash160, 20); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool SetPubKey(const std::vector<unsigned char>& vchPubKey) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return SetHash160(Hash160(vchPubKey)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool IsValid() const |
|
|
|
bool IsValid() const |
|
|
@ -221,35 +269,26 @@ public: |
|
|
|
|
|
|
|
|
|
|
|
CBitcoinAddress() |
|
|
|
CBitcoinAddress() |
|
|
|
{ |
|
|
|
{ |
|
|
|
nVersion = 0; |
|
|
|
|
|
|
|
vchData.clear(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
CBitcoinAddress(uint160 hash160In) |
|
|
|
CBitcoinAddress(uint160 hash160In) |
|
|
|
{ |
|
|
|
{ |
|
|
|
SetAddress(hash160In); |
|
|
|
SetHash160(hash160In); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
CBitcoinAddress(const std::vector<unsigned char>& vchPubKey) |
|
|
|
CBitcoinAddress(const std::vector<unsigned char>& vchPubKey) |
|
|
|
{ |
|
|
|
{ |
|
|
|
SetAddress(vchPubKey); |
|
|
|
SetPubKey(vchPubKey); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
CBitcoinAddress(const std::string& strAddress) |
|
|
|
CBitcoinAddress(const std::string& strAddress) |
|
|
|
{ |
|
|
|
{ |
|
|
|
SetAddress(strAddress); |
|
|
|
SetString(strAddress); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
CBitcoinAddress(const char* pszAddress) |
|
|
|
CBitcoinAddress(const char* pszAddress) |
|
|
|
{ |
|
|
|
{ |
|
|
|
SetAddress(pszAddress); |
|
|
|
SetString(pszAddress); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::string ToString() const |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
std::vector<unsigned char> vch(1, nVersion); |
|
|
|
|
|
|
|
vch.insert(vch.end(), vchData.begin(), vchData.end()); |
|
|
|
|
|
|
|
return EncodeBase58Check(vch); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
uint160 GetHash160() const |
|
|
|
uint160 GetHash160() const |
|
|
@ -259,21 +298,6 @@ public: |
|
|
|
memcpy(&hash160, &vchData[0], 20); |
|
|
|
memcpy(&hash160, &vchData[0], 20); |
|
|
|
return hash160; |
|
|
|
return hash160; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int CompareTo(const CBitcoinAddress& address) const |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (nVersion < address.nVersion) return -1; |
|
|
|
|
|
|
|
if (nVersion < address.nVersion) return 1; |
|
|
|
|
|
|
|
if (vchData < address.vchData) return -1; |
|
|
|
|
|
|
|
if (vchData > address.vchData) return 1; |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool operator==(const CBitcoinAddress& address) const { return CompareTo(address) == 0; } |
|
|
|
|
|
|
|
bool operator<=(const CBitcoinAddress& address) const { return CompareTo(address) <= 0; } |
|
|
|
|
|
|
|
bool operator>=(const CBitcoinAddress& address) const { return CompareTo(address) >= 0; } |
|
|
|
|
|
|
|
bool operator< (const CBitcoinAddress& address) const { return CompareTo(address) < 0; } |
|
|
|
|
|
|
|
bool operator> (const CBitcoinAddress& address) const { return CompareTo(address) > 0; } |
|
|
|
|
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
#endif |
|
|
|