Skip to content

Commit 2474645

Browse files
committed
refactor: Separate hash and stats calculation in coinstats
1 parent a1fccea commit 2474645

File tree

1 file changed

+21
-17
lines changed

1 file changed

+21
-17
lines changed

src/node/coinstats.cpp

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,31 +24,35 @@ static uint64_t GetBogoSize(const CScript& scriptPubKey)
2424
scriptPubKey.size() /* scriptPubKey */;
2525
}
2626

27-
static void ApplyStats(CCoinsStats& stats, CHashWriter& ss, const uint256& hash, const std::map<uint32_t, Coin>& outputs)
27+
static void ApplyHash(CCoinsStats& stats, CHashWriter& ss, const uint256& hash, const std::map<uint32_t, Coin>& outputs, std::map<uint32_t, Coin>::const_iterator it)
2828
{
29-
assert(!outputs.empty());
30-
ss << hash;
31-
ss << VARINT(outputs.begin()->second.nHeight * 2 + outputs.begin()->second.fCoinBase ? 1u : 0u);
32-
stats.nTransactions++;
33-
for (const auto& output : outputs) {
34-
ss << VARINT(output.first + 1);
35-
ss << output.second.out.scriptPubKey;
36-
ss << VARINT_MODE(output.second.out.nValue, VarIntMode::NONNEGATIVE_SIGNED);
37-
stats.nTransactionOutputs++;
38-
stats.nTotalAmount += output.second.out.nValue;
39-
stats.nBogoSize += GetBogoSize(output.second.out.scriptPubKey);
29+
if (it == outputs.begin()) {
30+
ss << hash;
31+
ss << VARINT(it->second.nHeight * 2 + it->second.fCoinBase ? 1u : 0u);
32+
}
33+
34+
ss << VARINT(it->first + 1);
35+
ss << it->second.out.scriptPubKey;
36+
ss << VARINT_MODE(it->second.out.nValue, VarIntMode::NONNEGATIVE_SIGNED);
37+
38+
if (it == std::prev(outputs.end())) {
39+
ss << VARINT(0u);
4040
}
41-
ss << VARINT(0u);
4241
}
4342

44-
static void ApplyStats(CCoinsStats& stats, std::nullptr_t, const uint256& hash, const std::map<uint32_t, Coin>& outputs)
43+
static void ApplyHash(CCoinsStats& stats, std::nullptr_t, const uint256& hash, const std::map<uint32_t, Coin>& outputs, std::map<uint32_t, Coin>::const_iterator it) {}
44+
45+
template <typename T>
46+
static void ApplyStats(CCoinsStats &stats, T& hash_obj, const uint256& hash, const std::map<uint32_t, Coin>& outputs)
4547
{
4648
assert(!outputs.empty());
4749
stats.nTransactions++;
48-
for (const auto& output : outputs) {
50+
for (auto it = outputs.begin(); it != outputs.end(); ++it) {
51+
ApplyHash(stats, hash_obj, hash, outputs, it);
52+
4953
stats.nTransactionOutputs++;
50-
stats.nTotalAmount += output.second.out.nValue;
51-
stats.nBogoSize += GetBogoSize(output.second.out.scriptPubKey);
54+
stats.nTotalAmount += it->second.out.nValue;
55+
stats.nBogoSize += GetBogoSize(it->second.out.scriptPubKey);
5256
}
5357
}
5458

0 commit comments

Comments
 (0)