goes through block 664641

This commit is contained in:
Brannon King 2019-11-18 17:34:07 -07:00
parent 37bf897f75
commit ce31ca87a0
3 changed files with 535 additions and 467 deletions

View file

@ -215,7 +215,7 @@ void CClaimTrieCacheBase::ensureTreeStructureIsUpToDate() {
// the plan: update all the claim hashes first // the plan: update all the claim hashes first
std::vector<std::string> names; std::vector<std::string> names;
db << "SELECT name FROM nodes WHERE hash IS NULL ORDER BY LENGTH(name), name" db << "SELECT name FROM nodes WHERE hash IS NULL ORDER BY name"
>> [&names](std::string name) { >> [&names](std::string name) {
names.push_back(std::move(name)); names.push_back(std::move(name));
}; };
@ -226,7 +226,7 @@ void CClaimTrieCacheBase::ensureTreeStructureIsUpToDate() {
// assume parents are not set correctly here: // assume parents are not set correctly here:
auto parentQuery = db << "SELECT name FROM nodes WHERE " auto parentQuery = db << "SELECT name FROM nodes WHERE "
"name IN (WITH RECURSIVE prefix(p) AS (VALUES(?) UNION ALL " "name IN (WITH RECURSIVE prefix(p) AS (VALUES(?) UNION ALL "
"SELECT SUBSTR(p, 1, LENGTH(p)-1) FROM prefix WHERE p != '') SELECT p FROM prefix) " "SELECT POPS(p) FROM prefix WHERE p != '') SELECT p FROM prefix) "
"ORDER BY name DESC LIMIT 1"; "ORDER BY name DESC LIMIT 1";
auto insertQuery = db << "INSERT INTO nodes(name, parent, hash) VALUES(?, ?, NULL) " auto insertQuery = db << "INSERT INTO nodes(name, parent, hash) VALUES(?, ?, NULL) "
@ -486,6 +486,7 @@ bool CClaimTrieCacheBase::flush()
transacting = false; transacting = false;
} }
base->nNextHeight = nNextHeight; base->nNextHeight = nNextHeight;
removalWorkaround.clear();
return true; return true;
} }
@ -534,6 +535,8 @@ CClaimTrieCacheBase::CClaimTrieCacheBase(CClaimTrie* base)
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()) return s; s.pop_back(); return s; });
} }
int CClaimTrieCacheBase::expirationTime() const int CClaimTrieCacheBase::expirationTime() const
@ -634,6 +637,22 @@ bool CClaimTrieCacheBase::addSupport(const std::string& name, const COutPoint& o
if (!db.rows_modified()) if (!db.rows_modified())
return false; return false;
db << "UPDATE nodes SET hash = NULL WHERE name = ?" << nodeName; db << "UPDATE nodes SET hash = NULL WHERE name = ?" << nodeName;
if (nNextHeight < Params().GetConsensus().nMaxTakeoverWorkaroundHeight) {
auto workaroundQuery = db << "SELECT nodeName FROM claims WHERE nodeName LIKE ?1 "
"AND validHeight < ?2 AND expirationHeight >= ?2 ORDER BY nodeName LIMIT 1"
<< nodeName + "%" << nNextHeight;
auto wit = workaroundQuery.begin();
if (wit != workaroundQuery.end()) {
std::string shortestMatch;
*wit >> shortestMatch;
if (shortestMatch != nodeName) {
// set this when there are no more claims on that name and that node still has children
removalWorkaround.insert(nodeName);
}
}
}
return true; return true;
} }
@ -937,6 +956,164 @@ static const boost::container::flat_map<std::pair<int, std::string>, int> takeov
{{653354, "double-giveaway-lpi-class-dates-and"}, 608129}, {{653354, "double-giveaway-lpi-class-dates-and"}, 608129},
{{653354, "linux-on-the-smartphone-in-2019-librem"}, 530426}, {{653354, "linux-on-the-smartphone-in-2019-librem"}, 530426},
{{653524, "celtic-folk-music-full-live-concert-mps"}, 589762}, {{653524, "celtic-folk-music-full-live-concert-mps"}, 589762},
{{653745, "aftermath-of-the-mac"}, 592768},
{{653745, "b-c-a-glock-17-threaded-barrel"}, 592770},
{{653800, "middle-earth-shadow-of-mordor-by"}, 590229},
{{654079, "tomand-jeremy-chirs45"}, 614296},
{{654096, "achamos-carteira-com-grana-olha-o-que"}, 466262},
{{654096, "viagem-bizarra-e-cansativa-ao-nordeste"}, 466263},
{{654096, "tedio-na-tailandia-limpeza-de-area"}, 466265},
{{654425, "schau-bung-2014-in-windischgarsten"}, 654410},
{{654425, "mitternachtseinlage-ball-rk"}, 654410},
{{654425, "zugabe-ball-rk-windischgarsten"}, 654412},
{{654722, "skytrain-in-korea"}, 463145},
{{654722, "luwak-coffee-the-shit-coffee"}, 463155},
{{654722, "puppet-show-in-bangkok-thailand"}, 462812},
{{654722, "kyaito-market-myanmar"}, 462813},
{{654724, "wipeout-zombies-bo3-custom-zombies-1st"}, 589569},
{{654724, "the-street-bo3-custom-zombies"}, 589544},
{{654880, "wwii-airsoft-pow"}, 586968},
{{654880, "dueling-geese-fight-to-the-death"}, 586968},
{{654880, "wwii-airsoft-torgau-raw-footage-part4"}, 586968},
{{655173, "april-2019-q-and-a"}, 554032},
{{655173, "the-meaning-and-reality-of-individual"}, 607892},
{{655173, "steven-pinker-progress-despite"}, 616984},
{{655173, "we-make-stories-out-of-totem-poles"}, 549090},
{{655173, "jamil-jivani-author-of-why-young-men"}, 542035},
{{655173, "commentaries-on-jb-peterson-rebel-wisdom"}, 528898},
{{655173, "auckland-clip-4-on-cain-and-abel"}, 629242},
{{655173, "peterson-vs-zizek-livestream-tickets"}, 545285},
{{655173, "auckland-clip-3-the-dawning-of-the-moral"}, 621154},
{{655173, "religious-belief-and-the-enlightenment"}, 606269},
{{655173, "auckland-lc-highlight-1-the-presumption"}, 565783},
{{655173, "q-a-sir-roger-scruton-dr-jordan-b"}, 544184},
{{655173, "cancellation-polish-national-foundation"}, 562529},
{{655173, "the-coddling-of-the-american-mind-haidt"}, 440185},
{{655173, "02-harris-weinstein-peterson-discussion"}, 430896},
{{655173, "jordan-peterson-threatens-everything-of"}, 519737},
{{655173, "on-claiming-belief-in-god-commentary"}, 581738},
{{655173, "how-to-make-the-world-better-really-with"}, 482317},
{{655173, "quillette-discussion-with-founder-editor"}, 413749},
{{655173, "jb-peterson-on-free-thought-and-speech"}, 462849},
{{655173, "marxism-zizek-peterson-official-video"}, 578453},
{{655173, "patreon-problem-solution-dave-rubin-dr"}, 490394},
{{655173, "next-week-st-louis-salt-lake-city"}, 445933},
{{655173, "conversations-with-john-anderson-jordan"}, 529981},
{{655173, "nz-australia-12-rules-tour-next-2-weeks"}, 518649},
{{655173, "a-call-to-rebellion-for-ontario-legal"}, 285451},
{{655173, "2016-personality-lecture-12"}, 578465},
{{655173, "on-the-vital-necessity-of-free-speech"}, 427404},
{{655173, "2017-01-23-social-justice-freedom-of"}, 578465},
{{655173, "discussion-sam-harris-the-idw-and-the"}, 423332},
{{655173, "march-2018-patreon-q-a"}, 413749},
{{655173, "take-aim-even-badly"}, 490395},
{{655173, "jp-f-wwbgo6a2w"}, 539940},
{{655173, "patreon-account-deletion"}, 503477},
{{655173, "canada-us-europe-tour-august-dec-2018"}, 413749},
{{655173, "leaders-myth-reality-general-stanley"}, 514333},
{{655173, "jp-ifi5kkxig3s"}, 539940},
{{655173, "documentary-a-glitch-in-the-matrix-david"}, 413749},
{{655173, "2017-08-14-patreon-q-and-a"}, 285451},
{{655173, "postmodernism-history-and-diagnosis"}, 285451},
{{655173, "23-minutes-from-maps-of-meaning-the"}, 413749},
{{655173, "milo-forbidden-conversation"}, 578493},
{{655173, "jp-wnjbasba-qw"}, 539940},
{{655173, "uk-12-rules-tour-october-and-november"}, 462849},
{{655173, "2015-maps-of-meaning-10-culture-anomaly"}, 578465},
{{655173, "ayaan-hirsi-ali-islam-mecca-vs-medina"}, 285452},
{{655173, "jp-f9393el2z1i"}, 539940},
{{655173, "campus-indoctrination-the-parasitization"}, 285453},
{{655173, "jp-owgc63khcl8"}, 539940},
{{655173, "the-death-and-resurrection-of-christ-a"}, 413749},
{{655173, "01-harris-weinstein-peterson-discussion"}, 430896},
{{655173, "enlightenment-now-steven-pinker-jb"}, 413749},
{{655173, "the-lindsay-shepherd-affair-update"}, 413749},
{{655173, "jp-g3fwumq5k8i"}, 539940},
{{655173, "jp-evvs3l-abv4"}, 539940},
{{655173, "former-australian-deputy-pm-john"}, 413750},
{{655173, "message-to-my-korean-readers-90-seconds"}, 477424},
{{655173, "jp--0xbomwjkgm"}, 539940},
{{655173, "ben-shapiro-jordan-peterson-and-a-12"}, 413749},
{{655173, "jp-91jwsb7zyhw"}, 539940},
{{655173, "deconstruction-the-lindsay-shepherd"}, 299272},
{{655173, "september-patreon-q-a"}, 285451},
{{655173, "jp-2c3m0tt5kce"}, 539940},
{{655173, "australia-s-john-anderson-dr-jordan-b"}, 413749},
{{655173, "jp-hdrlq7dpiws"}, 539940},
{{655173, "stephen-hicks-postmodernism-reprise"}, 578480},
{{655173, "october-patreon-q-a"}, 285451},
{{655173, "an-animated-intro-to-truth-order-and"}, 413749},
{{655173, "jp-bsh37-x5rny"}, 539940},
{{655173, "january-2019-q-a"}, 503477},
{{655173, "comedians-canaries-and-coalmines"}, 498586},
{{655173, "the-democrats-apology-and-promise"}, 465433},
{{655173, "jp-s4c-jodptn8"}, 539940},
{{655173, "2014-personality-lecture-16-extraversion"}, 578465},
{{655173, "dr-jordan-b-peterson-on-femsplainers"}, 490395},
{{655173, "higher-ed-our-cultural-inflection-point"}, 527291},
{{655173, "archetype-reality-friendship-and"}, 519736},
{{655173, "sir-roger-scruton-dr-jordan-b-peterson"}, 490395},
{{655173, "jp-cf2nqmqifxc"}, 539940},
{{655173, "penguin-uk-12-rules-for-life"}, 413749},
{{655173, "march-2019-q-and-a"}, 537138},
{{655173, "jp-ne5vbomsqjc"}, 539940},
{{655173, "dublin-london-harris-murray-new-usa-12"}, 413749},
{{655173, "12-rules-12-cities-tickets-now-available"}, 413749},
{{655173, "jp-j9j-bvdrgdi"}, 539940},
{{655173, "responsibility-conscience-and-meaning"}, 499123},
{{655173, "04-harris-murray-peterson-discussion"}, 436678},
{{655173, "jp-ayhaz9k008q"}, 539940},
{{655173, "with-jocko-willink-the-catastrophe-of"}, 490395},
{{655173, "interview-with-the-grievance-studies"}, 501296},
{{655173, "russell-brand-jordan-b-peterson-under"}, 413750},
{{655173, "goodbye-to-patreon"}, 496771},
{{655173, "revamped-podcast-announcement-with"}, 540943},
{{655173, "swedes-want-to-know"}, 285453},
{{655173, "auckland-clip-2-the-four-fundamental"}, 607892},
{{655173, "jp-dtirzqmgbdm"}, 539940},
{{655173, "political-correctness-a-force-for-good-a"}, 413750},
{{655173, "sean-plunket-full-interview-new-zealand"}, 597638},
{{655173, "q-a-the-meaning-and-reality-of"}, 616984},
{{655173, "lecture-and-q-a-with-jordan-peterson-the"}, 413749},
{{655173, "2017-personality-07-carl-jung-and-the"}, 578465},
{{655173, "nina-paley-animator-extraordinaire"}, 413750},
{{655173, "truth-as-the-antidote-to-suffering-with"}, 455127},
{{655173, "bishop-barron-word-on-fire"}, 599814},
{{655173, "zizek-vs-peterson-april-19"}, 527291},
{{655173, "revamped-podcast-with-westwood-one"}, 540943},
{{655173, "2016-11-19-university-of-toronto-free"}, 578465},
{{655173, "jp-1emrmtrj5jc"}, 539940},
{{655173, "who-is-joe-rogan-with-jordan-peterson"}, 585578},
{{655173, "who-dares-say-he-believes-in-god"}, 581738},
{{655252, "games-with-live2d"}, 589978},
{{655252, "kaenbyou-rin-live2d"}, 589978},
{{655374, "steam-groups-are-crazy"}, 607590},
{{655379, "asmr-captain-falcon-happily-beats-you-up"}, 644574},
{{655379, "pixel-art-series-5-link-holding-the"}, 442952},
{{655379, "who-can-cross-the-planck-length-the-hero"}, 610830},
{{655379, "ssbb-the-yoshi-grab-release-crash"}, 609747},
{{655379, "tas-captain-falcon-s-bizarre-adventure"}, 442958},
{{655379, "super-smash-bros-in-360-test"}, 442963},
{{655379, "what-if-luigi-was-b-u-f-f"}, 442971},
{{655803, "sun-time-lapse-test-7"}, 610634},
{{655952, "upper-build-complete"}, 591728},
{{656758, "cryptocurrency-awareness-adoption-the"}, 541770},
{{656829, "3d-printing-technologies-comparison"}, 462685},
{{656829, "3d-printing-for-everyone"}, 462685},
{{657052, "tni-punya-ilmu-kanuragan-gaya-baru"}, 657045},
{{657052, "papa-sunimah-nelpon-sri-utami-emon"}, 657045},
{{657274, "rapforlife-4-win"}, 656856},
{{657274, "bizzilion-proof-of-withdrawal"}, 656856},
{{657420, "quick-drawing-prince-tribute-colored"}, 605630},
{{657453, "white-boy-tom-mcdonald-facts"}, 597169},
{{657453, "is-it-ok-to-look-when-you-with-your-girl"}, 610508},
{{657584, "need-for-speed-ryzen-5-1600-gtx-1050-ti"}, 657161},
{{657584, "quantum-break-ryzen-5-1600-gtx-1050-ti-4"}, 657161},
{{657584, "nightcore-legends-never-die"}, 657161},
{{657706, "mtb-enduro-ferragosto-2019-sestri"}, 638904},
{{657706, "warface-free-for-all"}, 638908},
{{657782, "nick-warren-at-loveland-but-not-really"}, 444299},
{{658098, "le-temps-nous-glisse-entre-les-doigts"}, 600099},
}; };
bool CClaimTrieCacheBase::incrementBlock(insertUndoType& insertUndo, claimUndoType& expireUndo, bool CClaimTrieCacheBase::incrementBlock(insertUndoType& insertUndo, claimUndoType& expireUndo,
@ -994,14 +1171,9 @@ bool CClaimTrieCacheBase::incrementBlock(insertUndoType& insertUndo, claimUndoTy
auto getTakeoverQuery = db << "SELECT IFNULL(takeoverHeight, 0), takeoverID FROM nodes WHERE name = ?"; auto getTakeoverQuery = db << "SELECT IFNULL(takeoverHeight, 0), takeoverID FROM nodes WHERE name = ?";
auto hasCandidateQuery = db << "UPDATE nodes SET takeoverHeight = ?, takeoverID = ? WHERE name = ?"; auto hasCandidateQuery = db << "UPDATE nodes SET takeoverHeight = ?, takeoverID = ? WHERE name = ?";
auto noCandidateQuery = db << "UPDATE nodes SET takeoverHeight = NULL, takeoverID = NULL WHERE name = ?"; auto noCandidateQuery = db << "UPDATE nodes SET takeoverHeight = NULL, takeoverID = NULL WHERE name = ?";
auto maxWorkaround = Params().GetConsensus().nMaxTakeoverWorkaroundHeight;
for (const auto& nameWithTakeover : takeovers) { for (const auto& nameWithTakeover : takeovers) {
auto needsActivate = false;
if (nNextHeight >= 496856 && nNextHeight <= 653524) {
auto wit = takeoverWorkarounds.find(std::make_pair(nNextHeight, nameWithTakeover));
needsActivate = wit != takeoverWorkarounds.end();
}
// if somebody activates on this block and they are the new best, then everybody activates on this block // if somebody activates on this block and they are the new best, then everybody activates on this block
CClaimValue candidateValue; CClaimValue candidateValue;
auto hasCandidate = getInfoForName(nameWithTakeover, candidateValue, 1); auto hasCandidate = getInfoForName(nameWithTakeover, candidateValue, 1);
@ -1012,10 +1184,18 @@ bool CClaimTrieCacheBase::incrementBlock(insertUndoType& insertUndo, claimUndoTy
getTakeoverQuery++; // reset it getTakeoverQuery++; // reset it
auto hasBeenSetBefore = existingID != nullptr && !existingID->IsNull(); auto hasBeenSetBefore = existingID != nullptr && !existingID->IsNull();
auto takeoverHappening = needsActivate || !hasCandidate || (hasBeenSetBefore && *existingID != candidateValue.claimId); auto takeoverHappening = !hasCandidate || (hasBeenSetBefore && *existingID != candidateValue.claimId);
if (takeoverHappening && activateAllFor(insertUndo, insertSupportUndo, nameWithTakeover)) if (takeoverHappening && activateAllFor(insertUndo, insertSupportUndo, nameWithTakeover))
hasCandidate = getInfoForName(nameWithTakeover, candidateValue, 1); hasCandidate = getInfoForName(nameWithTakeover, candidateValue, 1);
// This is a super ugly hack to work around bug in old code.
// The bug: un/support a name then update it. This will cause its takeover height to be reset to current.
// This is because the old code with add to the cache without setting block originals when dealing in supports.
if (nNextHeight >= 496856 && nNextHeight < maxWorkaround) {
auto wit = takeoverWorkarounds.find(std::make_pair(nNextHeight, nameWithTakeover));
takeoverHappening |= wit != takeoverWorkarounds.end();
}
LogPrint(BCLog::CLAIMS, "Takeover on %s (%s) at %d, happening: %d, set before: %d\n", nameWithTakeover, HexStr(nameWithTakeover), nNextHeight, takeoverHappening, hasBeenSetBefore); LogPrint(BCLog::CLAIMS, "Takeover on %s (%s) at %d, happening: %d, set before: %d\n", nameWithTakeover, HexStr(nameWithTakeover), nNextHeight, takeoverHappening, hasBeenSetBefore);
if (takeoverHappening || !hasBeenSetBefore) { if (takeoverHappening || !hasBeenSetBefore) {
@ -1132,167 +1312,6 @@ bool CClaimTrieCacheBase::finalizeDecrement(takeoverUndoType& takeoverUndo)
return true; return true;
} }
static const boost::container::flat_set<std::pair<int, std::string>> ownershipWorkaround = {
{ 297706, "firstvideo" },
{ 300045, "whatislbry" },
{ 305742, "mrrobots01e01" },
{ 350299, "gaz" },
{ 426898, "travtest01" },
{ 466336, "network" },
{ 481633, "11111111111111111111" },
{ 538169, "cmd" },
{ 539068, "who13" },
{ 552082, "right" },
{ 557322, "pixelboard" },
{ 562221, "stats331" },
{ 583305, "gauntlet-invade-the-darkness-lvl-1-of" },
{ 584733, "0000001" },
{ 584733, "0000003" },
{ 584733, "0000002" },
{ 588287, "livestream-project-reality-arma-3" },
{ 588308, "fr-let-s-play-software-inc-jay" },
{ 588308, "fr-motorsport-manager-jay-s-racing-5" },
{ 588308, "fr-motorsport-manager-jay-s-racing" },
{ 588318, "fr-hoi-iv-the-great-war-l-empire-2" },
{ 588318, "fr-stellaris-distant-stars-la-pr" },
{ 588318, "fr-stellaris-distant-stars-la-pr-2" },
{ 588318, "fr-crusader-kings-2-la-dynastie-6" },
{ 588318, "fr-jurassic-world-evolution-let-s-play" },
{ 588322, "fr-cold-waters-campagne-asie-2000-2" },
{ 588683, "calling-tech-support-scammers-live-3" },
{ 589013, "lets-play-jackbox-games-5" },
{ 589013, "let-s-play-jackbox-games" },
{ 589534, "let-s-play-the-nightmare-before" },
{ 589538, "kabutothesnake-s-live-ps4-broadcast" },
{ 589538, "back-with-fortnite" },
{ 589554, "no-eas-strong-thunderstorm-advisory" },
{ 589606, "new-super-mario-bros-wii-walkthrough" },
{ 589606, "samurai-warrior-chronicles-hero-rise" },
{ 589630, "ullash" },
{ 589640, "today-s-professionals-2018-winter-3" },
{ 589640, "let-s-run-a-mall-series-6-1-18-no-more" },
{ 589640, "today-s-professionals-2018-winter-4" },
{ 589641, "today-s-professionals-big-brother-6-14" },
{ 589641, "today-s-professionals-2018-winter-14" },
{ 589641, "today-s-professionals-big-brother-6-13" },
{ 589641, "today-s-professionals-big-brother-6-28" },
{ 589641, "today-s-professionals-2018-winter-6" },
{ 589641, "today-s-professionals-big-brother-6-26" },
{ 589641, "today-s-professionals-big-brother-6-27" },
{ 589641, "today-s-professionals-2018-winter-10" },
{ 589641, "today-s-professionals-2018-winter-7" },
{ 589641, "today-s-professionals-big-brother-6-29" },
{ 589760, "bobby-blades" },
{ 589831, "fifa-14-android-astrodude44-vs" },
{ 589849, "gaming-and-drawing-videos-live-stream" },
{ 589849, "gaming-with-silverwolf-live-stream-2" },
{ 589849, "gaming-with-silverwolf-live-stream-3" },
{ 589849, "gaming-with-silverwolf-videos-live" },
{ 589849, "gaming-with-silverwolf-live-stream-4" },
{ 589849, "gaming-with-silverwolf-live-stream-5" },
{ 589851, "gaming-with-silverwolf-live-stream-7" },
{ 589851, "gaming-with-silverwolf-live-stream-6" },
{ 589870, "classic-sonic-games" },
{ 589926, "j-dog7973-s-fortnite-squad" },
{ 589967, "wow-warlords-of-draenor-horde-side" },
{ 590020, "come-chill-with-rekzzey-2" },
{ 590033, "gothsnake-black-ops-ii-game-clip" },
{ 590074, "a-new-stream" },
{ 590075, "a-new-stream" },
{ 590082, "a-new-stream" },
{ 590116, "a-new-stream" },
{ 590178, "father-vs-son-stickfight-stickfight" },
{ 590178, "little-t-playing-subnautica-livestream" },
{ 590179, "my-family-trip-with-my-mom-and-sister" },
{ 590206, "pomskies" },
{ 590223, "dark-souls-iii-soul-level-1-challenge-2" },
{ 590223, "dark-souls-iii-soul-level-1-challenge" },
{ 590223, "dark-souls-iii-soul-level-1-challenge-3" },
{ 590225, "skyrim-special-edition-ps4-platinum-3" },
{ 590225, "skyrim-special-edition-ps4-platinum-4" },
{ 590225, "let-s-play-sniper-elite-4-authentic-2" },
{ 590226, "let-s-play-final-fantasy-the-zodiac-2" },
{ 590226, "let-s-play-final-fantasy-the-zodiac-3" },
{ 590401, "ls-h-ppchen-halloween-stream-vom-31-10" },
{ 591982, "destiny-the-taken-king-gameplay" },
{ 591984, "ghost-recon-wildlands-100-complete-4" },
{ 591986, "uncharted-the-lost-legacy-100-complete" },
{ 593535, "3-smg4-reactions-in-1-gabrieloreacts" },
{ 593550, "speed-runs-community-versus-video" },
{ 593551, "rayman-legends-challenges-app-murphy-s" },
{ 593551, "rayman-legends-challenges-app-the" },
{ 593726, "dmt-psychedelics-death-and-rebirth" },
{ 593726, "flat-earth-and-other-shill-potatoes" },
{ 593726, "why-everyone-s-leaving-youtube" },
{ 595537, "memory-techniques-1-000-people-system" },
{ 595556, "qik-mobile-video-by-paul-clifford" },
{ 595818, "ohare12345-s-live-ps4-broadcast" },
{ 595838, "super-smash-bros-u-3-minute-smash-as" },
{ 595838, "super-smash-bros-u-multi-man-smash-3" },
{ 595838, "super-smash-bros-u-target-blast-3" },
{ 595838, "super-smash-bros-u-donkey-kong-tourney" },
{ 595839, "super-smash-bros-u-super-mario-u-smash" },
{ 595841, "super-smash-bros-u-zelda-smash-series" },
{ 595841, "super-smash-bros-u-tournament-series" },
{ 595841, "super-smash-bros-u-link-tourney-mode-a" },
{ 595841, "super-smash-bros-u-brawl-co-op-event" },
{ 595841, "super-smash-bros-u-link-tourney-mode-b" },
{ 595842, "super-smash-bros-u-3-newcomers-the" },
{ 595844, "super-smash-bros-u-home-run-contest-2" },
{ 596829, "gramy-minecraft" },
{ 596829, "gramy-minecraft-jasmc-pl" },
{ 597635, "5-new-technology-innovations-in-5" },
{ 597658, "borderlands-2-tiny-tina-s-assault-on" },
{ 597658, "let-s-play-borderlands-the-pre-sequel" },
{ 597660, "caveman-world-mountains-of-unga-boonga" },
{ 597787, "playing-hypixel-webcam-and-mic" },
{ 597789, "if-herobrine-played-yandere-simulator" },
{ 597794, "user-registration-system-in-php-mysql" },
{ 597796, "let-s-play-mario-party-luigi-s-engine" },
{ 597796, "let-s-play-mario-party-dk-s-jungle" },
{ 597803, "asphalt-8-gameplay" },
{ 597817, "roblox-phantom-forces-no-audio-just" },
{ 597824, "best-funny-clip" },
{ 597825, "let-s-play-fallout-2-restoration-3" },
{ 597826, "saturday-night-baseball-with-3" },
{ 597826, "saturday-night-baseball-with-6" },
{ 597829, "payeer" },
{ 597831, "dreamtowards" },
{ 597833, "20000" },
{ 597833, "remme" },
{ 597834, "hycon" },
{ 597834, "hearthstone-heroes-of-warcraft-3" },
{ 597837, "15-curiosidades-que-probablemente-ya" },
{ 597893, "elder-scrolls-online-road-to-level-20" },
{ 597894, "elder-scrolls-legends-beta-gameplay" },
{ 597900, "fallout-4-walkthrough" },
{ 597901, "wwe-2k18-with-that-guy-and-tricky" },
{ 597902, "dead-space-walkthroug-wcommentary-part" },
{ 597903, "how-it-feels-to-chew-5-gum-funny" },
{ 597909, "president-obama-apec-press-conference" },
{ 597909, "100-5" },
{ 597910, "eat-the-street" },
{ 597923, "rocket-league-giveaway-3" },
{ 597923, "mortal-kombat-xl-livestream" },
{ 597930, "lets-play-spore-with" },
{ 597931, "lets-play-minecraft-with" },
{ 597932, "for-honor-4" },
{ 597933, "memorize-english-words-scientifically" },
{ 597933, "true-mov" },
{ 597935, "jugando-pokemon-esmeralda-gba" },
{ 597936, "gta-5-livestream-85-92" },
{ 597937, "battlefield-hardline-9-19" },
{ 598070, "mechwarrior-2-soundtrack-clan-jade" },
{ 606424, "@apostrophe" },
{ 615725, "amazonianhunter" },
{ 615726, "amazonianhunter" },
{ 630930, "cli" },
{ 638876, "@ordinary" },
{ 638878, "@ordinary" },
{ 644575, "ratio" },
{ 646584, "calling-tech-support-scammers-live-3" },
};
int CClaimTrieCacheBase::getDelayForName(const std::string& name, const uint160& claimId) const int CClaimTrieCacheBase::getDelayForName(const std::string& name, const uint160& claimId) const
{ {
uint160 winningClaimId; uint160 winningClaimId;
@ -1303,8 +1322,13 @@ int CClaimTrieCacheBase::getDelayForName(const std::string& name, const uint160&
return 0; return 0;
} }
if (nNextHeight <= 646584 && ownershipWorkaround.find(std::make_pair(nNextHeight, name)) != ownershipWorkaround.end()) // NOTE: old code had a bug in it where nodes with no claims but with children would get left in the cache after removal.
// This would cause the getNumBlocksOfContinuousOwnership to return zero (causing incorrect takeover height calc).
auto hit = removalWorkaround.find(name);
if (hit != removalWorkaround.end()) {
removalWorkaround.erase(hit);
return 0; return 0;
}
return found ? std::min((nNextHeight - winningTakeoverHeight) / base->nProportionalDelayFactor, 4032) : 0; return found ? std::min((nNextHeight - winningTakeoverHeight) / base->nProportionalDelayFactor, 4032) : 0;
} }
@ -1321,7 +1345,7 @@ bool CClaimTrieCacheBase::getProofForName(const std::string& name, const uint160
proof = CClaimTrieProof(); proof = CClaimTrieProof();
auto nodeQuery = db << "SELECT name, IFNULL(takeoverHeight, 0) FROM nodes WHERE " auto nodeQuery = db << "SELECT name, IFNULL(takeoverHeight, 0) FROM nodes WHERE "
"name IN (WITH RECURSIVE prefix(p) AS (VALUES(?) UNION ALL " "name IN (WITH RECURSIVE prefix(p) AS (VALUES(?) UNION ALL "
"SELECT SUBSTR(p, 1, LENGTH(p)-1) FROM prefix WHERE p != '') SELECT p FROM prefix) " "SELECT POPS(p) FROM prefix WHERE p != '') SELECT p FROM prefix) "
"ORDER BY name" << name; "ORDER BY name" << name;
for (auto&& row: nodeQuery) { for (auto&& row: nodeQuery) {
CClaimValue claim; CClaimValue claim;

View file

@ -383,6 +383,8 @@ protected:
mutable sqlite::database db; mutable sqlite::database db;
int nNextHeight; // Height of the block that is being worked on, which is int nNextHeight; // Height of the block that is being worked on, which is
bool transacting; bool transacting;
mutable std::unordered_set<std::string> removalWorkaround;
// one greater than the height of the chain's tip // one greater than the height of the chain's tip
mutable sqlite::database_binder claimHashQuery, childHashQuery; mutable sqlite::database_binder claimHashQuery, childHashQuery;

View file

@ -144,27 +144,34 @@ bool CClaimTrieCacheNormalizationFork::normalizeAllNamesInTrieIfNecessary(takeov
// make the new nodes // make the new nodes
db << "INSERT INTO nodes(name) SELECT NORMALIZED(name) AS nn FROM claims WHERE nn != nodeName " db << "INSERT INTO nodes(name) SELECT NORMALIZED(name) AS nn FROM claims WHERE nn != nodeName "
"ON CONFLICT(name) DO UPDATE SET hash = NULL"; "AND validHeight <= ?1 AND expirationHeight > ?1 ON CONFLICT(name) DO UPDATE SET hash = NULL" << nNextHeight;
db << "UPDATE nodes SET hash = NULL WHERE name IN " db << "UPDATE nodes SET hash = NULL WHERE name IN "
"(SELECT NORMALIZED(name) AS nn FROM supports WHERE nn != nodeName)"; "(SELECT NORMALIZED(name) AS nn FROM supports WHERE nn != nodeName "
"AND validHeight <= ?1 AND expirationHeight > ?1)" << nNextHeight;
// update the claims and supports // update the claims and supports
db << "UPDATE claims SET nodeName = NORMALIZED(name)"; db << "UPDATE claims SET nodeName = NORMALIZED(name) WHERE validHeight <= ?1 AND expirationHeight > ?1" << nNextHeight;
db << "UPDATE supports SET nodeName = NORMALIZED(name)"; db << "UPDATE supports SET nodeName = NORMALIZED(name) WHERE validHeight <= ?1 AND expirationHeight > ?1" << nNextHeight;
// remove the old nodes // remove the old nodes
auto query = db << "SELECT name, IFNULL(takeoverHeight, 0), takeoverID FROM nodes " auto query = db << "SELECT name, IFNULL(takeoverHeight, 0), takeoverID FROM nodes WHERE name NOT IN "
"WHERE name NOT IN (SELECT nodeName FROM claims)"; "(SELECT nodeName FROM claims WHERE validHeight <= ?1 AND expirationHeight > ?1)";
for (auto&& row: query) { for (auto&& row: query) {
std::string name; std::string name;
int takeoverHeight; int takeoverHeight;
std::unique_ptr<uint160> takeoverID; std::unique_ptr<uint160> takeoverID;
row >> name >> takeoverHeight >> takeoverID; row >> name >> takeoverHeight >> takeoverID;
if (name.empty()) continue; // preserve our root node if (name.empty()) continue; // preserve our root node
if (takeoverHeight > 0)
takeoverUndo.emplace_back(name, std::make_pair(takeoverHeight, takeoverID ? *takeoverID : uint160())); takeoverUndo.emplace_back(name, std::make_pair(takeoverHeight, takeoverID ? *takeoverID : uint160()));
// we need to let the tree structure method do the actual node delete: // we need to let the tree structure method do the actual node delete:
db << "UPDATE nodes SET hash = NULL WHERE name = ?" << name; db << "UPDATE nodes SET hash = NULL WHERE name = ?" << name;
} }
db << "UPDATE nodes SET hash = NULL WHERE takeoverHeight IS NULL";
// work around a bug in the old implementation:
db << "UPDATE claims SET validHeight = ?1 " // force a takeover on these
"WHERE blockHeight < ?1 AND validHeight > ?1 AND nodeName != name" << nNextHeight;
return true; return true;
} }
@ -177,7 +184,7 @@ bool CClaimTrieCacheNormalizationFork::unnormalizeAllNamesInTrieIfNecessary()
db.define("NORMALIZED", [this](const std::string& str) { return normalizeClaimName(str, true); }); db.define("NORMALIZED", [this](const std::string& str) { return normalizeClaimName(str, true); });
db << "INSERT INTO nodes(name) SELECT name FROM claims WHERE name != nodeName " db << "INSERT INTO nodes(name) SELECT name FROM claims WHERE name != nodeName "
"ON CONFLICT(name) DO UPDATE SET hash = NULL"; "AND validHeight < ?1 AND expirationHeight > ?1 ON CONFLICT(name) DO UPDATE SET hash = NULL" << nNextHeight;
db << "UPDATE nodes SET hash = NULL WHERE name IN " db << "UPDATE nodes SET hash = NULL WHERE name IN "
"(SELECT name FROM supports WHERE name != nodeName UNION " "(SELECT name FROM supports WHERE name != nodeName UNION "
"SELECT nodeName FROM supports WHERE name != nodeName UNION " "SELECT nodeName FROM supports WHERE name != nodeName UNION "
@ -197,7 +204,42 @@ bool CClaimTrieCacheNormalizationFork::incrementBlock(insertUndoType& insertUndo
{ {
if (nNextHeight == Params().GetConsensus().nNormalizedNameForkHeight) if (nNextHeight == Params().GetConsensus().nNormalizedNameForkHeight)
normalizeAllNamesInTrieIfNecessary(takeoverUndo); normalizeAllNamesInTrieIfNecessary(takeoverUndo);
return CClaimTrieCacheExpirationFork::incrementBlock(insertUndo, expireUndo, insertSupportUndo, expireSupportUndo, takeoverUndo); auto ret = CClaimTrieCacheExpirationFork::incrementBlock(insertUndo, expireUndo, insertSupportUndo, expireSupportUndo, takeoverUndo);
// if (nNextHeight == 588319) {
// getMerkleHash();
// auto q2 = db << "SELECT name, nodeName FROM claims WHERE nodeName NOT IN (SELECT name FROM nodes) "
// "AND validHeight < ?1 AND expirationHeight >= ?1" << nNextHeight;
// for (auto&& row: q2) {
// std::string name, nn;
// row >> name >> nn;
// LogPrintf("BAD NAME 2: %s, %s\n", name, nn);
// }
// std::ifstream input("dump588318.txt");
// std::string line;
// std::vector<std::string> lines;
// while (std::getline(input, line)) {
// lines.push_back(line);
// }
// std::sort(lines.begin(), lines.end());
// auto q3 = db << "SELECT n.name, n.hash, IFNULL(n.takeoverHeight, 0), "
// "(SELECT COUNT(*) FROM claims c WHERE c.nodeName = n.name "
// "AND validHeight < ?1 AND expirationHeight >= ?1) as cc FROM nodes n ORDER BY n.name" << nNextHeight;
// for (auto&& row: q3) {
// std::string name; int takeover, childs; uint256 hash;
// row >> name >> hash >> takeover >> childs;
// std::string m = name + ", " + std::to_string(name.size()) + ", " + hash.GetHex() + ", " + std::to_string(takeover) + ", " + std::to_string(childs);
// if (!std::binary_search(lines.begin(), lines.end(), m)) {
// LogPrintf("BAD BAD: %s\n", m);
// }
// }
// auto q4 = db << "SELECT n.name, n.parent FROM nodes n LEFT JOIN claims c ON n.name = c.nodeName LEFT JOIN nodes n2 ON n.name = n2.parent WHERE c.nodeName IS NULL AND n2.parent IS NULL";
// for (auto&& row: q4) {
// std::string name, nn;
// row >> name >> nn;
// LogPrintf("BAD NAME 3: %s, %s\n", name, nn);
// }
// }
return ret;
} }
bool CClaimTrieCacheNormalizationFork::decrementBlock(insertUndoType& insertUndo, claimUndoType& expireUndo, insertUndoType& insertSupportUndo, supportUndoType& expireSupportUndo) bool CClaimTrieCacheNormalizationFork::decrementBlock(insertUndoType& insertUndo, claimUndoType& expireUndo, insertUndoType& insertSupportUndo, supportUndoType& expireSupportUndo)
@ -353,7 +395,7 @@ bool CClaimTrieCacheHashFork::getProofForName(const std::string& name, const uin
proof = CClaimTrieProof(); proof = CClaimTrieProof();
auto nodeQuery = db << "SELECT name, IFNULL(takeoverHeight, 0) FROM nodes WHERE " auto nodeQuery = db << "SELECT name, IFNULL(takeoverHeight, 0) FROM nodes WHERE "
"name IN (WITH RECURSIVE prefix(p) AS (VALUES(?) UNION ALL " "name IN (WITH RECURSIVE prefix(p) AS (VALUES(?) UNION ALL "
"SELECT SUBSTR(p, 1, LENGTH(p)-1) FROM prefix WHERE p != '') SELECT p FROM prefix) " "SELECT POPS(p) FROM prefix WHERE p != '') SELECT p FROM prefix) "
"ORDER BY name" << name; "ORDER BY name" << name;
for (auto&& row: nodeQuery) { for (auto&& row: nodeQuery) {
std::string key;; std::string key;;