Enable z_anonsetblockdelta to calculate a delta for a block range; ignore coinbase txs as optimization
This commit is contained in:
@@ -3657,12 +3657,15 @@ UniValue z_anonsetblockdelta(const UniValue& params, bool fHelp, const CPubKey&
|
|||||||
if (!EnsureWalletIsAvailable(fHelp))
|
if (!EnsureWalletIsAvailable(fHelp))
|
||||||
return NullUniValue;
|
return NullUniValue;
|
||||||
|
|
||||||
if (fHelp || params.size() != 1)
|
if (fHelp || params.size() < 1 || params.size() > 2)
|
||||||
throw runtime_error(
|
throw runtime_error(
|
||||||
"z_anonsetblockdelta\n"
|
"z_anonsetblockdelta\n"
|
||||||
"\nReturns delta (difference) in the anonset for a given block height.\n"
|
"\nReturns delta (difference) in the anonset for a given block height. A delta > 0 increases the anonset,\n"
|
||||||
|
"\na delta < 0 reduces the anonset and a delta=0 leaves the anonset the same. Given a single block height\n"
|
||||||
|
"\nwe calculate the delta for that block. Given two block heights, we calculate the delta for that range of blocks.\n"
|
||||||
"\nArguments:\n"
|
"\nArguments:\n"
|
||||||
"1. \"height\" (number, required) The block height\n"
|
"1. \"height\" (number, required) The block height\n"
|
||||||
|
"1. \"end_height\" (number, optional) The ending block height\n"
|
||||||
"\nResult:\n"
|
"\nResult:\n"
|
||||||
"\"delta\" (integer) An integer number.\n"
|
"\"delta\" (integer) An integer number.\n"
|
||||||
"\nExamples:\n"
|
"\nExamples:\n"
|
||||||
@@ -3698,10 +3701,55 @@ UniValue z_anonsetblockdelta(const UniValue& params, bool fHelp, const CPubKey&
|
|||||||
throw JSONRPCError(RPC_INTERNAL_ERROR, "Can't read block from disk");
|
throw JSONRPCError(RPC_INTERNAL_ERROR, "Can't read block from disk");
|
||||||
|
|
||||||
int delta = 0;
|
int delta = 0;
|
||||||
BOOST_FOREACH(const CTransaction&tx, block.vtx)
|
|
||||||
{
|
// given a single block height, we calculate delta for that height
|
||||||
// delta = shielded outputs - shielded inputs
|
if (params.size() == 1) {
|
||||||
delta += tx.vShieldedOutput.size() - tx.vShieldedSpend.size();
|
BOOST_FOREACH(const CTransaction&tx, block.vtx)
|
||||||
|
{
|
||||||
|
// delta = shielded outputs - shielded inputs
|
||||||
|
if(!tx.IsCoinBase()) {
|
||||||
|
delta += tx.vShieldedOutput.size() - tx.vShieldedSpend.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// given two blocks, we calculate delta for that range
|
||||||
|
std::string strHeight2 = params[1].get_str();
|
||||||
|
int nHeight2 = -1;
|
||||||
|
try {
|
||||||
|
nHeight = std::stoi(strHeight2);
|
||||||
|
} catch (const std::exception &e) {
|
||||||
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid ending block height parameter");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nHeight2 < 0 || nHeight2 > chainActive.Height()) {
|
||||||
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Ending block height out of range");
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the delta for every block in the range
|
||||||
|
for(int currentHeight = nHeight; currentHeight <= nHeight2; currentHeight++) {
|
||||||
|
auto strHash = chainActive[currentHeight]->GetBlockHash().GetHex();
|
||||||
|
uint256 hash(uint256S(strHash));
|
||||||
|
|
||||||
|
if (mapBlockIndex.count(hash) == 0)
|
||||||
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
|
||||||
|
|
||||||
|
CBlock block;
|
||||||
|
CBlockIndex* pblockindex = mapBlockIndex[hash];
|
||||||
|
|
||||||
|
if (fHavePruned && !(pblockindex->nStatus & BLOCK_HAVE_DATA) && pblockindex->nTx > 0)
|
||||||
|
throw JSONRPCError(RPC_INTERNAL_ERROR, "Block not available (pruned data)");
|
||||||
|
|
||||||
|
if(!ReadBlockFromDisk(block, pblockindex,1))
|
||||||
|
throw JSONRPCError(RPC_INTERNAL_ERROR, "Can't read block from disk");
|
||||||
|
|
||||||
|
BOOST_FOREACH(const CTransaction&tx, block.vtx)
|
||||||
|
{
|
||||||
|
// delta = shielded outputs - shielded inputs
|
||||||
|
if(!tx.IsCoinBase()) {
|
||||||
|
delta += tx.vShieldedOutput.size() - tx.vShieldedSpend.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return delta;
|
return delta;
|
||||||
}
|
}
|
||||||
@@ -3714,7 +3762,8 @@ UniValue z_anonsettxdelta(const UniValue& params, bool fHelp, const CPubKey& myp
|
|||||||
if (fHelp || params.size() != 1)
|
if (fHelp || params.size() != 1)
|
||||||
throw runtime_error(
|
throw runtime_error(
|
||||||
"z_anonsettxdelta\n"
|
"z_anonsettxdelta\n"
|
||||||
"\nReturns delta (difference) in the anonset for a given txid.\n"
|
"\nReturns delta (difference) in the anonset for a given txid. A delta > 0 increases the anonset,\n"
|
||||||
|
"\na delta < 0 reduces the anonset and a delta=0 leaves the anonset the same.\n"
|
||||||
"\nArguments:\n"
|
"\nArguments:\n"
|
||||||
"1. \"txid\" (string, required) The transaction id\n"
|
"1. \"txid\" (string, required) The transaction id\n"
|
||||||
"\nResult:\n"
|
"\nResult:\n"
|
||||||
|
|||||||
Reference in New Issue
Block a user