18static const char* 
pszBase58 = 
"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
 
   20    -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
 
   21    -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
 
   22    -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
 
   23    -1, 0, 1, 2, 3, 4, 5, 6,  7, 8,-1,-1,-1,-1,-1,-1,
 
   24    -1, 9,10,11,12,13,14,15, 16,-1,17,18,19,20,21,-1,
 
   25    22,23,24,25,26,27,28,29, 30,31,32,-1,-1,-1,-1,-1,
 
   26    -1,33,34,35,36,37,38,39, 40,41,42,43,-1,44,45,46,
 
   27    47,48,49,50,51,52,53,54, 55,56,57,-1,-1,-1,-1,-1,
 
   28    -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
 
   29    -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
 
   30    -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
 
   31    -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
 
   32    -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
 
   33    -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
 
   34    -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
 
   35    -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
 
   38[[nodiscard]] 
static bool DecodeBase58(
const char* psz, std::vector<unsigned char>& vch, 
int max_ret_len)
 
   48        if (zeroes > max_ret_len) 
return false;
 
   52    int size = strlen(psz) * 733 /1000 + 1; 
 
   53    std::vector<unsigned char> b256(size);
 
   55    static_assert(std::size(
mapBase58) == 256, 
"mapBase58.size() should be 256"); 
 
   56    while (*psz && !
IsSpace(*psz)) {
 
   62        for (std::vector<unsigned char>::reverse_iterator it = b256.rbegin(); (carry != 0 || i < length) && (it != b256.rend()); ++it, ++i) {
 
   69        if (length + zeroes > max_ret_len) 
return false;
 
   78    std::vector<unsigned char>::iterator it = b256.begin() + (size - length);
 
   80    vch.reserve(zeroes + (b256.end() - it));
 
   81    vch.assign(zeroes, 0x00);
 
   82    while (it != b256.end())
 
   83        vch.push_back(*(it++));
 
   92    while (input.
size() > 0 && input[0] == 0) {
 
   97    int size = input.
size() * 138 / 100 + 1; 
 
   98    std::vector<unsigned char> b58(size);
 
  100    while (input.
size() > 0) {
 
  101        int carry = input[0];
 
  104        for (std::vector<unsigned char>::reverse_iterator it = b58.rbegin(); (carry != 0 || i < length) && (it != b58.rend()); it++, i++) {
 
  105            carry += 256 * (*it);
 
  115    std::vector<unsigned char>::iterator it = b58.begin() + (size - length);
 
  116    while (it != b58.end() && *it == 0)
 
  120    str.reserve(zeroes + (b58.end() - it));
 
  121    str.assign(zeroes, 
'1');
 
  122    while (it != b58.end())
 
  127bool DecodeBase58(
const std::string& str, std::vector<unsigned char>& vchRet, 
int max_ret_len)
 
  138    std::vector<unsigned char> vch(input.
begin(), input.
end());
 
  140    vch.insert(vch.end(), (
unsigned char*)&hash, (
unsigned char*)&hash + 4);
 
  144[[nodiscard]] 
static bool DecodeBase58Check(
const char* psz, std::vector<unsigned char>& vchRet, 
int max_ret_len)
 
  146    if (!
DecodeBase58(psz, vchRet, max_ret_len > std::numeric_limits<int>::max() - 4 ? std::numeric_limits<int>::max() : max_ret_len + 4) ||
 
  147        (vchRet.size() < 4)) {
 
  153    if (memcmp(&hash, &vchRet[vchRet.size() - 4], 4) != 0) {
 
  157    vchRet.resize(vchRet.size() - 4);
 
std::string EncodeBase58(Span< const unsigned char > input)
Why base-58 instead of standard base-64 encoding?
std::string EncodeBase58Check(Span< const unsigned char > input)
Encode a byte span into a base58-encoded string, including checksum.
static bool DecodeBase58Check(const char *psz, std::vector< unsigned char > &vchRet, int max_ret_len)
static bool DecodeBase58(const char *psz, std::vector< unsigned char > &vch, int max_ret_len)
static const char * pszBase58
All alphanumeric characters except for "0", "I", "O", and "l".
static const int8_t mapBase58[256]
A Span is an object that can refer to a contiguous sequence of objects.
constexpr std::size_t size() const noexcept
CONSTEXPR_IF_NOT_DEBUG Span< C > subspan(std::size_t offset) const noexcept
constexpr C * begin() const noexcept
constexpr C * end() const noexcept
uint256 Hash(const T &in1)
Compute the 256-bit hash of an object.
constexpr Span< A > MakeSpan(A(&a)[N])
MakeSpan for arrays:
constexpr bool IsSpace(char c) noexcept
Tests if the given character is a whitespace character.
bool ValidAsCString(const std::string &str) noexcept
Check if a string does not contain any embedded NUL (\0) characters.