diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 4c92979b2..4e6d42a6b 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -533,6 +533,7 @@ Value getblockchaininfo(const Array& params, bool fHelp) " \"difficulty\": xxxxxx, (numeric) the current difficulty\n" " \"verificationprogress\": xxxx, (numeric) estimate of verification progress [0..1]\n" " \"chainwork\": \"xxxx\" (string) total amount of work in active chain, in hexadecimal\n" + " \"commitments\": xxxxxx, (numeric) the current number of note commitments in the commitment tree\n" " \"softforks\": [ (array) status of softforks in progress\n" " {\n" " \"id\": \"xxxx\", (string) name of softfork\n" @@ -564,6 +565,10 @@ Value getblockchaininfo(const Array& params, bool fHelp) obj.push_back(Pair("chainwork", chainActive.Tip()->nChainWork.GetHex())); obj.push_back(Pair("pruned", fPruneMode)); + ZCIncrementalMerkleTree tree; + pcoinsTip->GetAnchorAt(pcoinsTip->GetBestAnchor(), tree); + obj.push_back(Pair("commitments", tree.size())); + const Consensus::Params& consensusParams = Params().GetConsensus(); CBlockIndex* tip = chainActive.Tip(); Array softforks; diff --git a/src/zcash/IncrementalMerkleTree.cpp b/src/zcash/IncrementalMerkleTree.cpp index cf2d00af7..d59e707fa 100644 --- a/src/zcash/IncrementalMerkleTree.cpp +++ b/src/zcash/IncrementalMerkleTree.cpp @@ -81,6 +81,25 @@ Hash IncrementalMerkleTree::last() const { } } +template +size_t IncrementalMerkleTree::size() const { + size_t ret = 0; + if (left) { + ret++; + } + if (right) { + ret++; + } + // Treat occupation of parents array as a binary number + // (right-shifted by 1) + for (size_t i = 0; i < parents.size(); i++) { + if (parents[i]) { + ret += (1 << (i+1)); + } + } + return ret; +} + template void IncrementalMerkleTree::append(Hash obj) { if (is_complete(Depth)) { diff --git a/src/zcash/IncrementalMerkleTree.hpp b/src/zcash/IncrementalMerkleTree.hpp index 6c50192c8..67b356318 100644 --- a/src/zcash/IncrementalMerkleTree.hpp +++ b/src/zcash/IncrementalMerkleTree.hpp @@ -75,6 +75,8 @@ public: parents.size() * 32; // parents } + size_t size() const; + void append(Hash obj); Hash root() const { return root(Depth, std::deque());