Browse Source

Improve zindex to track anonset

pull/63/head
Duke Leto 5 years ago
parent
commit
649fa9fa71
  1. 2
      src/chain.cpp
  2. 20
      src/chain.h
  3. 35
      src/main.cpp
  4. 9
      src/rpc/blockchain.cpp
  5. 1
      src/txdb.cpp

2
src/chain.cpp

@ -1,5 +1,7 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-2014 The Bitcoin Core developers // Copyright (c) 2009-2014 The Bitcoin Core developers
// Copyright (c) 2019-2020 The Hush developers
// Distributed under the MIT software license, see the accompanying // Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or http://www.opensource.org/licenses/mit-license.php.

20
src/chain.h

@ -276,6 +276,9 @@ public:
//! inputs and outputs. //! inputs and outputs.
int64_t nShieldedTx; int64_t nShieldedTx;
//! (memory only) Number of shielded outputs in the block up to and including this block.
int64_t nShieldedOutputs;
//! (memory only) Number of fully shielded transactions. A fully shielded transaction is defined //! (memory only) Number of fully shielded transactions. A fully shielded transaction is defined
//! as a transaction containing JoinSplits and only shielded inputs and outputs, i.e. no transparent //! as a transaction containing JoinSplits and only shielded inputs and outputs, i.e. no transparent
// inputs or outputs: z->z or z->(z,z) or z->(z,z,z,) etc... // inputs or outputs: z->z or z->(z,z) or z->(z,z,z,) etc...
@ -326,6 +329,9 @@ public:
//! inputs and outputs. //! inputs and outputs.
int64_t nChainShieldedTx; int64_t nChainShieldedTx;
//! (memory only) Number of shielded outputs in the chain up to and including this block.
int64_t nChainShieldedOutputs;
//! (memory only) Number of fully shielded transactions. A fully shielded transaction is defined //! (memory only) Number of fully shielded transactions. A fully shielded transaction is defined
//! as a transaction containing JoinSplits and only shielded inputs and outputs, i.e. no transparent //! as a transaction containing JoinSplits and only shielded inputs and outputs, i.e. no transparent
// inputs or outputs: z->z or z->(z,z) or z->(z,z,z,) etc... // inputs or outputs: z->z or z->(z,z) or z->(z,z,z,) etc...
@ -415,22 +421,26 @@ public:
nTx = 0; nTx = 0;
nChainTx = 0; nChainTx = 0;
// Shieldex Index chain stats
nChainPayments = 0; nChainPayments = 0;
nChainShieldedTx = 0; nChainShieldedTx = 0;
nChainShieldingTx = 0; nChainShieldingTx = 0;
nChainDeshieldingTx = 0; nChainDeshieldingTx = 0;
nChainNotarizations = 0; nChainNotarizations = 0;
nChainFullyShieldedTx = 0; nChainFullyShieldedTx = 0;
nChainShieldedOutputs = 0;
nChainShieldedPayments = 0; nChainShieldedPayments = 0;
nChainShieldingPayments = 0; nChainShieldingPayments = 0;
nChainDeshieldingPayments = 0; nChainDeshieldingPayments = 0;
nChainFullyShieldedPayments = 0; nChainFullyShieldedPayments = 0;
// Shieldex Index stats
nPayments = 0; nPayments = 0;
nShieldedTx = 0; nShieldedTx = 0;
nShieldingTx = 0; nShieldingTx = 0;
nNotarizations = 0; nNotarizations = 0;
nDeshieldingTx = 0; nDeshieldingTx = 0;
nShieldedOutputs = 0;
nFullyShieldedTx = 0; nFullyShieldedTx = 0;
nShieldedPayments = 0; nShieldedPayments = 0;
nShieldingPayments = 0; nShieldingPayments = 0;
@ -654,27 +664,21 @@ public:
if ((s.GetType() & SER_DISK) && (nVersion >= SAPLING_VALUE_VERSION)) { if ((s.GetType() & SER_DISK) && (nVersion >= SAPLING_VALUE_VERSION)) {
READWRITE(nSaplingValue); READWRITE(nSaplingValue);
} }
/*
if ( (s.GetType() & SER_DISK) && (is_STAKED(ASSETCHAINS_SYMBOL) != 0) && ASSETCHAINS_NOTARY_PAY[0] != 0 )
{
READWRITE(nNotaryPay);
READWRITE(segid);
}
*/
// These values only serialized when -zindex enabled // These values only serialized when -zindex enabled
// Order is important!
if((s.GetType() & SER_DISK) && fZindex) { if((s.GetType() & SER_DISK) && fZindex) {
READWRITE(nShieldedTx); READWRITE(nShieldedTx);
READWRITE(nShieldingTx); READWRITE(nShieldingTx);
READWRITE(nDeshieldingTx); READWRITE(nDeshieldingTx);
READWRITE(nFullyShieldedTx); READWRITE(nFullyShieldedTx);
READWRITE(nPayments); READWRITE(nPayments);
READWRITE(nNotarizations); READWRITE(nNotarizations);
READWRITE(nShieldedPayments); READWRITE(nShieldedPayments);
READWRITE(nShieldingPayments); READWRITE(nShieldingPayments);
READWRITE(nDeshieldingPayments); READWRITE(nDeshieldingPayments);
READWRITE(nFullyShieldedPayments); READWRITE(nFullyShieldedPayments);
READWRITE(nShieldedOutputs);
} }
} }

