optimized findNameForClaim, added test for removalWorkaround
This commit is contained in:
parent
456ac2f562
commit
29c5176a22
2 changed files with 42 additions and 4 deletions
|
@ -44,6 +44,9 @@ void applyPragmas(sqlite::database& db, std::size_t cache)
|
||||||
db << "PRAGMA journal_mode=MEMORY";
|
db << "PRAGMA journal_mode=MEMORY";
|
||||||
db << "PRAGMA temp_store=MEMORY";
|
db << "PRAGMA temp_store=MEMORY";
|
||||||
db << "PRAGMA case_sensitive_like=true";
|
db << "PRAGMA case_sensitive_like=true";
|
||||||
|
|
||||||
|
db.define("POPS", [](std::string s) -> std::string { if (!s.empty()) s.pop_back(); return s; });
|
||||||
|
db.define("REVERSE", [](std::vector<uint8_t> s) -> std::vector<uint8_t> { std::reverse(s.begin(), s.end()); return s; });
|
||||||
}
|
}
|
||||||
|
|
||||||
CClaimTrie::CClaimTrie(std::size_t cacheBytes, bool fWipe, int height,
|
CClaimTrie::CClaimTrie(std::size_t cacheBytes, bool fWipe, int height,
|
||||||
|
@ -460,6 +463,10 @@ bool CClaimTrieCacheBase::validateDb(int height, const uint256& rootHash)
|
||||||
logPrint << "CClaimTrieCacheBase::" << __func__ << "(): the block's root claim hash doesn't match the persisted claim root hash." << Clog::endl;
|
logPrint << "CClaimTrieCacheBase::" << __func__ << "(): the block's root claim hash doesn't match the persisted claim root hash." << Clog::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (nNextHeight > base->nAllClaimsInMerkleForkHeight) // index not used as part of sync:
|
||||||
|
db << "CREATE UNIQUE INDEX IF NOT EXISTS claim_reverseClaimID ON claim (REVERSE(claimID))";
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
logPrint << "inconsistent!" << Clog::endl;
|
logPrint << "inconsistent!" << Clog::endl;
|
||||||
|
@ -511,7 +518,6 @@ CClaimTrieCacheBase::CClaimTrieCacheBase(CClaimTrie* base)
|
||||||
nNextHeight = base->nNextHeight;
|
nNextHeight = base->nNextHeight;
|
||||||
|
|
||||||
applyPragmas(db, base->dbCacheBytes >> 10U); // in KB
|
applyPragmas(db, base->dbCacheBytes >> 10U); // in KB
|
||||||
db.define("POPS", [](std::string s) -> std::string { if (!s.empty()) s.pop_back(); return s; });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CClaimTrieCacheBase::ensureTransacting()
|
void CClaimTrieCacheBase::ensureTransacting()
|
||||||
|
@ -868,10 +874,14 @@ bool CClaimTrieCacheBase::getProofForName(const std::string& name, const uint160
|
||||||
|
|
||||||
bool CClaimTrieCacheBase::findNameForClaim(std::vector<unsigned char> claim, CClaimValue& value, std::string& name) const
|
bool CClaimTrieCacheBase::findNameForClaim(std::vector<unsigned char> claim, CClaimValue& value, std::string& name) const
|
||||||
{
|
{
|
||||||
std::reverse(claim.begin(), claim.end());
|
if (claim.size() > 20)
|
||||||
|
return false;
|
||||||
|
auto maximum = claim;
|
||||||
|
maximum.insert(maximum.end(), 20 - claim.size(), std::numeric_limits<unsigned char>::max());
|
||||||
auto query = db << "SELECT nodeName, claimID, txID, txN, amount, activationHeight, blockHeight "
|
auto query = db << "SELECT nodeName, claimID, txID, txN, amount, activationHeight, blockHeight "
|
||||||
"FROM claim WHERE SUBSTR(claimID, ?1) = ?2 AND activationHeight < ?3 AND expirationHeight >= ?3"
|
"FROM claim WHERE REVERSE(claimID) BETWEEN ?1 AND ?2 "
|
||||||
<< -int(claim.size()) << claim << nNextHeight;
|
"AND activationHeight < ?3 AND expirationHeight >= ?3 LIMIT 2"
|
||||||
|
<< claim << maximum << nNextHeight;
|
||||||
auto hit = false;
|
auto hit = false;
|
||||||
for (auto&& row: query) {
|
for (auto&& row: query) {
|
||||||
if (hit) return false;
|
if (hit) return false;
|
||||||
|
|
|
@ -802,4 +802,32 @@ BOOST_AUTO_TEST_CASE(get_claim_by_id_test_3)
|
||||||
BOOST_CHECK_EQUAL(claimValue.claimId, claimId2);
|
BOOST_CHECK_EQUAL(claimValue.claimId, claimId2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(removal_workaround_functions)
|
||||||
|
{
|
||||||
|
// to hit the removalWorkaround, you must
|
||||||
|
// 1. have all claims of a name removed (but still have children of that claim not removed)
|
||||||
|
// 2.
|
||||||
|
|
||||||
|
ClaimTrieChainFixture fixture;
|
||||||
|
fixture.setRemovalWorkaroundHeight(7, 20);
|
||||||
|
CMutableTransaction tx1a = fixture.MakeClaim(fixture.GetCoinbase(), "a", "a", 3);
|
||||||
|
CMutableTransaction tx1b = fixture.MakeClaim(fixture.GetCoinbase(), "a", "a", 2);
|
||||||
|
CMutableTransaction tx1c = fixture.MakeClaim(fixture.GetCoinbase(), "ack", "ack", 3);
|
||||||
|
CMutableTransaction tx2a = fixture.MakeClaim(fixture.GetCoinbase(), "b", "b", 3);
|
||||||
|
CMutableTransaction tx2b = fixture.MakeClaim(fixture.GetCoinbase(), "b", "b", 2);
|
||||||
|
CMutableTransaction tx2c = fixture.MakeClaim(fixture.GetCoinbase(), "bob", "bob", 3);
|
||||||
|
fixture.IncrementBlocks(3);
|
||||||
|
|
||||||
|
CMutableTransaction tx3a = fixture.MakeUpdate(tx1a, "a", "a", ClaimIdHash(tx1a.GetHash(), 0), 4);
|
||||||
|
CMutableTransaction tx3b = fixture.MakeUpdate(tx1b, "a", "a", ClaimIdHash(tx1b.GetHash(), 0), 5); // trigger a takeover
|
||||||
|
fixture.IncrementBlocks(1);
|
||||||
|
BOOST_CHECK(fixture.is_best_claim("a", tx3a));
|
||||||
|
|
||||||
|
fixture.IncrementBlocks(7);
|
||||||
|
CMutableTransaction tx4a = fixture.MakeUpdate(tx2a, "b", "b", ClaimIdHash(tx2a.GetHash(), 0), 4);
|
||||||
|
CMutableTransaction tx4b = fixture.MakeUpdate(tx2b, "b", "b", ClaimIdHash(tx2b.GetHash(), 0), 5); // trigger a takeover
|
||||||
|
fixture.IncrementBlocks(1);
|
||||||
|
BOOST_CHECK(fixture.is_best_claim("b", tx4b));
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
Loading…
Add table
Reference in a new issue