diff --git a/src/node/coinstats.cpp b/src/node/coinstats.cpp --- a/src/node/coinstats.cpp +++ b/src/node/coinstats.cpp @@ -19,33 +19,39 @@ scriptPubKey.size() /* scriptPubKey */; } -static void ApplyStats(CCoinsStats &stats, CHashWriter &ss, const uint256 &hash, - const std::map &outputs) { - assert(!outputs.empty()); - ss << hash; - ss << VARINT(outputs.begin()->second.GetHeight() * 2 + - outputs.begin()->second.IsCoinBase()); - stats.nTransactions++; - for (const auto &output : outputs) { - ss << VARINT(output.first + 1); - ss << output.second.GetTxOut().scriptPubKey; - ss << VARINT_MODE(output.second.GetTxOut().nValue / SATOSHI, - VarIntMode::NONNEGATIVE_SIGNED); - stats.nTransactionOutputs++; - stats.nTotalAmount += output.second.GetTxOut().nValue; - stats.nBogoSize += GetBogoSize(output.second.GetTxOut().scriptPubKey); +static void ApplyHash(CCoinsStats &stats, CHashWriter &ss, const uint256 &hash, + const std::map &outputs, + std::map::const_iterator it) { + if (it == outputs.begin()) { + ss << hash; + ss << VARINT(it->second.GetHeight() * 2 + it->second.IsCoinBase()); + } + + ss << VARINT(it->first + 1); + ss << it->second.GetTxOut().scriptPubKey; + ss << VARINT_MODE(it->second.GetTxOut().nValue / SATOSHI, + VarIntMode::NONNEGATIVE_SIGNED); + + if (it == std::prev(outputs.end())) { + ss << VARINT(0u); } - ss << VARINT(0u); } -static void ApplyStats(CCoinsStats &stats, std::nullptr_t, const uint256 &hash, +static void ApplyHash(CCoinsStats &stats, std::nullptr_t, const uint256 &hash, + const std::map &outputs, + std::map::const_iterator it) {} + +template +static void ApplyStats(CCoinsStats &stats, T &hash_obj, const uint256 &hash, const std::map &outputs) { assert(!outputs.empty()); stats.nTransactions++; - for (const auto &output : outputs) { + for (auto it = outputs.begin(); it != outputs.end(); ++it) { + ApplyHash(stats, hash_obj, hash, outputs, it); + stats.nTransactionOutputs++; - stats.nTotalAmount += output.second.GetTxOut().nValue; - stats.nBogoSize += GetBogoSize(output.second.GetTxOut().scriptPubKey); + stats.nTotalAmount += it->second.GetTxOut().nValue; + stats.nBogoSize += GetBogoSize(it->second.GetTxOut().scriptPubKey); } }