Merge 8ad5f1c376 into merged_master (Bitcoin PR #19106)

This commit is contained in:
Andrew Poelstra 2020-11-26 01:08:54 +00:00
commit ea6e25d012
4 changed files with 32 additions and 16 deletions

View file

@ -195,9 +195,15 @@ const std::vector<std::string> &getAllNetMessageTypes()
return allNetMessageTypesVec;
}
std::string serviceFlagToStr(const uint64_t mask, const int bit)
/**
* Convert a service flag (NODE_*) to a human readable string.
* It supports unknown service flags which will be returned as "UNKNOWN[...]".
* @param[in] bit the service flag is calculated as (1 << bit)
*/
static std::string serviceFlagToStr(size_t bit)
{
switch (ServiceFlags(mask)) {
const uint64_t service_flag = 1ULL << bit;
switch ((ServiceFlags)service_flag) {
case NODE_NONE: abort(); // impossible
case NODE_NETWORK: return "NETWORK";
case NODE_GETUTXO: return "GETUTXO";
@ -212,10 +218,23 @@ std::string serviceFlagToStr(const uint64_t mask, const int bit)
stream.imbue(std::locale::classic());
stream << "UNKNOWN[";
if (bit < 8) {
stream << mask;
stream << service_flag;
} else {
stream << "2^" << bit;
}
stream << "]";
return stream.str();
}
std::vector<std::string> serviceFlagsToStr(uint64_t flags)
{
std::vector<std::string> str_flags;
for (size_t i = 0; i < sizeof(flags) * 8; ++i) {
if (flags & (1ULL << i)) {
str_flags.emplace_back(serviceFlagToStr(i));
}
}
return str_flags;
}

View file

@ -290,7 +290,12 @@ enum ServiceFlags : uint64_t {
NODE_REPLACE_BY_FEE = (1 << 26),
};
std::string serviceFlagToStr(uint64_t mask, int bit);
/**
* Convert service flags (a bitmask of NODE_*) to human readable strings.
* It supports unknown service flags which will be returned as "UNKNOWN[...]".
* @param[in] flags multiple NODE_* bitwise-OR-ed together
*/
std::vector<std::string> serviceFlagsToStr(uint64_t flags);
/**
* Gets the set of service flags which are "desirable" for a given peer.

View file

@ -823,12 +823,8 @@ QString formatServicesStr(quint64 mask)
{
QStringList strList;
for (int i = 0; i < 64; i++) {
uint64_t check = 1ull << i;
if (mask & check)
{
strList.append(QString::fromStdString(serviceFlagToStr(mask, i)));
}
for (const auto& flag : serviceFlagsToStr(mask)) {
strList.append(QString::fromStdString(flag));
}
if (strList.size())

View file

@ -852,14 +852,10 @@ std::vector<CScript> EvalDescriptorStringOrObject(const UniValue& scanobject, Fl
UniValue GetServicesNames(ServiceFlags services)
{
const uint64_t services_n = services;
UniValue servicesNames(UniValue::VARR);
for (int i = 0; i < 64; ++i) {
const uint64_t mask = 1ull << i;
if (services_n & mask) {
servicesNames.push_back(serviceFlagToStr(mask, i));
}
for (const auto& flag : serviceFlagsToStr(services)) {
servicesNames.push_back(flag);
}
return servicesNames;