Auto merge of #2168 - str4d:2164-getblock-anchor, r=daira
Add anchor to output of getblock Closes #2164.
This commit is contained in:
commit
7d9bf65501
|
@ -141,6 +141,9 @@ public:
|
||||||
//! The anchor for the tree state up to the start of this block
|
//! The anchor for the tree state up to the start of this block
|
||||||
uint256 hashAnchor;
|
uint256 hashAnchor;
|
||||||
|
|
||||||
|
//! (memory only) The anchor for the tree state up to the end of this block
|
||||||
|
uint256 hashAnchorEnd;
|
||||||
|
|
||||||
//! block header
|
//! block header
|
||||||
int nVersion;
|
int nVersion;
|
||||||
uint256 hashMerkleRoot;
|
uint256 hashMerkleRoot;
|
||||||
|
@ -167,6 +170,7 @@ public:
|
||||||
nChainTx = 0;
|
nChainTx = 0;
|
||||||
nStatus = 0;
|
nStatus = 0;
|
||||||
hashAnchor = uint256();
|
hashAnchor = uint256();
|
||||||
|
hashAnchorEnd = uint256();
|
||||||
nSequenceId = 0;
|
nSequenceId = 0;
|
||||||
|
|
||||||
nVersion = 0;
|
nVersion = 0;
|
||||||
|
|
21
src/main.cpp
21
src/main.cpp
|
@ -2061,6 +2061,8 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
||||||
// Before the genesis block, there was an empty tree
|
// Before the genesis block, there was an empty tree
|
||||||
ZCIncrementalMerkleTree tree;
|
ZCIncrementalMerkleTree tree;
|
||||||
pindex->hashAnchor = tree.root();
|
pindex->hashAnchor = tree.root();
|
||||||
|
// The genesis block contained no JoinSplits
|
||||||
|
pindex->hashAnchorEnd = pindex->hashAnchor;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -2175,6 +2177,9 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
||||||
}
|
}
|
||||||
|
|
||||||
view.PushAnchor(tree);
|
view.PushAnchor(tree);
|
||||||
|
if (!fJustCheck) {
|
||||||
|
pindex->hashAnchorEnd = tree.root();
|
||||||
|
}
|
||||||
blockundo.old_tree_root = old_tree_root;
|
blockundo.old_tree_root = old_tree_root;
|
||||||
|
|
||||||
int64_t nTime1 = GetTimeMicros(); nTimeConnect += nTime1 - nTimeStart;
|
int64_t nTime1 = GetTimeMicros(); nTimeConnect += nTime1 - nTimeStart;
|
||||||
|
@ -3579,11 +3584,27 @@ bool static LoadBlockIndexDB()
|
||||||
pblocktree->ReadFlag("txindex", fTxIndex);
|
pblocktree->ReadFlag("txindex", fTxIndex);
|
||||||
LogPrintf("%s: transaction index %s\n", __func__, fTxIndex ? "enabled" : "disabled");
|
LogPrintf("%s: transaction index %s\n", __func__, fTxIndex ? "enabled" : "disabled");
|
||||||
|
|
||||||
|
// Fill in-memory data
|
||||||
|
BOOST_FOREACH(const PAIRTYPE(uint256, CBlockIndex*)& item, mapBlockIndex)
|
||||||
|
{
|
||||||
|
CBlockIndex* pindex = item.second;
|
||||||
|
// - This relationship will always be true even if pprev has multiple
|
||||||
|
// children, because hashAnchor is technically a property of pprev,
|
||||||
|
// not its children.
|
||||||
|
// - This will miss chain tips; we handle the best tip below, and other
|
||||||
|
// tips will be handled by ConnectTip during a re-org.
|
||||||
|
if (pindex->pprev) {
|
||||||
|
pindex->pprev->hashAnchorEnd = pindex->hashAnchor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Load pointer to end of best chain
|
// Load pointer to end of best chain
|
||||||
BlockMap::iterator it = mapBlockIndex.find(pcoinsTip->GetBestBlock());
|
BlockMap::iterator it = mapBlockIndex.find(pcoinsTip->GetBestBlock());
|
||||||
if (it == mapBlockIndex.end())
|
if (it == mapBlockIndex.end())
|
||||||
return true;
|
return true;
|
||||||
chainActive.SetTip(it->second);
|
chainActive.SetTip(it->second);
|
||||||
|
// Set hashAnchorEnd for the end of best chain
|
||||||
|
it->second->hashAnchorEnd = pcoinsTip->GetBestAnchor();
|
||||||
|
|
||||||
PruneBlockIndexCandidates();
|
PruneBlockIndexCandidates();
|
||||||
|
|
||||||
|
|
|
@ -131,6 +131,7 @@ UniValue blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool tx
|
||||||
result.push_back(Pair("bits", strprintf("%08x", block.nBits)));
|
result.push_back(Pair("bits", strprintf("%08x", block.nBits)));
|
||||||
result.push_back(Pair("difficulty", GetDifficulty(blockindex)));
|
result.push_back(Pair("difficulty", GetDifficulty(blockindex)));
|
||||||
result.push_back(Pair("chainwork", blockindex->nChainWork.GetHex()));
|
result.push_back(Pair("chainwork", blockindex->nChainWork.GetHex()));
|
||||||
|
result.push_back(Pair("anchor", blockindex->hashAnchorEnd.GetHex()));
|
||||||
|
|
||||||
if (blockindex->pprev)
|
if (blockindex->pprev)
|
||||||
result.push_back(Pair("previousblockhash", blockindex->pprev->GetBlockHash().GetHex()));
|
result.push_back(Pair("previousblockhash", blockindex->pprev->GetBlockHash().GetHex()));
|
||||||
|
|
Loading…
Reference in New Issue