forked from dashpay/dash
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge bitcoin#16728: move-only: move coins statistics utils out of RPC
8a3b2eb move-only: move coins statistics utils out of RPC (James O'Beirne) Pull request description: This is part of the [assumeutxo project](https://github.com/bitcoin/bitcoin/projects/11): Parent PR: bitcoin#15606 Issue: bitcoin#15605 Specification: https://github.com/jamesob/assumeutxo-docs/tree/master/proposal --- In the short-term, this move-only commit will help with fuzzing (bitcoin#15606 (comment)). Later, these procedures will be used to compute statistics (particularly a content hash) for UTXO sets coming in from snapshots. Most easily reviewed with `git ... --color-moved=dimmed_zebra`. A nice follow-up would be adding unittests, which I'll do if nobody else gets around to it. ACKs for top commit: MarcoFalke: ACK 8a3b2eb, checked --color-moved=dimmed-zebra Tree-SHA512: a187d2f7590ad2450b8e8fa3d038c80a04fc3d903618c24222d7e3172250ce51badea35860c86101f2ba266eb4354e6efb8d7d508b353f29276e4665a1efdf74
- Loading branch information
Showing
4 changed files
with
113 additions
and
71 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
// Copyright (c) 2010 Satoshi Nakamoto | ||
// Copyright (c) 2009-2019 The Bitcoin Core developers | ||
// Distributed under the MIT software license, see the accompanying | ||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
|
||
#include <node/coinstats.h> | ||
|
||
#include <amount.h> | ||
#include <coins.h> | ||
#include <chain.h> | ||
#include <hash.h> | ||
#include <serialize.h> | ||
#include <validation.h> | ||
#include <uint256.h> | ||
#include <util/system.h> | ||
|
||
#include <map> | ||
|
||
#include <boost/thread.hpp> | ||
|
||
|
||
static void ApplyStats(CCoinsStats &stats, CHashWriter& ss, const uint256& hash, const std::map<uint32_t, Coin>& outputs) | ||
{ | ||
assert(!outputs.empty()); | ||
ss << hash; | ||
ss << VARINT(outputs.begin()->second.nHeight * 2 + outputs.begin()->second.fCoinBase ? 1u : 0u); | ||
stats.nTransactions++; | ||
for (const auto& output : outputs) { | ||
ss << VARINT(output.first + 1); | ||
ss << output.second.out.scriptPubKey; | ||
ss << VARINT(output.second.out.nValue, VarIntMode::NONNEGATIVE_SIGNED); | ||
stats.nTransactionOutputs++; | ||
stats.nTotalAmount += output.second.out.nValue; | ||
stats.nBogoSize += 32 /* txid */ + 4 /* vout index */ + 4 /* height + coinbase */ + 8 /* amount */ + | ||
2 /* scriptPubKey len */ + output.second.out.scriptPubKey.size() /* scriptPubKey */; | ||
} | ||
ss << VARINT(0u); | ||
} | ||
|
||
//! Calculate statistics about the unspent transaction output set | ||
bool GetUTXOStats(CCoinsView *view, CCoinsStats &stats) | ||
{ | ||
std::unique_ptr<CCoinsViewCursor> pcursor(view->Cursor()); | ||
assert(pcursor); | ||
|
||
CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); | ||
stats.hashBlock = pcursor->GetBestBlock(); | ||
{ | ||
LOCK(cs_main); | ||
stats.nHeight = LookupBlockIndex(stats.hashBlock)->nHeight; | ||
} | ||
ss << stats.hashBlock; | ||
uint256 prevkey; | ||
std::map<uint32_t, Coin> outputs; | ||
while (pcursor->Valid()) { | ||
boost::this_thread::interruption_point(); | ||
COutPoint key; | ||
Coin coin; | ||
if (pcursor->GetKey(key) && pcursor->GetValue(coin)) { | ||
if (!outputs.empty() && key.hash != prevkey) { | ||
ApplyStats(stats, ss, prevkey, outputs); | ||
outputs.clear(); | ||
} | ||
prevkey = key.hash; | ||
outputs[key.n] = std::move(coin); | ||
} else { | ||
return error("%s: unable to read value", __func__); | ||
} | ||
pcursor->Next(); | ||
} | ||
if (!outputs.empty()) { | ||
ApplyStats(stats, ss, prevkey, outputs); | ||
} | ||
stats.hashSerialized = ss.GetHash(); | ||
stats.nDiskSize = view->EstimateSize(); | ||
return true; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
// Copyright (c) 2010 Satoshi Nakamoto | ||
// Copyright (c) 2009-2019 The Bitcoin Core developers | ||
// Distributed under the MIT software license, see the accompanying | ||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
|
||
#ifndef BITCOIN_NODE_COINSTATS_H | ||
#define BITCOIN_NODE_COINSTATS_H | ||
|
||
#include <amount.h> | ||
#include <uint256.h> | ||
|
||
#include <cstdint> | ||
|
||
class CCoinsView; | ||
|
||
struct CCoinsStats | ||
{ | ||
int nHeight; | ||
uint256 hashBlock; | ||
uint64_t nTransactions; | ||
uint64_t nTransactionOutputs; | ||
uint64_t nBogoSize; | ||
uint256 hashSerialized; | ||
uint64_t nDiskSize; | ||
CAmount nTotalAmount; | ||
|
||
CCoinsStats() : nHeight(0), nTransactions(0), nTransactionOutputs(0), nBogoSize(0), nDiskSize(0), nTotalAmount(0) {} | ||
}; | ||
|
||
//! Calculate statistics about the unspent transaction output set | ||
bool GetUTXOStats(CCoinsView* view, CCoinsStats& stats); | ||
|
||
#endif // BITCOIN_NODE_COINSTATS_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters