Browse Source

Add support for PopAnchor(.., SPROUT/SAPLING)

pull/4/head
Sean Bowe 6 years ago
parent
commit
c643ff0b51
  1. 28
      src/coins.cpp
  2. 2
      src/coins.h
  3. 2
      src/main.cpp
  4. 14
      src/test/coins_tests.cpp

28
src/coins.cpp

@ -281,13 +281,27 @@ void CCoinsViewCache::AbstractPopAnchor(
}
}
void CCoinsViewCache::PopAnchor(const uint256 &newrt) {
AbstractPopAnchor<ZCIncrementalMerkleTree, CAnchorsSproutMap, CAnchorsSproutCacheEntry>(
newrt,
SPROUT,
cacheSproutAnchors,
hashSproutAnchor
);
void CCoinsViewCache::PopAnchor(const uint256 &newrt, ShieldedType type) {
switch (type) {
case SPROUT:
AbstractPopAnchor<ZCIncrementalMerkleTree, CAnchorsSproutMap, CAnchorsSproutCacheEntry>(
newrt,
SPROUT,
cacheSproutAnchors,
hashSproutAnchor
);
break;
case SAPLING:
AbstractPopAnchor<ZCSaplingIncrementalMerkleTree, CAnchorsSaplingMap, CAnchorsSaplingCacheEntry>(
newrt,
SAPLING,
cacheSaplingAnchors,
hashSaplingAnchor
);
break;
default:
throw std::runtime_error("Unknown shielded type " + type);
}
}
void CCoinsViewCache::SetNullifiers(const CTransaction& tx, bool spent) {

2
src/coins.h

@ -484,7 +484,7 @@ public:
// Removes the current commitment root from mapAnchors and sets
// the new current root.
void PopAnchor(const uint256 &rt);
void PopAnchor(const uint256 &rt, ShieldedType type);
// Marks nullifiers for a given transaction as spent or not.
void SetNullifiers(const CTransaction& tx, bool spent);

2
src/main.cpp

@ -2150,7 +2150,7 @@ bool DisconnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex
}
// set the old best anchor back
view.PopAnchor(blockUndo.old_tree_root);
view.PopAnchor(blockUndo.old_tree_root, SPROUT);
// move best block pointer to prevout block
view.SetBestBlock(pindex->pprev->GetBlockHash());

14
src/test/coins_tests.cpp

@ -344,7 +344,7 @@ BOOST_AUTO_TEST_CASE(anchor_pop_regression_test)
cache1.Flush();
// Remove the anchor
cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root());
cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root(), SPROUT);
cache1.Flush();
// Add the anchor back
@ -374,7 +374,7 @@ BOOST_AUTO_TEST_CASE(anchor_pop_regression_test)
cache1.Flush();
// Remove the anchor, but don't flush yet!
cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root());
cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root(), SPROUT);
{
CCoinsViewCacheTest cache2(&cache1); // Build cache on top
@ -416,7 +416,7 @@ BOOST_AUTO_TEST_CASE(anchor_regression_test)
cache1.PushSproutAnchor(tree);
cache1.Flush();
cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root());
cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root(), SPROUT);
BOOST_CHECK(cache1.GetBestAnchor(SPROUT) == ZCIncrementalMerkleTree::empty_root());
BOOST_CHECK(!cache1.GetSproutAnchorAt(tree.root(), tree));
}
@ -433,7 +433,7 @@ BOOST_AUTO_TEST_CASE(anchor_regression_test)
cache1.PushSproutAnchor(tree);
cache1.Flush();
cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root());
cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root(), SPROUT);
cache1.Flush();
BOOST_CHECK(cache1.GetBestAnchor(SPROUT) == ZCIncrementalMerkleTree::empty_root());
BOOST_CHECK(!cache1.GetSproutAnchorAt(tree.root(), tree));
@ -455,7 +455,7 @@ BOOST_AUTO_TEST_CASE(anchor_regression_test)
// Pop anchor.
CCoinsViewCacheTest cache2(&cache1);
BOOST_CHECK(cache2.GetSproutAnchorAt(tree.root(), tree));
cache2.PopAnchor(ZCIncrementalMerkleTree::empty_root());
cache2.PopAnchor(ZCIncrementalMerkleTree::empty_root(), SPROUT);
cache2.Flush();
}
@ -478,7 +478,7 @@ BOOST_AUTO_TEST_CASE(anchor_regression_test)
{
// Pop anchor.
CCoinsViewCacheTest cache2(&cache1);
cache2.PopAnchor(ZCIncrementalMerkleTree::empty_root());
cache2.PopAnchor(ZCIncrementalMerkleTree::empty_root(), SPROUT);
cache2.Flush();
}
@ -677,7 +677,7 @@ BOOST_AUTO_TEST_CASE(anchors_test)
}
{
cache.PopAnchor(newrt);
cache.PopAnchor(newrt, SPROUT);
ZCIncrementalMerkleTree obtain_tree;
assert(!cache.GetSproutAnchorAt(newrt2, obtain_tree)); // should have been popped off
assert(cache.GetSproutAnchorAt(newrt, obtain_tree));

Loading…
Cancel
Save