@@ -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
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,6 +52,11 @@ void CCoins::CalcMaskSize(unsigned int &nBytes, unsigned int &nNonzeroBytes) con
|
|||||||
nBytes += nLastUsedByte;
|
nBytes += nLastUsedByte;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CNullifiersMap CCoinsViewCache::getNullifiers()
|
||||||
|
{
|
||||||
|
return cacheSaplingNullifiers;
|
||||||
|
}
|
||||||
|
|
||||||
bool CCoins::Spend(uint32_t nPos)
|
bool CCoins::Spend(uint32_t nPos)
|
||||||
{
|
{
|
||||||
if (nPos >= vout.size() || vout[nPos].IsNull())
|
if (nPos >= vout.size() || vout[nPos].IsNull())
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// 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 The Hush 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.
|
||||||
|
|
||||||
@@ -490,8 +490,9 @@ public:
|
|||||||
CCoinsViewCache(CCoinsView *baseIn);
|
CCoinsViewCache(CCoinsView *baseIn);
|
||||||
~CCoinsViewCache();
|
~CCoinsViewCache();
|
||||||
|
|
||||||
|
CNullifiersMap getNullifiers();
|
||||||
|
|
||||||
// Standard CCoinsView methods
|
// Standard CCoinsView methods
|
||||||
//static CLaunchMap &LaunchMap() { return launchMap; }
|
|
||||||
bool GetSproutAnchorAt(const uint256 &rt, SproutMerkleTree &tree) const;
|
bool GetSproutAnchorAt(const uint256 &rt, SproutMerkleTree &tree) const;
|
||||||
bool GetSaplingAnchorAt(const uint256 &rt, SaplingMerkleTree &tree) const;
|
bool GetSaplingAnchorAt(const uint256 &rt, SaplingMerkleTree &tree) const;
|
||||||
bool GetNullifier(const uint256 &nullifier, ShieldedType type) const;
|
bool GetNullifier(const uint256 &nullifier, ShieldedType type) const;
|
||||||
|
|||||||
35
src/main.cpp
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;
|
||||||
@@ -4805,7 +4805,10 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl
|
|||||||
// No shielded payments, add transparent payments minus a change address
|
// No shielded payments, add transparent payments minus a change address
|
||||||
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 blockchain zstats with zouts=%d\n", __FUNCTION__, nShieldedOutputsInBlock );
|
||||||
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;
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -667,6 +667,7 @@ static const CRPCCommand vRPCCommands[] =
|
|||||||
{ "wallet", "z_listoperationids", &z_listoperationids, true },
|
{ "wallet", "z_listoperationids", &z_listoperationids, true },
|
||||||
{ "wallet", "z_getnewaddress", &z_getnewaddress, true },
|
{ "wallet", "z_getnewaddress", &z_getnewaddress, true },
|
||||||
{ "wallet", "z_listaddresses", &z_listaddresses, true },
|
{ "wallet", "z_listaddresses", &z_listaddresses, true },
|
||||||
|
{ "wallet", "z_listnullifiers", &z_listnullifiers, true },
|
||||||
{ "wallet", "z_exportkey", &z_exportkey, true },
|
{ "wallet", "z_exportkey", &z_exportkey, true },
|
||||||
{ "wallet", "z_importkey", &z_importkey, true },
|
{ "wallet", "z_importkey", &z_importkey, true },
|
||||||
{ "wallet", "z_exportviewingkey", &z_exportviewingkey, true },
|
{ "wallet", "z_exportviewingkey", &z_exportviewingkey, true },
|
||||||
|
|||||||
@@ -481,6 +481,7 @@ extern UniValue z_exportviewingkey(const UniValue& params, bool fHelp, const CPu
|
|||||||
extern UniValue z_importviewingkey(const UniValue& params, bool fHelp, const CPubKey& mypk); // in rpcdump.cpp
|
extern UniValue z_importviewingkey(const UniValue& params, bool fHelp, const CPubKey& mypk); // in rpcdump.cpp
|
||||||
extern UniValue z_getnewaddress(const UniValue& params, bool fHelp, const CPubKey& mypk); // in rpcwallet.cpp
|
extern UniValue z_getnewaddress(const UniValue& params, bool fHelp, const CPubKey& mypk); // in rpcwallet.cpp
|
||||||
extern UniValue z_listaddresses(const UniValue& params, bool fHelp, const CPubKey& mypk); // in rpcwallet.cpp
|
extern UniValue z_listaddresses(const UniValue& params, bool fHelp, const CPubKey& mypk); // in rpcwallet.cpp
|
||||||
|
extern UniValue z_listnullifiers(const UniValue& params, bool fHelp, const CPubKey& mypk); // in rpcwallet.cpp
|
||||||
extern UniValue z_exportwallet(const UniValue& params, bool fHelp, const CPubKey& mypk); // in rpcdump.cpp
|
extern UniValue z_exportwallet(const UniValue& params, bool fHelp, const CPubKey& mypk); // in rpcdump.cpp
|
||||||
extern UniValue z_importwallet(const UniValue& params, bool fHelp, const CPubKey& mypk); // in rpcdump.cpp
|
extern UniValue z_importwallet(const UniValue& params, bool fHelp, const CPubKey& mypk); // in rpcdump.cpp
|
||||||
extern UniValue z_listreceivedbyaddress(const UniValue& params, bool fHelp, const CPubKey& mypk); // in rpcwallet.cpp
|
extern UniValue z_listreceivedbyaddress(const UniValue& params, bool fHelp, const CPubKey& mypk); // in rpcwallet.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;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// 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.
|
||||||
|
|
||||||
|
|||||||
@@ -888,6 +888,10 @@ bool CTxMemPool::IsFullyNotified() {
|
|||||||
return nRecentlyAddedSequence == nNotifiedSequence;
|
return nRecentlyAddedSequence == nNotifiedSequence;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::map<uint256, const CTransaction*> CTxMemPool::getNullifiers() {
|
||||||
|
return mapSaplingNullifiers;
|
||||||
|
}
|
||||||
|
|
||||||
CCoinsViewMemPool::CCoinsViewMemPool(CCoinsView *baseIn, CTxMemPool &mempoolIn) : CCoinsViewBacked(baseIn), mempool(mempoolIn) { }
|
CCoinsViewMemPool::CCoinsViewMemPool(CCoinsView *baseIn, CTxMemPool &mempoolIn) : CCoinsViewBacked(baseIn), mempool(mempoolIn) { }
|
||||||
|
|
||||||
bool CCoinsViewMemPool::GetNullifier(const uint256 &nf, ShieldedType type) const
|
bool CCoinsViewMemPool::GetNullifier(const uint256 &nf, ShieldedType type) const
|
||||||
|
|||||||
@@ -201,6 +201,7 @@ public:
|
|||||||
* all inputs are in the mapNextTx array). If sanity-checking is turned off,
|
* all inputs are in the mapNextTx array). If sanity-checking is turned off,
|
||||||
* check does nothing.
|
* check does nothing.
|
||||||
*/
|
*/
|
||||||
|
std::map<uint256, const CTransaction*> getNullifiers();
|
||||||
void check(const CCoinsViewCache *pcoins) const;
|
void check(const CCoinsViewCache *pcoins) const;
|
||||||
void setSanityCheck(double dFrequency = 1.0) { nCheckFrequency = static_cast<uint32_t>(dFrequency * 4294967295.0); }
|
void setSanityCheck(double dFrequency = 1.0) { nCheckFrequency = static_cast<uint32_t>(dFrequency * 4294967295.0); }
|
||||||
|
|
||||||
|
|||||||
@@ -3743,6 +3743,32 @@ UniValue z_getnewaddress(const UniValue& params, bool fHelp, const CPubKey& mypk
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UniValue z_listnullifiers(const UniValue& params, bool fHelp, const CPubKey& mypk)
|
||||||
|
{
|
||||||
|
if (!EnsureWalletIsAvailable(fHelp))
|
||||||
|
return NullUniValue;
|
||||||
|
|
||||||
|
if (fHelp || params.size() > 0)
|
||||||
|
throw runtime_error(
|
||||||
|
"z_listnullifiers\n"
|
||||||
|
"\nReturns the list of Sapling nullifiers.\n"
|
||||||
|
"\nResult:\n"
|
||||||
|
"[ (json array of string)\n"
|
||||||
|
" \"nullifier\" (string) a Sapling nullifer\n"
|
||||||
|
" ,...\n"
|
||||||
|
"]\n"
|
||||||
|
"\nExamples:\n"
|
||||||
|
+ HelpExampleCli("z_listnullifiers", "")
|
||||||
|
+ HelpExampleRpc("z_listnullifiers", "")
|
||||||
|
);
|
||||||
|
|
||||||
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
|
UniValue ret(UniValue::VARR);
|
||||||
|
for (auto nullifier: mempool.getNullifiers()) {
|
||||||
|
ret.push_back(nullifier.first.GetHex());
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
UniValue z_listaddresses(const UniValue& params, bool fHelp, const CPubKey& mypk)
|
UniValue z_listaddresses(const UniValue& params, bool fHelp, const CPubKey& mypk)
|
||||||
{
|
{
|
||||||
@@ -3752,7 +3778,7 @@ UniValue z_listaddresses(const UniValue& params, bool fHelp, const CPubKey& mypk
|
|||||||
if (fHelp || params.size() > 1)
|
if (fHelp || params.size() > 1)
|
||||||
throw runtime_error(
|
throw runtime_error(
|
||||||
"z_listaddresses ( includeWatchonly )\n"
|
"z_listaddresses ( includeWatchonly )\n"
|
||||||
"\nReturns the list of Sprout and Sapling shielded addresses belonging to the wallet.\n"
|
"\nReturns the list of Sapling shielded addresses belonging to the wallet.\n"
|
||||||
"\nArguments:\n"
|
"\nArguments:\n"
|
||||||
"1. includeWatchonly (bool, optional, default=false) Also include watchonly addresses (see 'z_importviewingkey')\n"
|
"1. includeWatchonly (bool, optional, default=false) Also include watchonly addresses (see 'z_importviewingkey')\n"
|
||||||
"\nResult:\n"
|
"\nResult:\n"
|
||||||
@@ -3773,15 +3799,6 @@ UniValue z_listaddresses(const UniValue& params, bool fHelp, const CPubKey& mypk
|
|||||||
}
|
}
|
||||||
|
|
||||||
UniValue ret(UniValue::VARR);
|
UniValue ret(UniValue::VARR);
|
||||||
{
|
|
||||||
std::set<libzcash::SproutPaymentAddress> addresses;
|
|
||||||
pwalletMain->GetSproutPaymentAddresses(addresses);
|
|
||||||
for (auto addr : addresses) {
|
|
||||||
if (fIncludeWatchonly || pwalletMain->HaveSproutSpendingKey(addr)) {
|
|
||||||
ret.push_back(EncodePaymentAddress(addr));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
{
|
{
|
||||||
std::set<libzcash::SaplingPaymentAddress> addresses;
|
std::set<libzcash::SaplingPaymentAddress> addresses;
|
||||||
pwalletMain->GetSaplingPaymentAddresses(addresses);
|
pwalletMain->GetSaplingPaymentAddresses(addresses);
|
||||||
|
|||||||
@@ -613,15 +613,6 @@ std::set<std::pair<libzcash::PaymentAddress, uint256>> CWallet::GetNullifiersFor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (const auto & txPair : mapWallet) {
|
for (const auto & txPair : mapWallet) {
|
||||||
// Sprout
|
|
||||||
for (const auto & noteDataPair : txPair.second.mapSproutNoteData) {
|
|
||||||
auto & noteData = noteDataPair.second;
|
|
||||||
auto & nullifier = noteData.nullifier;
|
|
||||||
auto & address = noteData.address;
|
|
||||||
if (nullifier && addresses.count(address)) {
|
|
||||||
nullifierSet.insert(std::make_pair(address, nullifier.get()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Sapling
|
// Sapling
|
||||||
for (const auto & noteDataPair : txPair.second.mapSaplingNoteData) {
|
for (const auto & noteDataPair : txPair.second.mapSaplingNoteData) {
|
||||||
auto & noteData = noteDataPair.second;
|
auto & noteData = noteDataPair.second;
|
||||||
@@ -960,12 +951,38 @@ void CWallet::AddToSpends(const uint256& wtxid)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::set<uint256> CWallet::GetNullifiers()
|
||||||
|
{
|
||||||
|
std::set<uint256> nullifierSet;
|
||||||
|
for (const auto & txPair : mapWallet) {
|
||||||
|
// Sapling
|
||||||
|
for (const auto & noteDataPair : txPair.second.mapSaplingNoteData) {
|
||||||
|
auto & noteData = noteDataPair.second;
|
||||||
|
auto & nullifier = noteData.nullifier;
|
||||||
|
if (nullifier) {
|
||||||
|
nullifierSet.insert(nullifier.get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullifierSet;
|
||||||
|
}
|
||||||
|
|
||||||
int64_t CWallet::NullifierCount()
|
int64_t CWallet::NullifierCount()
|
||||||
{
|
{
|
||||||
LOCK(cs_wallet);
|
LOCK(cs_wallet);
|
||||||
return mapTxSaplingNullifiers.size();
|
if(fZdebug) {
|
||||||
|
// this is our *local* nullifier count
|
||||||
|
fprintf(stderr,"%s:mapTxSaplingNullifers.size=%d\n",__FUNCTION__,(int)mapTxSaplingNullifiers.size() );
|
||||||
|
// here be dragons
|
||||||
|
fprintf(stderr,"%s:mempool.getNullifiers.size=%d\n",__FUNCTION__,(int)mempool.getNullifiers().size() );
|
||||||
|
// this is the global nullifier count
|
||||||
|
fprintf(stderr,"%s:cacheSaplingNullifiers.size=%d\n",__FUNCTION__,(int)pcoinsTip->getNullifiers().size() );
|
||||||
|
}
|
||||||
|
// TODO: expose local nullifier stats, for now global only
|
||||||
|
return pcoinsTip->getNullifiers().size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CWallet::ClearNoteWitnessCache()
|
void CWallet::ClearNoteWitnessCache()
|
||||||
{
|
{
|
||||||
LOCK(cs_wallet);
|
LOCK(cs_wallet);
|
||||||
|
|||||||
@@ -797,6 +797,7 @@ public:
|
|||||||
void ClearNoteWitnessCache();
|
void ClearNoteWitnessCache();
|
||||||
|
|
||||||
int64_t NullifierCount();
|
int64_t NullifierCount();
|
||||||
|
std::set<uint256> GetNullifiers();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user