desprout
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
// Copyright (c) 2012-2014 The Bitcoin Core developers
|
// Copyright (c) 2012-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.
|
||||||
|
|
||||||
@@ -65,7 +65,6 @@ bool CCoins::Spend(uint32_t nPos)
|
|||||||
Cleanup();
|
Cleanup();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool CCoinsView::GetSproutAnchorAt(const uint256 &rt, SproutMerkleTree &tree) const { return false; }
|
|
||||||
bool CCoinsView::GetSaplingAnchorAt(const uint256 &rt, SaplingMerkleTree &tree) const { return false; }
|
bool CCoinsView::GetSaplingAnchorAt(const uint256 &rt, SaplingMerkleTree &tree) const { return false; }
|
||||||
bool CCoinsView::GetNullifier(const uint256 &nullifier, ShieldedType type) const { return false; }
|
bool CCoinsView::GetNullifier(const uint256 &nullifier, ShieldedType type) const { return false; }
|
||||||
bool CCoinsView::GetCoins(const uint256 &txid, CCoins &coins) const { return false; }
|
bool CCoinsView::GetCoins(const uint256 &txid, CCoins &coins) const { return false; }
|
||||||
@@ -85,7 +84,6 @@ bool CCoinsView::GetStats(CCoinsStats &stats) const { return false; }
|
|||||||
|
|
||||||
CCoinsViewBacked::CCoinsViewBacked(CCoinsView *viewIn) : base(viewIn) { }
|
CCoinsViewBacked::CCoinsViewBacked(CCoinsView *viewIn) : base(viewIn) { }
|
||||||
|
|
||||||
bool CCoinsViewBacked::GetSproutAnchorAt(const uint256 &rt, SproutMerkleTree &tree) const { return base->GetSproutAnchorAt(rt, tree); }
|
|
||||||
bool CCoinsViewBacked::GetSaplingAnchorAt(const uint256 &rt, SaplingMerkleTree &tree) const { return base->GetSaplingAnchorAt(rt, tree); }
|
bool CCoinsViewBacked::GetSaplingAnchorAt(const uint256 &rt, SaplingMerkleTree &tree) const { return base->GetSaplingAnchorAt(rt, tree); }
|
||||||
bool CCoinsViewBacked::GetNullifier(const uint256 &nullifier, ShieldedType type) const { return base->GetNullifier(nullifier, type); }
|
bool CCoinsViewBacked::GetNullifier(const uint256 &nullifier, ShieldedType type) const { return base->GetNullifier(nullifier, type); }
|
||||||
bool CCoinsViewBacked::GetCoins(const uint256 &txid, CCoins &coins) const { return base->GetCoins(txid, coins); }
|
bool CCoinsViewBacked::GetCoins(const uint256 &txid, CCoins &coins) const { return base->GetCoins(txid, coins); }
|
||||||
@@ -139,30 +137,6 @@ CCoinsMap::const_iterator CCoinsViewCache::FetchCoins(const uint256 &txid) const
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool CCoinsViewCache::GetSproutAnchorAt(const uint256 &rt, SproutMerkleTree &tree) const {
|
|
||||||
CAnchorsSproutMap::const_iterator it = cacheSproutAnchors.find(rt);
|
|
||||||
if (it != cacheSproutAnchors.end()) {
|
|
||||||
if (it->second.entered) {
|
|
||||||
tree = it->second.tree;
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!base->GetSproutAnchorAt(rt, tree)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
CAnchorsSproutMap::iterator ret = cacheSproutAnchors.insert(std::make_pair(rt, CAnchorsSproutCacheEntry())).first;
|
|
||||||
ret->second.entered = true;
|
|
||||||
ret->second.tree = tree;
|
|
||||||
cachedCoinsUsage += ret->second.tree.DynamicMemoryUsage();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CCoinsViewCache::GetSaplingAnchorAt(const uint256 &rt, SaplingMerkleTree &tree) const {
|
bool CCoinsViewCache::GetSaplingAnchorAt(const uint256 &rt, SaplingMerkleTree &tree) const {
|
||||||
CAnchorsSaplingMap::const_iterator it = cacheSaplingAnchors.find(rt);
|
CAnchorsSaplingMap::const_iterator it = cacheSaplingAnchors.find(rt);
|
||||||
if (it != cacheSaplingAnchors.end()) {
|
if (it != cacheSaplingAnchors.end()) {
|
||||||
@@ -271,7 +245,6 @@ void CCoinsViewCache::BringBestAnchorIntoCache(
|
|||||||
SproutMerkleTree &tree
|
SproutMerkleTree &tree
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
assert(GetSproutAnchorAt(currentRoot, tree));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
@@ -550,9 +523,9 @@ bool CCoinsViewCache::BatchWrite(CCoinsMap &mapCoins,
|
|||||||
bool CCoinsViewCache::Flush() {
|
bool CCoinsViewCache::Flush() {
|
||||||
bool fOk = base->BatchWrite(cacheCoins, hashBlock, hashSproutAnchor, hashSaplingAnchor, cacheSproutAnchors, cacheSaplingAnchors, cacheSproutNullifiers, cacheSaplingNullifiers);
|
bool fOk = base->BatchWrite(cacheCoins, hashBlock, hashSproutAnchor, hashSaplingAnchor, cacheSproutAnchors, cacheSaplingAnchors, cacheSproutNullifiers, cacheSaplingNullifiers);
|
||||||
cacheCoins.clear();
|
cacheCoins.clear();
|
||||||
cacheSproutAnchors.clear();
|
//cacheSproutAnchors.clear();
|
||||||
cacheSaplingAnchors.clear();
|
cacheSaplingAnchors.clear();
|
||||||
cacheSproutNullifiers.clear();
|
//cacheSproutNullifiers.clear();
|
||||||
cacheSaplingNullifiers.clear();
|
cacheSaplingNullifiers.clear();
|
||||||
cachedCoinsUsage = 0;
|
cachedCoinsUsage = 0;
|
||||||
return fOk;
|
return fOk;
|
||||||
|
|||||||
@@ -372,9 +372,6 @@ struct CCoinsStats
|
|||||||
class CCoinsView
|
class CCoinsView
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//! Retrieve the tree (Sprout) at a particular anchored root in the chain
|
|
||||||
virtual bool GetSproutAnchorAt(const uint256 &rt, SproutMerkleTree &tree) const;
|
|
||||||
|
|
||||||
//! Retrieve the tree (Sapling) at a particular anchored root in the chain
|
//! Retrieve the tree (Sapling) at a particular anchored root in the chain
|
||||||
virtual bool GetSaplingAnchorAt(const uint256 &rt, SaplingMerkleTree &tree) const;
|
virtual bool GetSaplingAnchorAt(const uint256 &rt, SaplingMerkleTree &tree) const;
|
||||||
|
|
||||||
@@ -421,7 +418,6 @@ protected:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
CCoinsViewBacked(CCoinsView *viewIn);
|
CCoinsViewBacked(CCoinsView *viewIn);
|
||||||
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;
|
||||||
bool GetCoins(const uint256 &txid, CCoins &coins) const;
|
bool GetCoins(const uint256 &txid, CCoins &coins) const;
|
||||||
@@ -493,7 +489,6 @@ public:
|
|||||||
CNullifiersMap getNullifiers();
|
CNullifiersMap getNullifiers();
|
||||||
|
|
||||||
// Standard CCoinsView methods
|
// Standard CCoinsView methods
|
||||||
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;
|
||||||
bool GetCoins(const uint256 &txid, CCoins &coins) const;
|
bool GetCoins(const uint256 &txid, CCoins &coins) const;
|
||||||
|
|||||||
12
src/main.cpp
12
src/main.cpp
@@ -3493,13 +3493,13 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
|||||||
|
|
||||||
// This should never fail: we should always be able to get the root
|
// This should never fail: we should always be able to get the root
|
||||||
// that is on the tip of our chain
|
// that is on the tip of our chain
|
||||||
assert(view.GetSproutAnchorAt(old_sprout_tree_root, sprout_tree));
|
//assert(view.GetSproutAnchorAt(old_sprout_tree_root, sprout_tree));
|
||||||
|
|
||||||
{
|
//{
|
||||||
// Consistency check: the root of the tree we're given should
|
// Consistency check: the root of the tree we're given should
|
||||||
// match what we asked for.
|
// match what we asked for.
|
||||||
assert(sprout_tree.root() == old_sprout_tree_root);
|
//assert(sprout_tree.root() == old_sprout_tree_root);
|
||||||
}
|
//}
|
||||||
|
|
||||||
SaplingMerkleTree sapling_tree;
|
SaplingMerkleTree sapling_tree;
|
||||||
assert(view.GetSaplingAnchorAt(view.GetBestAnchor(SAPLING), sapling_tree));
|
assert(view.GetSaplingAnchorAt(view.GetBestAnchor(SAPLING), sapling_tree));
|
||||||
@@ -3636,6 +3636,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
|||||||
}
|
}
|
||||||
UpdateCoins(tx, view, i == 0 ? undoDummy : blockundo.vtxundo.back(), pindex->GetHeight());
|
UpdateCoins(tx, view, i == 0 ? undoDummy : blockundo.vtxundo.back(), pindex->GetHeight());
|
||||||
|
|
||||||
|
/*
|
||||||
BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) {
|
BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) {
|
||||||
BOOST_FOREACH(const uint256 ¬e_commitment, joinsplit.commitments) {
|
BOOST_FOREACH(const uint256 ¬e_commitment, joinsplit.commitments) {
|
||||||
// Insert the note commitments into our temporary tree.
|
// Insert the note commitments into our temporary tree.
|
||||||
@@ -3643,6 +3644,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
|||||||
sprout_tree.append(note_commitment);
|
sprout_tree.append(note_commitment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
BOOST_FOREACH(const OutputDescription &outputDescription, tx.vShieldedOutput) {
|
BOOST_FOREACH(const OutputDescription &outputDescription, tx.vShieldedOutput) {
|
||||||
sapling_tree.append(outputDescription.cm);
|
sapling_tree.append(outputDescription.cm);
|
||||||
@@ -3652,7 +3654,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
|||||||
pos.nTxOffset += ::GetSerializeSize(tx, SER_DISK, CLIENT_VERSION);
|
pos.nTxOffset += ::GetSerializeSize(tx, SER_DISK, CLIENT_VERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
view.PushAnchor(sprout_tree);
|
//view.PushAnchor(sprout_tree);
|
||||||
view.PushAnchor(sapling_tree);
|
view.PushAnchor(sapling_tree);
|
||||||
if (!fJustCheck) {
|
if (!fJustCheck) {
|
||||||
pindex->hashFinalSproutRoot = sprout_tree.root();
|
pindex->hashFinalSproutRoot = sprout_tree.root();
|
||||||
|
|||||||
@@ -1668,9 +1668,10 @@ UniValue getblockchaininfo(const UniValue& params, bool fHelp, const CPubKey& my
|
|||||||
obj.push_back(Pair("chainwork", chainActive.LastTip()->chainPower.chainWork.GetHex()));
|
obj.push_back(Pair("chainwork", chainActive.LastTip()->chainPower.chainWork.GetHex()));
|
||||||
obj.push_back(Pair("pruned", fPruneMode));
|
obj.push_back(Pair("pruned", fPruneMode));
|
||||||
|
|
||||||
SproutMerkleTree tree;
|
//SproutMerkleTree tree;
|
||||||
pcoinsTip->GetSproutAnchorAt(pcoinsTip->GetBestAnchor(SPROUT), tree);
|
//pcoinsTip->GetSproutAnchorAt(pcoinsTip->GetBestAnchor(SPROUT), tree);
|
||||||
obj.push_back(Pair("commitments", static_cast<uint64_t>(tree.size())));
|
//obj.push_back(Pair("commitments", static_cast<uint64_t>(tree.size())));
|
||||||
|
obj.push_back(Pair("commitments", 0));
|
||||||
|
|
||||||
CBlockIndex* tip = chainActive.LastTip();
|
CBlockIndex* tip = chainActive.LastTip();
|
||||||
UniValue valuePools(UniValue::VARR);
|
UniValue valuePools(UniValue::VARR);
|
||||||
|
|||||||
@@ -644,8 +644,9 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const
|
|||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::unordered_map<uint256, SproutMerkleTree, CCoinsKeyHasher> intermediates;
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
boost::unordered_map<uint256, SproutMerkleTree, CCoinsKeyHasher> intermediates;
|
||||||
BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) {
|
BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) {
|
||||||
BOOST_FOREACH(const uint256 &nf, joinsplit.nullifiers) {
|
BOOST_FOREACH(const uint256 &nf, joinsplit.nullifiers) {
|
||||||
assert(!pcoins->GetNullifier(nf, SPROUT));
|
assert(!pcoins->GetNullifier(nf, SPROUT));
|
||||||
@@ -666,6 +667,7 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const
|
|||||||
|
|
||||||
intermediates.insert(std::make_pair(tree.root(), tree));
|
intermediates.insert(std::make_pair(tree.root(), tree));
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
for (const SpendDescription &spendDescription : tx.vShieldedSpend) {
|
for (const SpendDescription &spendDescription : tx.vShieldedSpend) {
|
||||||
SaplingMerkleTree tree;
|
SaplingMerkleTree tree;
|
||||||
|
|
||||||
|
|||||||
@@ -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 https://www.opensource.org/licenses/mit-license.php .
|
// file COPYING or https://www.opensource.org/licenses/mit-license.php .
|
||||||
|
|
||||||
@@ -138,7 +139,8 @@ void ThreadNotifyWallets(CBlockIndex *pindexLastTip)
|
|||||||
while (pindex && pindex != pindexFork) {
|
while (pindex && pindex != pindexFork) {
|
||||||
// Get the Sprout commitment tree as of the start of this block.
|
// Get the Sprout commitment tree as of the start of this block.
|
||||||
SproutMerkleTree oldSproutTree;
|
SproutMerkleTree oldSproutTree;
|
||||||
assert(pcoinsTip->GetSproutAnchorAt(pindex->hashSproutAnchor, oldSproutTree));
|
//TODO: how important is oldSproutTree ?
|
||||||
|
//assert(pcoinsTip->GetSproutAnchorAt(pindex->hashSproutAnchor, oldSproutTree));
|
||||||
|
|
||||||
// Get the Sapling commitment tree as of the start of this block.
|
// Get the Sapling commitment tree as of the start of this block.
|
||||||
// We can get this from the `hashFinalSaplingRoot` of the last block
|
// We can get this from the `hashFinalSaplingRoot` of the last block
|
||||||
|
|||||||
@@ -2334,57 +2334,6 @@ void CWallet::WitnessNoteCommitment(std::vector<uint256> commitments,
|
|||||||
std::vector<boost::optional<SproutWitness>>& witnesses,
|
std::vector<boost::optional<SproutWitness>>& witnesses,
|
||||||
uint256 &final_anchor)
|
uint256 &final_anchor)
|
||||||
{
|
{
|
||||||
witnesses.resize(commitments.size());
|
|
||||||
CBlockIndex* pindex = chainActive.Genesis();
|
|
||||||
SproutMerkleTree tree;
|
|
||||||
|
|
||||||
while (pindex) {
|
|
||||||
CBlock block;
|
|
||||||
ReadBlockFromDisk(block, pindex,1);
|
|
||||||
|
|
||||||
BOOST_FOREACH(const CTransaction& tx, block.vtx)
|
|
||||||
{
|
|
||||||
BOOST_FOREACH(const JSDescription& jsdesc, tx.vjoinsplit)
|
|
||||||
{
|
|
||||||
BOOST_FOREACH(const uint256 ¬e_commitment, jsdesc.commitments)
|
|
||||||
{
|
|
||||||
tree.append(note_commitment);
|
|
||||||
|
|
||||||
BOOST_FOREACH(boost::optional<SproutWitness>& wit, witnesses) {
|
|
||||||
if (wit) {
|
|
||||||
wit->append(note_commitment);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t i = 0;
|
|
||||||
BOOST_FOREACH(uint256& commitment, commitments) {
|
|
||||||
if (note_commitment == commitment) {
|
|
||||||
witnesses.at(i) = tree.witness();
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint256 current_anchor = tree.root();
|
|
||||||
|
|
||||||
// Consistency check: we should be able to find the current tree
|
|
||||||
// in our CCoins view.
|
|
||||||
SproutMerkleTree dummy_tree;
|
|
||||||
assert(pcoinsTip->GetSproutAnchorAt(current_anchor, dummy_tree));
|
|
||||||
|
|
||||||
pindex = chainActive.Next(pindex);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: #93; Select a root via some heuristic.
|
|
||||||
final_anchor = tree.root();
|
|
||||||
|
|
||||||
BOOST_FOREACH(boost::optional<SproutWitness>& wit, witnesses) {
|
|
||||||
if (wit) {
|
|
||||||
assert(final_anchor == wit->root());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2697,11 +2646,11 @@ int CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SproutMerkleTree sproutTree;
|
//SproutMerkleTree sproutTree;
|
||||||
SaplingMerkleTree saplingTree;
|
SaplingMerkleTree saplingTree;
|
||||||
// This should never fail: we should always be able to get the tree
|
// This should never fail: we should always be able to get the tree
|
||||||
// state on the path to the tip of our chain
|
// state on the path to the tip of our chain
|
||||||
assert(pcoinsTip->GetSproutAnchorAt(pindex->hashSproutAnchor, sproutTree));
|
//assert(pcoinsTip->GetSproutAnchorAt(pindex->hashSproutAnchor, sproutTree));
|
||||||
if (pindex->pprev) {
|
if (pindex->pprev) {
|
||||||
if (NetworkUpgradeActive(pindex->pprev->GetHeight(), Params().GetConsensus(), Consensus::UPGRADE_SAPLING)) {
|
if (NetworkUpgradeActive(pindex->pprev->GetHeight(), Params().GetConsensus(), Consensus::UPGRADE_SAPLING)) {
|
||||||
assert(pcoinsTip->GetSaplingAnchorAt(pindex->pprev->hashFinalSaplingRoot, saplingTree));
|
assert(pcoinsTip->GetSaplingAnchorAt(pindex->pprev->hashFinalSaplingRoot, saplingTree));
|
||||||
|
|||||||
Reference in New Issue
Block a user