0
0
Fork 0
mirror of https://github.com/bitcoin/bitcoin.git synced 2025-03-05 14:06:27 -05:00

util: make EncodeBase58 consume Spans

This commit is contained in:
Sebastian Falbesoner 2020-08-10 02:52:37 +02:00
parent bd00d3b1f2
commit f0fce0675d
5 changed files with 13 additions and 23 deletions

View file

@ -84,21 +84,21 @@ bool DecodeBase58(const char* psz, std::vector<unsigned char>& vch, int max_ret_
return true; return true;
} }
std::string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend) std::string EncodeBase58(Span<const unsigned char> input)
{ {
// Skip & count leading zeroes. // Skip & count leading zeroes.
int zeroes = 0; int zeroes = 0;
int length = 0; int length = 0;
while (pbegin != pend && *pbegin == 0) { while (input.size() > 0 && input[0] == 0) {
pbegin++; input = input.subspan(1);
zeroes++; zeroes++;
} }
// Allocate enough space in big-endian base58 representation. // Allocate enough space in big-endian base58 representation.
int size = (pend - pbegin) * 138 / 100 + 1; // log(256) / log(58), rounded up. int size = input.size() * 138 / 100 + 1; // log(256) / log(58), rounded up.
std::vector<unsigned char> b58(size); std::vector<unsigned char> b58(size);
// Process the bytes. // Process the bytes.
while (pbegin != pend) { while (input.size() > 0) {
int carry = *pbegin; int carry = input[0];
int i = 0; int i = 0;
// Apply "b58 = b58 * 256 + ch". // Apply "b58 = b58 * 256 + ch".
for (std::vector<unsigned char>::reverse_iterator it = b58.rbegin(); (carry != 0 || i < length) && (it != b58.rend()); it++, i++) { for (std::vector<unsigned char>::reverse_iterator it = b58.rbegin(); (carry != 0 || i < length) && (it != b58.rend()); it++, i++) {
@ -109,7 +109,7 @@ std::string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend)
assert(carry == 0); assert(carry == 0);
length = i; length = i;
pbegin++; input = input.subspan(1);
} }
// Skip leading zeroes in base58 result. // Skip leading zeroes in base58 result.
std::vector<unsigned char>::iterator it = b58.begin() + (size - length); std::vector<unsigned char>::iterator it = b58.begin() + (size - length);
@ -124,11 +124,6 @@ std::string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend)
return str; return str;
} }
std::string EncodeBase58(const std::vector<unsigned char>& vch)
{
return EncodeBase58(vch.data(), vch.data() + vch.size());
}
bool DecodeBase58(const std::string& str, std::vector<unsigned char>& vchRet, int max_ret_len) bool DecodeBase58(const std::string& str, std::vector<unsigned char>& vchRet, int max_ret_len)
{ {
if (!ValidAsCString(str)) { if (!ValidAsCString(str)) {

View file

@ -15,20 +15,15 @@
#define BITCOIN_BASE58_H #define BITCOIN_BASE58_H
#include <attributes.h> #include <attributes.h>
#include <span.h>
#include <string> #include <string>
#include <vector> #include <vector>
/** /**
* Encode a byte sequence as a base58-encoded string. * Encode a byte span as a base58-encoded string
* pbegin and pend cannot be nullptr, unless both are.
*/ */
std::string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend); std::string EncodeBase58(Span<const unsigned char> input);
/**
* 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). * Decode a base58-encoded string (psz) into a byte vector (vchRet).

View file

@ -20,7 +20,7 @@ static void Base58Encode(benchmark::Bench& bench)
} }
}; };
bench.batch(buff.size()).unit("byte").run([&] { bench.batch(buff.size()).unit("byte").run([&] {
EncodeBase58(buff.data(), buff.data() + buff.size()); EncodeBase58(buff);
}); });
} }

View file

@ -94,7 +94,7 @@ static std::string DummyAddress(const CChainParams &params)
std::vector<unsigned char> sourcedata = params.Base58Prefix(CChainParams::PUBKEY_ADDRESS); std::vector<unsigned char> sourcedata = params.Base58Prefix(CChainParams::PUBKEY_ADDRESS);
sourcedata.insert(sourcedata.end(), dummydata, dummydata + sizeof(dummydata)); sourcedata.insert(sourcedata.end(), dummydata, dummydata + sizeof(dummydata));
for(int i=0; i<256; ++i) { // Try every trailing byte for(int i=0; i<256; ++i) { // Try every trailing byte
std::string s = EncodeBase58(sourcedata.data(), sourcedata.data() + sourcedata.size()); std::string s = EncodeBase58(sourcedata);
if (!IsValidDestinationString(s)) { if (!IsValidDestinationString(s)) {
return s; return s;
} }

View file

@ -33,7 +33,7 @@ BOOST_AUTO_TEST_CASE(base58_EncodeBase58)
std::vector<unsigned char> sourcedata = ParseHex(test[0].get_str()); std::vector<unsigned char> sourcedata = ParseHex(test[0].get_str());
std::string base58string = test[1].get_str(); std::string base58string = test[1].get_str();
BOOST_CHECK_MESSAGE( BOOST_CHECK_MESSAGE(
EncodeBase58(sourcedata.data(), sourcedata.data() + sourcedata.size()) == base58string, EncodeBase58(sourcedata) == base58string,
strTest); strTest);
} }
} }