From 649fa9fa7199a628a27f35945085bf3bea2bb047 Mon Sep 17 00:00:00 2001 From: Duke Leto Date: Wed, 1 Jan 2020 22:45:01 -0500 Subject: [PATCH] Improve zindex to track anonset --- src/chain.cpp | 2 ++ src/chain.h | 20 ++++++++++++-------- src/main.cpp | 35 ++++++++++++++++++++++------------- src/rpc/blockchain.cpp | 9 ++++++--- src/txdb.cpp | 1 + 5 files changed, 43 insertions(+), 24 deletions(-) diff --git a/src/chain.cpp b/src/chain.cpp index 43d893620..f8530056d 100644 --- a/src/chain.cpp +++ b/src/chain.cpp @@ -1,5 +1,7 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin Core developers +// Copyright (c) 2019-2020 The Hush developers + // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. diff --git a/src/chain.h b/src/chain.h index 85d41b47b..03fc75660 100644 --- a/src/chain.h +++ b/src/chain.h @@ -276,6 +276,9 @@ public: //! inputs and outputs. 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 //! 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... @@ -326,6 +329,9 @@ public: //! inputs and outputs. 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 //! 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... @@ -415,22 +421,26 @@ public: nTx = 0; nChainTx = 0; + // Shieldex Index chain stats nChainPayments = 0; nChainShieldedTx = 0; nChainShieldingTx = 0; nChainDeshieldingTx = 0; nChainNotarizations = 0; nChainFullyShieldedTx = 0; + nChainShieldedOutputs = 0; nChainShieldedPayments = 0; nChainShieldingPayments = 0; nChainDeshieldingPayments = 0; nChainFullyShieldedPayments = 0; + // Shieldex Index stats nPayments = 0; nShieldedTx = 0; nShieldingTx = 0; nNotarizations = 0; nDeshieldingTx = 0; + nShieldedOutputs = 0; nFullyShieldedTx = 0; nShieldedPayments = 0; nShieldingPayments = 0; @@ -654,27 +664,21 @@ public: if ((s.GetType() & SER_DISK) && (nVersion >= SAPLING_VALUE_VERSION)) { 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 + // Order is important! if((s.GetType() & SER_DISK) && fZindex) { READWRITE(nShieldedTx); READWRITE(nShieldingTx); READWRITE(nDeshieldingTx); READWRITE(nFullyShieldedTx); - READWRITE(nPayments); READWRITE(nNotarizations); READWRITE(nShieldedPayments); READWRITE(nShieldingPayments); READWRITE(nDeshieldingPayments); READWRITE(nFullyShieldedPayments); + READWRITE(nShieldedOutputs); } } diff --git a/src/main.cpp b/src/main.cpp index 8c0c0fcdd..de8ae124a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4717,7 +4717,7 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl CAmount sproutValue = 0; CAmount saplingValue = 0; 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 nShieldedPayments=0,nFullyShieldedPayments=0,nShieldingPayments=0,nDeshieldingPayments=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(); } } + // To calculate the anonset we must track the sum of zouts in every tx, in every block. -- Duke + nShieldedOutputsInBlock += nShieldedOutputs; + pindexNew->nSproutValue = sproutValue; pindexNew->nChainSproutValue = boost::none; pindexNew->nSaplingValue = saplingValue; @@ -4819,6 +4822,7 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl if (fZindex) { pindexNew->nPayments = nPayments; pindexNew->nShieldedTx = nShieldedTx; + pindexNew->nShieldedOutputs = nShieldedOutputsInBlock; pindexNew->nFullyShieldedTx = nFullyShieldedTx; pindexNew->nDeshieldingTx = nDeshieldingTx; 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; if (fZindex) { - //fprintf(stderr,"%s: setting chain zstats\n", __FUNCTION__); - pindex->nChainNotarizations = (pindex->pprev ? pindex->pprev->nChainNotarizations : 0) + pindex->nNotarizations; - pindex->nChainShieldedTx = (pindex->pprev ? pindex->pprev->nChainShieldedTx : 0) + pindex->nShieldedTx; - pindex->nChainFullyShieldedTx = (pindex->pprev ? pindex->pprev->nChainFullyShieldedTx : 0) + pindex->nFullyShieldedTx; - pindex->nChainShieldingTx = (pindex->pprev ? pindex->pprev->nChainShieldingTx : 0) + pindex->nShieldingTx; - pindex->nChainDeshieldingTx = (pindex->pprev ? pindex->pprev->nChainDeshieldingTx : 0) + pindex->nDeshieldingTx; - - pindex->nChainPayments = (pindex->pprev ? pindex->pprev->nChainPayments : 0) + pindex->nPayments; - pindex->nChainShieldedPayments = (pindex->pprev ? pindex->pprev->nChainShieldedPayments : 0) + pindex->nShieldedPayments; + if (fZdebug) + fprintf(stderr,"%s: setting chain zstats with zouts=%d\n", __FUNCTION__, nShieldedOutputs); + pindex->nChainNotarizations = (pindex->pprev ? pindex->pprev->nChainNotarizations : 0) + pindex->nNotarizations; + pindex->nChainShieldedTx = (pindex->pprev ? pindex->pprev->nChainShieldedTx : 0) + pindex->nShieldedTx; + pindex->nChainShieldedOutputs = (pindex->pprev ? pindex->pprev->nChainShieldedOutputs : 0) + pindex->nShieldedOutputs; + pindex->nChainFullyShieldedTx = (pindex->pprev ? pindex->pprev->nChainFullyShieldedTx : 0) + pindex->nFullyShieldedTx; + pindex->nChainShieldingTx = (pindex->pprev ? pindex->pprev->nChainShieldingTx : 0) + pindex->nShieldingTx; + pindex->nChainDeshieldingTx = (pindex->pprev ? pindex->pprev->nChainDeshieldingTx : 0) + pindex->nDeshieldingTx; + 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->nChainShieldingPayments = (pindex->pprev ? pindex->pprev->nChainShieldingPayments : 0) + pindex->nShieldingPayments; - pindex->nChainDeshieldingPayments = (pindex->pprev ? pindex->pprev->nChainDeshieldingPayments : 0) + pindex->nDeshieldingPayments; + pindex->nChainShieldingPayments = (pindex->pprev ? pindex->pprev->nChainShieldingPayments : 0) + pindex->nShieldingPayments; + pindex->nChainDeshieldingPayments = (pindex->pprev ? pindex->pprev->nChainDeshieldingPayments : 0) + pindex->nDeshieldingPayments; } if (pindex->pprev) { @@ -4893,7 +4898,8 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl } 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; } @@ -6132,6 +6138,7 @@ bool static LoadBlockIndexDB() if (fZindex) { pindex->nChainNotarizations = pindex->pprev->nChainNotarizations + pindex->nNotarizations; pindex->nChainShieldedTx = pindex->pprev->nChainShieldedTx + pindex->nShieldedTx; + pindex->nChainShieldedOutputs = pindex->pprev->nChainShieldedOutputs + pindex->nShieldedOutputs; pindex->nChainShieldedPayments = pindex->pprev->nChainShieldedPayments + pindex->nShieldedPayments; pindex->nChainShieldingTx = pindex->pprev->nChainShieldingTx + pindex->nShieldingTx; @@ -6159,6 +6166,7 @@ bool static LoadBlockIndexDB() pindex->nChainPayments = 0; pindex->nChainNotarizations = 0; pindex->nChainShieldedTx = 0; + pindex->nChainShieldedOutputs = 0; pindex->nChainFullyShieldedTx = 0; pindex->nChainShieldedPayments = 0; pindex->nChainShieldingPayments = 0; @@ -6179,6 +6187,7 @@ bool static LoadBlockIndexDB() pindex->nChainPayments = pindex->nPayments; pindex->nChainNotarizations = pindex->nNotarizations; pindex->nChainShieldedTx = pindex->nShieldedTx; + pindex->nChainShieldedOutputs = pindex->nShieldedOutputs; pindex->nChainShieldedPayments = pindex->nShieldedPayments; pindex->nChainShieldingTx = pindex->nShieldingTx; pindex->nChainShieldingPayments = pindex->nShieldingPayments; diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index f41578c54..0b22255d1 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -1898,7 +1898,10 @@ UniValue getchaintxstats(const UniValue& params, bool fHelp, const CPubKey& mypk "{\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" + " \"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_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" " \"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" @@ -1997,9 +2000,9 @@ UniValue getchaintxstats(const UniValue& params, bool fHelp, const CPubKey& mypk ret.pushKV("shielding_payments", (int64_t)pindex->nChainShieldingPayments); int64_t nullifierCount = pwalletMain->NullifierCount(); - //TODO: we actually need to have zindex keep track of total number of zouts, including change - // Currently zpayments does not include change and will underestimate actual zpool size - ret.pushKV("shielded_pool_size", (int64_t)pindex->nChainShieldedPayments - nullifierCount); + ret.pushKV("nullifiers", (int64_t)nullifierCount); + ret.pushKV("shielded_pool_size", (int64_t)pindex->nChainShieldedOutputs - nullifierCount); + ret.pushKV("shielded_outputs", (int64_t)pindex->nChainShieldedOutputs); } if (blockcount > 0) { diff --git a/src/txdb.cpp b/src/txdb.cpp index 2a0d5c466..b45df4448 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -734,6 +734,7 @@ bool CBlockTreeDB::LoadBlockIndexGuts() pindexNew->nNotaryPay = diskindex.nNotaryPay; pindexNew->nPayments = diskindex.nPayments; pindexNew->nShieldedTx = diskindex.nShieldedTx; + pindexNew->nShieldedOutputs = diskindex.nShieldedOutputs; pindexNew->nShieldedPayments = diskindex.nShieldedPayments; pindexNew->nShieldingTx = diskindex.nShieldingTx; pindexNew->nShieldingPayments = diskindex.nShieldingPayments;