fix bug due to unitialized var in CTxInUndo, and create rpc calls for getting some statistics about the ncc trie
This commit is contained in:
parent
c584a71a09
commit
49c7c3ef25
8 changed files with 159 additions and 1 deletions
|
@ -153,6 +153,68 @@ bool CNCCTrie::haveClaim(const std::string& name, const uint256& txhash, uint32_
|
||||||
return current->haveValue(txhash, nOut);
|
return current->haveValue(txhash, nOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int CNCCTrie::getTotalNamesInTrie() const
|
||||||
|
{
|
||||||
|
if (empty())
|
||||||
|
return 0;
|
||||||
|
const CNCCTrieNode* current = &root;
|
||||||
|
return getTotalNamesRecursive(current);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int CNCCTrie::getTotalNamesRecursive(const CNCCTrieNode* current) const
|
||||||
|
{
|
||||||
|
unsigned int names_in_subtrie = 0;
|
||||||
|
if (!(current->values.empty()))
|
||||||
|
names_in_subtrie += 1;
|
||||||
|
for (nodeMapType::const_iterator it = current->children.begin(); it != current->children.end(); ++it)
|
||||||
|
{
|
||||||
|
names_in_subtrie += getTotalNamesRecursive(it->second);
|
||||||
|
}
|
||||||
|
return names_in_subtrie;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int CNCCTrie::getTotalClaimsInTrie() const
|
||||||
|
{
|
||||||
|
if (empty())
|
||||||
|
return 0;
|
||||||
|
const CNCCTrieNode* current = &root;
|
||||||
|
return getTotalClaimsRecursive(current);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int CNCCTrie::getTotalClaimsRecursive(const CNCCTrieNode* current) const
|
||||||
|
{
|
||||||
|
unsigned int claims_in_subtrie = current->values.size();
|
||||||
|
for (nodeMapType::const_iterator it = current->children.begin(); it != current->children.end(); ++it)
|
||||||
|
{
|
||||||
|
claims_in_subtrie += getTotalClaimsRecursive(it->second);
|
||||||
|
}
|
||||||
|
return claims_in_subtrie;
|
||||||
|
}
|
||||||
|
|
||||||
|
CAmount CNCCTrie::getTotalValueOfClaimsInTrie(bool fControllingOnly) const
|
||||||
|
{
|
||||||
|
if (empty())
|
||||||
|
return 0;
|
||||||
|
const CNCCTrieNode* current = &root;
|
||||||
|
return getTotalValueOfClaimsRecursive(current, fControllingOnly);
|
||||||
|
}
|
||||||
|
|
||||||
|
CAmount CNCCTrie::getTotalValueOfClaimsRecursive(const CNCCTrieNode* current, bool fControllingOnly) const
|
||||||
|
{
|
||||||
|
CAmount value_in_subtrie = 0;
|
||||||
|
for (std::vector<CNodeValue>::const_iterator itval = current->values.begin(); itval != current->values.end(); ++itval)
|
||||||
|
{
|
||||||
|
value_in_subtrie += itval->nAmount;
|
||||||
|
if (fControllingOnly)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (nodeMapType::const_iterator itchild = current->children.begin(); itchild != current->children.end(); ++itchild)
|
||||||
|
{
|
||||||
|
value_in_subtrie += getTotalValueOfClaimsRecursive(itchild->second, fControllingOnly);
|
||||||
|
}
|
||||||
|
return value_in_subtrie;
|
||||||
|
}
|
||||||
|
|
||||||
bool CNCCTrie::recursiveDumpToJSON(const std::string& name, const CNCCTrieNode* current, json_spirit::Array& ret) const
|
bool CNCCTrie::recursiveDumpToJSON(const std::string& name, const CNCCTrieNode* current, json_spirit::Array& ret) const
|
||||||
{
|
{
|
||||||
using namespace json_spirit;
|
using namespace json_spirit;
|
||||||
|
|
|
@ -160,6 +160,9 @@ public:
|
||||||
int nCurrentHeight;
|
int nCurrentHeight;
|
||||||
bool queueEmpty() const;
|
bool queueEmpty() const;
|
||||||
bool haveClaim(const std::string& name, const uint256& txhash, uint32_t nOut) const;
|
bool haveClaim(const std::string& name, const uint256& txhash, uint32_t nOut) const;
|
||||||
|
unsigned int getTotalNamesInTrie() const;
|
||||||
|
unsigned int getTotalClaimsInTrie() const;
|
||||||
|
CAmount getTotalValueOfClaimsInTrie(bool fControllingOnly) const;
|
||||||
friend class CNCCTrieCache;
|
friend class CNCCTrieCache;
|
||||||
private:
|
private:
|
||||||
void clear(CNCCTrieNode* current);
|
void clear(CNCCTrieNode* current);
|
||||||
|
@ -169,6 +172,9 @@ private:
|
||||||
bool recursiveNullify(CNCCTrieNode* node, std::string& name);
|
bool recursiveNullify(CNCCTrieNode* node, std::string& name);
|
||||||
bool recursiveCheckConsistency(CNCCTrieNode* node);
|
bool recursiveCheckConsistency(CNCCTrieNode* node);
|
||||||
bool InsertFromDisk(const std::string& name, CNCCTrieNode* node);
|
bool InsertFromDisk(const std::string& name, CNCCTrieNode* node);
|
||||||
|
unsigned int getTotalNamesRecursive(const CNCCTrieNode* current) const;
|
||||||
|
unsigned int getTotalClaimsRecursive(const CNCCTrieNode* current) const;
|
||||||
|
CAmount getTotalValueOfClaimsRecursive(const CNCCTrieNode* current, bool fControllingOnly) const;
|
||||||
bool recursiveDumpToJSON(const std::string& name, const CNCCTrieNode* current, json_spirit::Array& ret) const;
|
bool recursiveDumpToJSON(const std::string& name, const CNCCTrieNode* current, json_spirit::Array& ret) const;
|
||||||
CNCCTrieNode root;
|
CNCCTrieNode root;
|
||||||
uint256 hashBlock;
|
uint256 hashBlock;
|
||||||
|
|
|
@ -95,6 +95,7 @@ static const CRPCConvertParam vRPCConvertParams[] =
|
||||||
{ "abandonname", 2},
|
{ "abandonname", 2},
|
||||||
{ "listnameclaims", 0},
|
{ "listnameclaims", 0},
|
||||||
{ "listnameclaims", 1},
|
{ "listnameclaims", 1},
|
||||||
|
{ "gettotalvalueofclaims", 0},
|
||||||
};
|
};
|
||||||
|
|
||||||
class CRPCConvertTable
|
class CRPCConvertTable
|
||||||
|
|
|
@ -105,3 +105,78 @@ Value getvalueforname(const Array& params, bool fHelp)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Value gettotalclaimednames(const Array& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() != 0)
|
||||||
|
throw std::runtime_error(
|
||||||
|
"gettotalclaimednames\n"
|
||||||
|
"Return the total number of names that have been\n"
|
||||||
|
"successfully claimed, and therefore exist in the trie\n"
|
||||||
|
"Arguments:\n"
|
||||||
|
"Result:\n"
|
||||||
|
"\"total names\" (numeric) the total number of\n"
|
||||||
|
" names in the trie\n"
|
||||||
|
);
|
||||||
|
LOCK(cs_main);
|
||||||
|
Object ret;
|
||||||
|
if (!pnccTrie)
|
||||||
|
{
|
||||||
|
ret.push_back(Pair("total names", -1));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
unsigned int num_names = pnccTrie->getTotalNamesInTrie();
|
||||||
|
ret.push_back(Pair("total names", (int)num_names));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
Value gettotalclaims(const Array& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() != 0)
|
||||||
|
throw std::runtime_error(
|
||||||
|
"gettotalclaims\n"
|
||||||
|
"Return the total number of active claims in the trie\n"
|
||||||
|
"Arguments:\n"
|
||||||
|
"Result:\n"
|
||||||
|
"\"total claims\" (numeric) the total number\n"
|
||||||
|
" of active claims\n"
|
||||||
|
);
|
||||||
|
LOCK(cs_main);
|
||||||
|
Object ret;
|
||||||
|
if (!pnccTrie)
|
||||||
|
{
|
||||||
|
ret.push_back(Pair("total claims", -1));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
unsigned int num_claims = pnccTrie->getTotalClaimsInTrie();
|
||||||
|
ret.push_back(Pair("total claims", (int)num_claims));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
Value gettotalvalueofclaims(const Array& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() > 1)
|
||||||
|
throw std::runtime_error(
|
||||||
|
"gettotalvalueofclaims\n"
|
||||||
|
"Return the total value of the claims in the trie\n"
|
||||||
|
"Arguments:\n"
|
||||||
|
"1. \"controlling_only\" (boolean) only include the value\n"
|
||||||
|
" of controlling claims\n"
|
||||||
|
"Result:\n"
|
||||||
|
"\"total value\" (numeric) the total value of the\n"
|
||||||
|
" claims in the trie\n"
|
||||||
|
);
|
||||||
|
LOCK(cs_main);
|
||||||
|
Object ret;
|
||||||
|
if (!pnccTrie)
|
||||||
|
{
|
||||||
|
ret.push_back(Pair("total value", -1));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
bool controlling_only = false;
|
||||||
|
if (params.size() == 1)
|
||||||
|
controlling_only = params[0].get_bool();
|
||||||
|
CAmount total_amount = pnccTrie->getTotalValueOfClaimsInTrie(controlling_only);
|
||||||
|
ret.push_back(Pair("total value", total_amount));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -388,6 +388,9 @@ static const CRPCCommand vRPCCommands[] =
|
||||||
{ "ncctrie", "getncctrie", &getncctrie, true, false},
|
{ "ncctrie", "getncctrie", &getncctrie, true, false},
|
||||||
{ "ncctrie", "gettxinfoforname", &gettxinfoforname, true, false},
|
{ "ncctrie", "gettxinfoforname", &gettxinfoforname, true, false},
|
||||||
{ "ncctrie", "getvalueforname", &getvalueforname, true, false},
|
{ "ncctrie", "getvalueforname", &getvalueforname, true, false},
|
||||||
|
{ "ncctrie", "gettotalclaimednames", &gettotalclaimednames, true, false},
|
||||||
|
{ "ncctrie", "gettotalclaims", &gettotalclaims, true, false},
|
||||||
|
{ "ncctrie", "gettotalvalueofclaims", &gettotalvalueofclaims, true, false},
|
||||||
};
|
};
|
||||||
|
|
||||||
CRPCTable::CRPCTable()
|
CRPCTable::CRPCTable()
|
||||||
|
|
|
@ -241,6 +241,9 @@ extern json_spirit::Value reconsiderblock(const json_spirit::Array& params, bool
|
||||||
extern json_spirit::Value getncctrie(const json_spirit::Array& params, bool fHelp); // in rpcncctrie.cpp
|
extern json_spirit::Value getncctrie(const json_spirit::Array& params, bool fHelp); // in rpcncctrie.cpp
|
||||||
extern json_spirit::Value gettxinfoforname(const json_spirit::Array& params, bool fHelp);
|
extern json_spirit::Value gettxinfoforname(const json_spirit::Array& params, bool fHelp);
|
||||||
extern json_spirit::Value getvalueforname(const json_spirit::Array& params, bool fHelp);
|
extern json_spirit::Value getvalueforname(const json_spirit::Array& params, bool fHelp);
|
||||||
|
extern json_spirit::Value gettotalclaimednames(const json_spirit::Array& params, bool fHelp);
|
||||||
|
extern json_spirit::Value gettotalclaims(const json_spirit::Array& params, bool fHelp);
|
||||||
|
extern json_spirit::Value gettotalvalueofclaims(const json_spirit::Array& params, bool fHelp);
|
||||||
|
|
||||||
// in rest.cpp
|
// in rest.cpp
|
||||||
extern bool HTTPReq_REST(AcceptedConnection *conn,
|
extern bool HTTPReq_REST(AcceptedConnection *conn,
|
||||||
|
|
|
@ -28,7 +28,7 @@ public:
|
||||||
unsigned int nNCCValidHeight; // If the outpoint was an NCC claim, the height at which the claim should be inserted into the trie
|
unsigned int nNCCValidHeight; // If the outpoint was an NCC claim, the height at which the claim should be inserted into the trie
|
||||||
|
|
||||||
CTxInUndo() : txout(), fLastUnspent(false), fCoinBase(false), nHeight(0), nVersion(0), nNCCValidHeight(0) {}
|
CTxInUndo() : txout(), fLastUnspent(false), fCoinBase(false), nHeight(0), nVersion(0), nNCCValidHeight(0) {}
|
||||||
CTxInUndo(const CTxOut &txoutIn, bool fCoinBaseIn = false, unsigned int nHeightIn = 0, int nVersionIn = 0, unsigned int nNCCValidHeight = 0) : txout(txoutIn), fCoinBase(fCoinBaseIn), nHeight(nHeightIn), nVersion(nVersionIn), nNCCValidHeight(nNCCValidHeight) { }
|
CTxInUndo(const CTxOut &txoutIn, bool fLastUnspent = false, bool fCoinBaseIn = false, unsigned int nHeightIn = 0, int nVersionIn = 0, unsigned int nNCCValidHeight = 0) : txout(txoutIn), fLastUnspent(fLastUnspent), fCoinBase(fCoinBaseIn), nHeight(nHeightIn), nVersion(nVersionIn), nNCCValidHeight(nNCCValidHeight) { }
|
||||||
|
|
||||||
unsigned int GetSerializeSize(int nType, int nVersion) const {
|
unsigned int GetSerializeSize(int nType, int nVersion) const {
|
||||||
return ::GetSerializeSize(VARINT(nHeight*4+(fCoinBase ? 2 : 0)+(fLastUnspent ? 1: 0)), nType, nVersion) +
|
return ::GetSerializeSize(VARINT(nHeight*4+(fCoinBase ? 2 : 0)+(fLastUnspent ? 1: 0)), nType, nVersion) +
|
||||||
|
|
|
@ -630,6 +630,13 @@ void ListNameClaims(const CWalletTx& wtx, const string& strAccount, int nMinDept
|
||||||
entry.push_back(Pair("amount", ValueFromAmount(s.amount)));
|
entry.push_back(Pair("amount", ValueFromAmount(s.amount)));
|
||||||
entry.push_back(Pair("vout", s.vout));
|
entry.push_back(Pair("vout", s.vout));
|
||||||
entry.push_back(Pair("fee", ValueFromAmount(nFee)));
|
entry.push_back(Pair("fee", ValueFromAmount(nFee)));
|
||||||
|
BlockMap::iterator it = mapBlockIndex.find(wtx.hashBlock);
|
||||||
|
if (it != mapBlockIndex.end())
|
||||||
|
{
|
||||||
|
CBlockIndex* pindex = it->second;
|
||||||
|
if (pindex)
|
||||||
|
entry.push_back(Pair("height", pindex->nHeight));
|
||||||
|
}
|
||||||
entry.push_back(Pair("confirmations", wtx.GetDepthInMainChain()));
|
entry.push_back(Pair("confirmations", wtx.GetDepthInMainChain()));
|
||||||
entry.push_back(Pair("is spent", pwalletMain->IsSpent(wtx.GetHash(), s.vout)));
|
entry.push_back(Pair("is spent", pwalletMain->IsSpent(wtx.GetHash(), s.vout)));
|
||||||
entry.push_back(Pair("is in ncc trie", pnccTrie->haveClaim(sName, wtx.GetHash(), s.vout)));
|
entry.push_back(Pair("is in ncc trie", pnccTrie->haveClaim(sName, wtx.GetHash(), s.vout)));
|
||||||
|
@ -662,6 +669,7 @@ Value listnameclaims(const Array& params, bool fHelp)
|
||||||
" \"amount\": x.xxx, (numeric) The amount in btc.\n"
|
" \"amount\": x.xxx, (numeric) The amount in btc.\n"
|
||||||
" \"vout\": n, (numeric) The vout value\n"
|
" \"vout\": n, (numeric) The vout value\n"
|
||||||
" \"fee\": x.xxx, (numeric) The amount of the fee in btc.\n"
|
" \"fee\": x.xxx, (numeric) The amount of the fee in btc.\n"
|
||||||
|
" \"height\": n (numeric) The height of the block in which this transaction was included.\n"
|
||||||
" \"confirmations\": n, (numeric) The number of confirmations for the transaction\n"
|
" \"confirmations\": n, (numeric) The number of confirmations for the transaction\n"
|
||||||
" \"blockhash\": \"hashvalue\", (string) The block hash containing the transaction.\n"
|
" \"blockhash\": \"hashvalue\", (string) The block hash containing the transaction.\n"
|
||||||
" \"blockindex\": n, (numeric) The block index containing the transaction.\n"
|
" \"blockindex\": n, (numeric) The block index containing the transaction.\n"
|
||||||
|
|
Loading…
Reference in a new issue