35
src/main.cpp

@ -4717,7 +4717,7 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl
CAmount sproutValue = 0; CAmount sproutValue = 0;
CAmount saplingValue = 0; CAmount saplingValue = 0;
bool isShieldedTx = false; bool isShieldedTx = false;
unsigned int nShieldedSpends=0,nShieldedOutputs=0,nPayments=0; unsigned int nShieldedSpends=0,nShieldedOutputs=0,nPayments=0, nShieldedOutputsInBlock=0;
unsigned int nShieldedTx=0,nFullyShieldedTx=0,nDeshieldingTx=0,nShieldingTx=0; unsigned int nShieldedTx=0,nFullyShieldedTx=0,nDeshieldingTx=0,nShieldingTx=0;
unsigned int nShieldedPayments=0,nFullyShieldedPayments=0,nShieldingPayments=0,nDeshieldingPayments=0; unsigned int nShieldedPayments=0,nFullyShieldedPayments=0,nShieldingPayments=0,nDeshieldingPayments=0;
unsigned int nNotarizations=0; unsigned int nNotarizations=0;
@ -4806,6 +4806,9 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl
nPayments += tx.vout.size() > 1 ? tx.vout.size()-1 : tx.vout.size(); nPayments += tx.vout.size() > 1 ? tx.vout.size()-1 : tx.vout.size();
} }
} }
// To calculate the anonset we must track the sum of zouts in every tx, in every block. -- Duke
nShieldedOutputsInBlock += nShieldedOutputs;
pindexNew->nSproutValue = sproutValue; pindexNew->nSproutValue = sproutValue;
pindexNew->nChainSproutValue = boost::none; pindexNew->nChainSproutValue = boost::none;
pindexNew->nSaplingValue = saplingValue; pindexNew->nSaplingValue = saplingValue;
@ -4819,6 +4822,7 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl
if (fZindex) { if (fZindex) {
pindexNew->nPayments = nPayments; pindexNew->nPayments = nPayments;
pindexNew->nShieldedTx = nShieldedTx; pindexNew->nShieldedTx = nShieldedTx;
pindexNew->nShieldedOutputs = nShieldedOutputsInBlock;
pindexNew->nFullyShieldedTx = nFullyShieldedTx; pindexNew->nFullyShieldedTx = nFullyShieldedTx;
pindexNew->nDeshieldingTx = nDeshieldingTx; pindexNew->nDeshieldingTx = nDeshieldingTx;
pindexNew->nShieldingTx = nShieldingTx; pindexNew->nShieldingTx = nShieldingTx;
@ -4842,18 +4846,19 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl
pindex->nChainTx = (pindex->pprev ? pindex->pprev->nChainTx : 0) + pindex->nTx; pindex->nChainTx = (pindex->pprev ? pindex->pprev->nChainTx : 0) + pindex->nTx;
if (fZindex) { if (fZindex) {
//fprintf(stderr,"%s: setting chain zstats\n", __FUNCTION__); if (fZdebug)
pindex->nChainNotarizations = (pindex->pprev ? pindex->pprev->nChainNotarizations : 0) + pindex->nNotarizations; fprintf(stderr,"%s: setting chain zstats with zouts=%d\n", __FUNCTION__, nShieldedOutputs);
pindex->nChainShieldedTx = (pindex->pprev ? pindex->pprev->nChainShieldedTx : 0) + pindex->nShieldedTx; pindex->nChainNotarizations = (pindex->pprev ? pindex->pprev->nChainNotarizations : 0) + pindex->nNotarizations;
pindex->nChainFullyShieldedTx = (pindex->pprev ? pindex->pprev->nChainFullyShieldedTx : 0) + pindex->nFullyShieldedTx; pindex->nChainShieldedTx = (pindex->pprev ? pindex->pprev->nChainShieldedTx : 0) + pindex->nShieldedTx;
pindex->nChainShieldingTx = (pindex->pprev ? pindex->pprev->nChainShieldingTx : 0) + pindex->nShieldingTx; pindex->nChainShieldedOutputs = (pindex->pprev ? pindex->pprev->nChainShieldedOutputs : 0) + pindex->nShieldedOutputs;
pindex->nChainDeshieldingTx = (pindex->pprev ? pindex->pprev->nChainDeshieldingTx : 0) + pindex->nDeshieldingTx; pindex->nChainFullyShieldedTx = (pindex->pprev ? pindex->pprev->nChainFullyShieldedTx : 0) + pindex->nFullyShieldedTx;
pindex->nChainShieldingTx = (pindex->pprev ? pindex->pprev->nChainShieldingTx : 0) + pindex->nShieldingTx;
pindex->nChainPayments = (pindex->pprev ? pindex->pprev->nChainPayments : 0) + pindex->nPayments; pindex->nChainDeshieldingTx = (pindex->pprev ? pindex->pprev->nChainDeshieldingTx : 0) + pindex->nDeshieldingTx;
pindex->nChainShieldedPayments = (pindex->pprev ? pindex->pprev->nChainShieldedPayments : 0) + pindex->nShieldedPayments; pindex->nChainPayments = (pindex->pprev ? pindex->pprev->nChainPayments : 0) + pindex->nPayments;
pindex->nChainShieldedPayments = (pindex->pprev ? pindex->pprev->nChainShieldedPayments : 0) + pindex->nShieldedPayments;
pindex->nChainFullyShieldedPayments = (pindex->pprev ? pindex->pprev->nChainFullyShieldedPayments : 0) + pindex->nFullyShieldedPayments; pindex->nChainFullyShieldedPayments = (pindex->pprev ? pindex->pprev->nChainFullyShieldedPayments : 0) + pindex->nFullyShieldedPayments;
pindex->nChainShieldingPayments = (pindex->pprev ? pindex->pprev->nChainShieldingPayments : 0) + pindex->nShieldingPayments; pindex->nChainShieldingPayments = (pindex->pprev ? pindex->pprev->nChainShieldingPayments : 0) + pindex->nShieldingPayments;
pindex->nChainDeshieldingPayments = (pindex->pprev ? pindex->pprev->nChainDeshieldingPayments : 0) + pindex->nDeshieldingPayments; pindex->nChainDeshieldingPayments = (pindex->pprev ? pindex->pprev->nChainDeshieldingPayments : 0) + pindex->nDeshieldingPayments;
} }
if (pindex->pprev) { if (pindex->pprev) {
@ -4893,7 +4898,8 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl
} }
if (fZindex) if (fZindex)
fprintf(stderr, "ht.%d, ShieldedPayments=%d, ShieldedTx=%d, FullyShieldedTx=%d, ntz=%d\n", pindexNew->GetHeight(), nShieldedPayments, nShieldedTx, nFullyShieldedTx, nNotarizations ); fprintf(stderr, "ht.%d, ShieldedPayments=%d, ShieldedTx=%d, ShieldedOutputs=%d, FullyShieldedTx=%d, ntz=%d\n",
pindexNew->GetHeight(), nShieldedPayments, nShieldedTx, nShieldedOutputs, nFullyShieldedTx, nNotarizations );
return true; return true;
} }
@ -6132,6 +6138,7 @@ bool static LoadBlockIndexDB()
if (fZindex) { if (fZindex) {
pindex->nChainNotarizations = pindex->pprev->nChainNotarizations + pindex->nNotarizations; pindex->nChainNotarizations = pindex->pprev->nChainNotarizations + pindex->nNotarizations;
pindex->nChainShieldedTx = pindex->pprev->nChainShieldedTx + pindex->nShieldedTx; pindex->nChainShieldedTx = pindex->pprev->nChainShieldedTx + pindex->nShieldedTx;
pindex->nChainShieldedOutputs = pindex->pprev->nChainShieldedOutputs + pindex->nShieldedOutputs;
pindex->nChainShieldedPayments = pindex->pprev->nChainShieldedPayments + pindex->nShieldedPayments; pindex->nChainShieldedPayments = pindex->pprev->nChainShieldedPayments + pindex->nShieldedPayments;
pindex->nChainShieldingTx = pindex->pprev->nChainShieldingTx + pindex->nShieldingTx; pindex->nChainShieldingTx = pindex->pprev->nChainShieldingTx + pindex->nShieldingTx;
@ -6159,6 +6166,7 @@ bool static LoadBlockIndexDB()
pindex->nChainPayments = 0; pindex->nChainPayments = 0;
pindex->nChainNotarizations = 0; pindex->nChainNotarizations = 0;
pindex->nChainShieldedTx = 0; pindex->nChainShieldedTx = 0;
pindex->nChainShieldedOutputs = 0;
pindex->nChainFullyShieldedTx = 0; pindex->nChainFullyShieldedTx = 0;
pindex->nChainShieldedPayments = 0; pindex->nChainShieldedPayments = 0;
pindex->nChainShieldingPayments = 0; pindex->nChainShieldingPayments = 0;
@ -6179,6 +6187,7 @@ bool static LoadBlockIndexDB()
pindex->nChainPayments = pindex->nPayments; pindex->nChainPayments = pindex->nPayments;
pindex->nChainNotarizations = pindex->nNotarizations; pindex->nChainNotarizations = pindex->nNotarizations;
pindex->nChainShieldedTx = pindex->nShieldedTx; pindex->nChainShieldedTx = pindex->nShieldedTx;
pindex->nChainShieldedOutputs = pindex->nShieldedOutputs;
pindex->nChainShieldedPayments = pindex->nShieldedPayments; pindex->nChainShieldedPayments = pindex->nShieldedPayments;
pindex->nChainShieldingTx = pindex->nShieldingTx; pindex->nChainShieldingTx = pindex->nShieldingTx;
pindex->nChainShieldingPayments = pindex->nShieldingPayments; pindex->nChainShieldingPayments = pindex->nShieldingPayments;

9
src/rpc/blockchain.cpp

@ -1898,7 +1898,10 @@ UniValue getchaintxstats(const UniValue& params, bool fHelp, const CPubKey& mypk
"{\n" "{\n"
" \"time\": xxxxx, (numeric) The timestamp for the final block in the window in UNIX format.\n" " \"time\": xxxxx, (numeric) The timestamp for the final block in the window in UNIX format.\n"
" \"txcount\": xxxxx, (numeric) The total number of transactions in the chain up to that point.\n" " \"txcount\": xxxxx, (numeric) The total number of transactions in the chain up to that point.\n"
" \"nullifiers\": xxxxx, (numeric) The total number of shielded nullifiers in the chain up to that point.\n"
" \"shielded_txcount\": xxxxx, (numeric) The total number of shielded (containing a zaddr) transactions in the chain up to that point.\n" " \"shielded_txcount\": xxxxx, (numeric) The total number of shielded (containing a zaddr) transactions in the chain up to that point.\n"
" \"shielded_outputs\": xxxxx, (numeric) The total number of shielded outputs in the chain up to that point.\n"
" \"shielded_pool_size\": xxxxx, (numeric) The total number of unspent shielded outputs, i.e. the Shielded Pool or Anonymity Set (anonset).\n"
" \"shielding_txcount\": xxxxx, (numeric) The total number of shielding (containing a zaddr output) transactions in the chain up to that point.\n" " \"shielding_txcount\": xxxxx, (numeric) The total number of shielding (containing a zaddr output) transactions in the chain up to that point.\n"
" \"deshielding_txcount\": xxxxx, (numeric) The total number of deshielding (containing a zaddr input) transactions in the chain up to that point.\n" " \"deshielding_txcount\": xxxxx, (numeric) The total number of deshielding (containing a zaddr input) transactions in the chain up to that point.\n"
" \"fully_shielded_txcount\": xxxxx, (numeric) The total number of z2z, AKA fully-shielded (containing only zaddr inputs+outputs) transactions in the chain up to that point.\n" " \"fully_shielded_txcount\": xxxxx, (numeric) The total number of z2z, AKA fully-shielded (containing only zaddr inputs+outputs) transactions in the chain up to that point.\n"
@ -1997,9 +2000,9 @@ UniValue getchaintxstats(const UniValue& params, bool fHelp, const CPubKey& mypk
ret.pushKV("shielding_payments", (int64_t)pindex->nChainShieldingPayments); ret.pushKV("shielding_payments", (int64_t)pindex->nChainShieldingPayments);
int64_t nullifierCount = pwalletMain->NullifierCount(); int64_t nullifierCount = pwalletMain->NullifierCount();
//TODO: we actually need to have zindex keep track of total number of zouts, including change ret.pushKV("nullifiers", (int64_t)nullifierCount);
// Currently zpayments does not include change and will underestimate actual zpool size ret.pushKV("shielded_pool_size", (int64_t)pindex->nChainShieldedOutputs - nullifierCount);
ret.pushKV("shielded_pool_size", (int64_t)pindex->nChainShieldedPayments - nullifierCount); ret.pushKV("shielded_outputs", (int64_t)pindex->nChainShieldedOutputs);
} }
if (blockcount > 0) { if (blockcount > 0) {

1
src/txdb.cpp

@ -734,6 +734,7 @@ bool CBlockTreeDB::LoadBlockIndexGuts()
pindexNew->nNotaryPay = diskindex.nNotaryPay; pindexNew->nNotaryPay = diskindex.nNotaryPay;
pindexNew->nPayments = diskindex.nPayments; pindexNew->nPayments = diskindex.nPayments;
pindexNew->nShieldedTx = diskindex.nShieldedTx; pindexNew->nShieldedTx = diskindex.nShieldedTx;
pindexNew->nShieldedOutputs = diskindex.nShieldedOutputs;
pindexNew->nShieldedPayments = diskindex.nShieldedPayments; pindexNew->nShieldedPayments = diskindex.nShieldedPayments;
pindexNew->nShieldingTx = diskindex.nShieldingTx; pindexNew->nShieldingTx = diskindex.nShieldingTx;
pindexNew->nShieldingPayments = diskindex.nShieldingPayments; pindexNew->nShieldingPayments = diskindex.nShieldingPayments;

Loading…
Cancel
Save