fix bug where some new claims aren't written to the ncc trie on disk if they don't change the hash of their node
This commit is contained in:
parent
746ffd13c8
commit
a1fca49174
3 changed files with 23 additions and 5 deletions
|
@ -1884,6 +1884,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
|||
{
|
||||
assert(vvchParams.size() == 2);
|
||||
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||
LogPrintf("%s: Removing %s from the ncc trie. Tx: %s, nOut: %d\n", __func__, name, txin.prevout.hash.GetHex(), txin.prevout.n);
|
||||
if (!trieCache.removeName(name, txin.prevout.hash, txin.prevout.n))
|
||||
LogPrintf("%s: Something went wrong removing the name\n", __func__);
|
||||
}
|
||||
|
@ -1899,6 +1900,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
|||
{
|
||||
assert(vvchParams.size() == 2);
|
||||
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||
LogPrintf("%s: Inserting %s into the ncc trie. Tx: %s, nOut: %d\n", __func__, name, tx.GetHash().GetHex(), i);
|
||||
if (!trieCache.insertName(name, tx.GetHash(), i, txout.nValue, pindex->nHeight))
|
||||
LogPrintf("%s: Something went wrong inserting the name\n", __func__);
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ std::string CNodeValue::ToString()
|
|||
|
||||
bool CNCCTrieNode::insertValue(CNodeValue val, bool * pfChanged)
|
||||
{
|
||||
LogPrintf("%s: Inserting %s:%d (amount: %d) into the ncc trie\n", __func__, val.txhash.ToString(), val.nOut, val.nAmount);
|
||||
bool fChanged = false;
|
||||
|
||||
if (values.empty())
|
||||
|
@ -34,6 +35,7 @@ bool CNCCTrieNode::insertValue(CNodeValue val, bool * pfChanged)
|
|||
|
||||
bool CNCCTrieNode::removeValue(CNodeValue val, bool * pfChanged)
|
||||
{
|
||||
LogPrintf("%s: Removing %s from the ncc trie\n", __func__, val.ToString());
|
||||
bool fChanged = false;
|
||||
|
||||
CNodeValue currentTop = values.front();
|
||||
|
@ -43,7 +45,13 @@ bool CNCCTrieNode::removeValue(CNodeValue val, bool * pfChanged)
|
|||
values.erase(position);
|
||||
else
|
||||
{
|
||||
LogPrintf("CNCCTrieNode::removeValue() : asked to remove a value that doesn't exist");
|
||||
LogPrintf("CNCCTrieNode::removeValue() : asked to remove a value that doesn't exist\n");
|
||||
LogPrintf("CNCCTrieNode::removeValue() : value that doesn't exist: %s.\n", val.ToString());
|
||||
LogPrintf("CNCCTrieNode::removeValue() : values that do exist:\n");
|
||||
for (unsigned int i = 0; i < values.size(); i++)
|
||||
{
|
||||
LogPrintf("%s\n", values[i].ToString());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (!values.empty())
|
||||
|
@ -194,13 +202,15 @@ bool CNCCTrie::update(nodeCacheType& cache, hashMapType& hashes, const uint256&
|
|||
// reverse order (though the order shouldn't ever matter).
|
||||
bool success = true;
|
||||
std::vector<std::string> deletedNames;
|
||||
nodeCacheType changedNodes;
|
||||
for (nodeCacheType::iterator itcache = cache.begin(); itcache != cache.end(); ++itcache)
|
||||
{
|
||||
success = updateName(itcache->first, itcache->second, deletedNames);
|
||||
CNCCTrieNode* pNode;
|
||||
success = updateName(itcache->first, itcache->second, deletedNames, &pNode);
|
||||
if (!success)
|
||||
return false;
|
||||
changedNodes[itcache->first] = pNode;
|
||||
}
|
||||
nodeCacheType changedNodes;
|
||||
for (hashMapType::iterator ithash = hashes.begin(); ithash != hashes.end(); ++ithash)
|
||||
{
|
||||
CNCCTrieNode* pNode;
|
||||
|
@ -214,7 +224,7 @@ bool CNCCTrie::update(nodeCacheType& cache, hashMapType& hashes, const uint256&
|
|||
return true;
|
||||
}
|
||||
|
||||
bool CNCCTrie::updateName(const std::string &name, CNCCTrieNode* updatedNode, std::vector<std::string>& deletedNames)
|
||||
bool CNCCTrie::updateName(const std::string &name, CNCCTrieNode* updatedNode, std::vector<std::string>& deletedNames, CNCCTrieNode** pNodeRet)
|
||||
{
|
||||
CNCCTrieNode* current = &root;
|
||||
for (std::string::const_iterator itname = name.begin(); itname != name.end(); ++itname)
|
||||
|
@ -238,6 +248,7 @@ bool CNCCTrie::updateName(const std::string &name, CNCCTrieNode* updatedNode, st
|
|||
}
|
||||
assert(current != NULL);
|
||||
current->values.swap(updatedNode->values);
|
||||
*pNodeRet = current;
|
||||
for (nodeMapType::iterator itchild = current->children.begin(); itchild != current->children.end();)
|
||||
{
|
||||
nodeMapType::iterator itupdatechild = updatedNode->children.find(itchild->first);
|
||||
|
@ -293,6 +304,7 @@ bool CNCCTrie::updateHash(const std::string& name, uint256& hash, CNCCTrieNode**
|
|||
|
||||
void BatchWriteNode(CLevelDBBatch& batch, const std::string& name, const CNCCTrieNode* pNode)
|
||||
{
|
||||
LogPrintf("%s: Writing %s to disk with %d values\n", __func__, name, pNode->values.size());
|
||||
batch.Write(std::make_pair('n', name), *pNode);
|
||||
}
|
||||
|
||||
|
@ -587,6 +599,10 @@ bool CNCCTrieCache::removeName(const std::string name, uint256 txhash, int nOut)
|
|||
bool fChanged = false;
|
||||
assert(currentNode != NULL);
|
||||
bool success = currentNode->removeValue(CNodeValue(txhash, nOut), &fChanged);
|
||||
if (!success)
|
||||
{
|
||||
LogPrintf("%s: Removing a value was unsuccessful. name = %s, txhash = %s, nOut = %d", __func__, name.c_str(), txhash.GetHex(), nOut);
|
||||
}
|
||||
assert(success);
|
||||
if (fChanged)
|
||||
{
|
||||
|
|
|
@ -134,7 +134,7 @@ public:
|
|||
friend class CNCCTrieCache;
|
||||
private:
|
||||
bool update(nodeCacheType& cache, hashMapType& hashes, const uint256& hashBlock);
|
||||
bool updateName(const std::string& name, CNCCTrieNode* updatedNode, std::vector<std::string>& deletedNames);
|
||||
bool updateName(const std::string& name, CNCCTrieNode* updatedNode, std::vector<std::string>& deletedNames, CNCCTrieNode** pNodeRet);
|
||||
bool updateHash(const std::string& name, uint256& hash, CNCCTrieNode** pNodeRet);
|
||||
bool recursiveNullify(CNCCTrieNode* node, std::string& name, std::vector<std::string>& deletedNames);
|
||||
bool recursiveCheckConsistency(CNCCTrieNode* node);
|
||||
|
|
Loading…
Reference in a new issue