From f0fce0675d56b2226a993253731690ca864066c8 Mon Sep 17 00:00:00 2001 From: Sebastian Falbesoner Date: Mon, 10 Aug 2020 02:52:37 +0200 Subject: util: make EncodeBase58 consume Spans --- src/base58.cpp | 19 +++++++------------ src/base58.h | 11 +++-------- src/bench/base58.cpp | 2 +- src/qt/guiutil.cpp | 2 +- src/test/base58_tests.cpp | 2 +- 5 files changed, 13 insertions(+), 23 deletions(-) (limited to 'src') diff --git a/src/base58.cpp b/src/base58.cpp index 9b2946e7a9..715e4e7891 100644 --- a/src/base58.cpp +++ b/src/base58.cpp @@ -84,21 +84,21 @@ bool DecodeBase58(const char* psz, std::vector& vch, int max_ret_ return true; } -std::string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend) +std::string EncodeBase58(Span input) { // Skip & count leading zeroes. int zeroes = 0; int length = 0; - while (pbegin != pend && *pbegin == 0) { - pbegin++; + while (input.size() > 0 && input[0] == 0) { + input = input.subspan(1); zeroes++; } // 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 b58(size); // Process the bytes. - while (pbegin != pend) { - int carry = *pbegin; + while (input.size() > 0) { + int carry = input[0]; int i = 0; // Apply "b58 = b58 * 256 + ch". for (std::vector::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); length = i; - pbegin++; + input = input.subspan(1); } // Skip leading zeroes in base58 result. std::vector::iterator it = b58.begin() + (size - length); @@ -124,11 +124,6 @@ std::string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend) return str; } -std::string EncodeBase58(const std::vector& vch) -{ - return EncodeBase58(vch.data(), vch.data() + vch.size()); -} - bool DecodeBase58(const std::string& str, std::vector& vchRet, int max_ret_len) { if (!ValidAsCString(str)) { diff --git a/src/base58.h b/src/base58.h index 042ad671d3..d9791d1dbe 100644 --- a/src/base58.h +++ b/src/base58.h @@ -15,20 +15,15 @@ #define BITCOIN_BASE58_H #include +#include #include #include /** - * Encode a byte sequence as a base58-encoded string. - * pbegin and pend cannot be nullptr, unless both are. + * Encode a byte span as a base58-encoded string */ -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& vch); +std::string EncodeBase58(Span input); /** * Decode a base58-encoded string (psz) into a byte vector (vchRet). diff --git a/src/bench/base58.cpp b/src/bench/base58.cpp index 00544cba31..dee3ffeb6b 100644 --- a/src/bench/base58.cpp +++ b/src/bench/base58.cpp @@ -20,7 +20,7 @@ static void Base58Encode(benchmark::Bench& bench) } }; bench.batch(buff.size()).unit("byte").run([&] { - EncodeBase58(buff.data(), buff.data() + buff.size()); + EncodeBase58(buff); }); } diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index 7f439fa45e..6e34aca0eb 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -94,7 +94,7 @@ static std::string DummyAddress(const CChainParams ¶ms) std::vector sourcedata = params.Base58Prefix(CChainParams::PUBKEY_ADDRESS); sourcedata.insert(sourcedata.end(), dummydata, dummydata + sizeof(dummydata)); 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)) { return s; } diff --git a/src/test/base58_tests.cpp b/src/test/base58_tests.cpp index 57559fa687..6a636f2574 100644 --- a/src/test/base58_tests.cpp +++ b/src/test/base58_tests.cpp @@ -33,7 +33,7 @@ BOOST_AUTO_TEST_CASE(base58_EncodeBase58) std::vector sourcedata = ParseHex(test[0].get_str()); std::string base58string = test[1].get_str(); BOOST_CHECK_MESSAGE( - EncodeBase58(sourcedata.data(), sourcedata.data() + sourcedata.size()) == base58string, + EncodeBase58(sourcedata) == base58string, strTest); } } -- cgit v1.2.3 From 356988e200b1debaa80d210d502d2d085c72dc64 Mon Sep 17 00:00:00 2001 From: Sebastian Falbesoner Date: Mon, 10 Aug 2020 03:03:10 +0200 Subject: util: make EncodeBase58Check consume Spans --- src/base58.cpp | 4 ++-- src/base58.h | 4 ++-- src/bench/base58.cpp | 4 +--- 3 files changed, 5 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/base58.cpp b/src/base58.cpp index 715e4e7891..18cd2090e0 100644 --- a/src/base58.cpp +++ b/src/base58.cpp @@ -132,10 +132,10 @@ bool DecodeBase58(const std::string& str, std::vector& vchRet, in return DecodeBase58(str.c_str(), vchRet, max_ret_len); } -std::string EncodeBase58Check(const std::vector& vchIn) +std::string EncodeBase58Check(Span input) { // add 4-byte hash check to the end - std::vector vch(vchIn); + std::vector vch(input.begin(), input.end()); uint256 hash = Hash(vch); vch.insert(vch.end(), (unsigned char*)&hash, (unsigned char*)&hash + 4); return EncodeBase58(vch); diff --git a/src/base58.h b/src/base58.h index d9791d1dbe..b87664b78b 100644 --- a/src/base58.h +++ b/src/base58.h @@ -39,9 +39,9 @@ NODISCARD bool DecodeBase58(const char* psz, std::vector& vchRet, NODISCARD bool DecodeBase58(const std::string& str, std::vector& vchRet, int max_ret_len); /** - * Encode a byte vector into a base58-encoded string, including checksum + * Encode a byte span into a base58-encoded string, including checksum */ -std::string EncodeBase58Check(const std::vector& vchIn); +std::string EncodeBase58Check(Span input); /** * Decode a base58-encoded string (psz) that includes a checksum into a byte diff --git a/src/bench/base58.cpp b/src/bench/base58.cpp index dee3ffeb6b..18cb5de196 100644 --- a/src/bench/base58.cpp +++ b/src/bench/base58.cpp @@ -34,10 +34,8 @@ static void Base58CheckEncode(benchmark::Bench& bench) 200, 24 } }; - std::vector vch; - vch.assign(buff.begin(), buff.end()); bench.batch(buff.size()).unit("byte").run([&] { - EncodeBase58Check(vch); + EncodeBase58Check(buff); }); } -- cgit v1.2.3