707d2212de
Also write some new accessor methods on the baseclass. The longer term idea is to make the server itself only use the uint160 raw version for bitcoin addresses. For now move the encodings (between that uint160 and human-readable) to the utils library.
115 lines
3.9 KiB
C++
115 lines
3.9 KiB
C++
/*
|
|
* This file is part of the Flowee project
|
|
* Copyright (C) 2009-2010 Satoshi Nakamoto
|
|
* Copyright (C) 2009-2015 The Bitcoin Core developers
|
|
* Copyright (C) 2019 Tom Zander <tomz@freedommail.ch>
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/**
|
|
* Why base-58 instead of standard base-64 encoding?
|
|
* - Don't want 0OIl characters that look the same in some fonts and
|
|
* could be used to create visually identical looking data.
|
|
* - A string with non-alphanumeric characters is not as easily accepted as input.
|
|
* - E-mail usually won't line-break if there's no punctuation to break at.
|
|
* - Double-clicking selects the whole string as one word if it's all alphanumeric.
|
|
*/
|
|
#ifndef FLOWEE_BASE58_H
|
|
#define FLOWEE_BASE58_H
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
/**
|
|
* Encode a byte sequence as a base58-encoded string.
|
|
* pbegin and pend cannot be NULL, unless both are.
|
|
*/
|
|
std::string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend);
|
|
|
|
/**
|
|
* Encode a byte vector as a base58-encoded string
|
|
*/
|
|
std::string EncodeBase58(const std::vector<unsigned char>& vch);
|
|
|
|
/**
|
|
* Decode a base58-encoded string (psz) into a byte vector (vchRet).
|
|
* return true if decoding is successful.
|
|
* psz cannot be NULL.
|
|
*/
|
|
bool DecodeBase58(const char* psz, std::vector<unsigned char>& vchRet);
|
|
|
|
/**
|
|
* Decode a base58-encoded string (str) into a byte vector (vchRet).
|
|
* return true if decoding is successful.
|
|
*/
|
|
bool DecodeBase58(const std::string& str, std::vector<unsigned char>& vchRet);
|
|
|
|
/**
|
|
* Encode a byte vector into a base58-encoded string, including checksum
|
|
*/
|
|
std::string EncodeBase58Check(const std::vector<unsigned char>& vchIn);
|
|
|
|
/**
|
|
* Decode a base58-encoded string (psz) that includes a checksum into a byte
|
|
* vector (vchRet), return true if decoding is successful
|
|
*/
|
|
bool DecodeBase58Check(const char* psz, std::vector<unsigned char>& vchRet);
|
|
|
|
/**
|
|
* Decode a base58-encoded string (str) that includes a checksum into a byte
|
|
* vector (vchRet), return true if decoding is successful
|
|
*/
|
|
bool DecodeBase58Check(const std::string& str, std::vector<unsigned char>& vchRet);
|
|
|
|
/**
|
|
* Base class for all base58-encoded data
|
|
*/
|
|
class CBase58Data
|
|
{
|
|
public:
|
|
CBase58Data();
|
|
bool SetString(const char* psz, unsigned int nVersionBytes = 1);
|
|
bool SetString(const std::string& str);
|
|
std::string ToString() const;
|
|
int CompareTo(const CBase58Data& b58) const;
|
|
|
|
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; }
|
|
|
|
bool isMainnetPkh() const;
|
|
bool isMainnetSh() const;
|
|
bool isMainnetPrivKey() const;
|
|
|
|
inline const std::vector<uint8_t> &data() const {
|
|
return vchData;
|
|
}
|
|
|
|
protected:
|
|
//! the version byte(s)
|
|
std::vector<unsigned char> vchVersion;
|
|
|
|
//! the actually encoded data
|
|
std::vector<unsigned char> vchData;
|
|
|
|
void SetData(const std::vector<unsigned char> &vchVersionIn, const void* pdata, size_t nSize);
|
|
void SetData(const std::vector<unsigned char> &vchVersionIn, const unsigned char *pbegin, const unsigned char *pend);
|
|
|
|
};
|
|
|
|
#endif
|