@ -59,10 +59,7 @@ static CUpdatedBlock latestblock;
*/
double GetDifficulty ( const CBlockIndex * blockindex )
{
if ( blockindex = = nullptr )
{
return 1.0 ;
}
assert ( blockindex ) ;
int nShift = ( blockindex - > nBits > > 24 ) & 0xff ;
double dDiff =
@ -82,15 +79,22 @@ double GetDifficulty(const CBlockIndex* blockindex)
return dDiff ;
}
UniValue blockheaderToJSON ( const CBlockIndex * blockindex )
static int ComputeNextBlockAndDepth ( const CBlockIndex * tip , const CBlockIndex * blockindex , const CBlockIndex * & next )
{
next = tip - > GetAncestor ( blockindex - > nHeight + 1 ) ;
if ( next & & next - > pprev = = blockindex ) {
return tip - > nHeight - blockindex - > nHeight + 1 ;
}
next = nullptr ;
return blockindex = = tip ? 1 : - 1 ;
}
UniValue blockheaderToJSON ( const CBlockIndex * tip , const CBlockIndex * blockindex )
{
AssertLockHeld ( cs_main ) ;
UniValue result ( UniValue : : VOBJ ) ;
result . pushKV ( " hash " , blockindex - > GetBlockHash ( ) . GetHex ( ) ) ;
int confirmations = - 1 ;
// Only report confirmations if the block is on the main chain
if ( chainActive . Contains ( blockindex ) )
confirmations = chainActive . Height ( ) - blockindex - > nHeight + 1 ;
const CBlockIndex * pnext ;
int confirmations = ComputeNextBlockAndDepth ( tip , blockindex , pnext ) ;
result . pushKV ( " confirmations " , confirmations ) ;
result . pushKV ( " height " , blockindex - > nHeight ) ;
result . pushKV ( " version " , blockindex - > nVersion ) ;
@ -106,21 +110,17 @@ UniValue blockheaderToJSON(const CBlockIndex* blockindex)
if ( blockindex - > pprev )
result . pushKV ( " previousblockhash " , blockindex - > pprev - > GetBlockHash ( ) . GetHex ( ) ) ;
CBlockIndex * pnext = chainActive . Next ( blockindex ) ;
if ( pnext )
result . pushKV ( " nextblockhash " , pnext - > GetBlockHash ( ) . GetHex ( ) ) ;
return result ;
}
UniValue blockToJSON ( const CBlock & block , const CBlockIndex * blockindex, bool txDetails )
UniValue blockToJSON ( const CBlock & block , const CBlockIndex * tip, const CBlockIndex * blockindex, bool txDetails )
{
AssertLockHeld ( cs_main ) ;
UniValue result ( UniValue : : VOBJ ) ;
result . pushKV ( " hash " , blockindex - > GetBlockHash ( ) . GetHex ( ) ) ;
int confirmations = - 1 ;
// Only report confirmations if the block is on the main chain
if ( chainActive . Contains ( blockindex ) )
confirmations = chainActive . Height ( ) - blockindex - > nHeight + 1 ;
const CBlockIndex * pnext ;
int confirmations = ComputeNextBlockAndDepth ( tip , blockindex , pnext ) ;
result . pushKV ( " confirmations " , confirmations ) ;
result . pushKV ( " strippedsize " , ( int ) : : GetSerializeSize ( block , PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS ) ) ;
result . pushKV ( " size " , ( int ) : : GetSerializeSize ( block , PROTOCOL_VERSION ) ) ;
@ -152,7 +152,6 @@ UniValue blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool tx
if ( blockindex - > pprev )
result . pushKV ( " previousblockhash " , blockindex - > pprev - > GetBlockHash ( ) . GetHex ( ) ) ;
CBlockIndex * pnext = chainActive . Next ( blockindex ) ;
if ( pnext )
result . pushKV ( " nextblockhash " , pnext - > GetBlockHash ( ) . GetHex ( ) ) ;
return result ;
@ -769,7 +768,7 @@ static UniValue getblockheader(const JSONRPCRequest& request)
return strHex ;
}
return blockheaderToJSON ( pblockindex) ;
return blockheaderToJSON ( chainActive. Tip ( ) , pblockindex) ;
}
static CBlock GetBlockChecked ( const CBlockIndex * pblockindex )
@ -871,7 +870,7 @@ static UniValue getblock(const JSONRPCRequest& request)
return strHex ;
}
return blockToJSON ( block , pblockindex, verbosity > = 2 ) ;
return blockToJSON ( block , chainActive. Tip ( ) , pblockindex, verbosity > = 2 ) ;
}
struct CCoinsStats
@ -1150,7 +1149,7 @@ static UniValue verifychain(const JSONRPCRequest& request)
}
/** Implementation of IsSuperMajority with better feedback */
static UniValue SoftForkMajorityDesc ( int version , CBlockIndex * pindex , const Consensus : : Params & consensusParams )
static UniValue SoftForkMajorityDesc ( int version , const CBlockIndex * pindex , const Consensus : : Params & consensusParams )
{
UniValue rv ( UniValue : : VOBJ ) ;
bool activated = false ;
@ -1170,7 +1169,7 @@ static UniValue SoftForkMajorityDesc(int version, CBlockIndex* pindex, const Con
return rv ;
}
static UniValue SoftForkDesc ( const std : : string & name , int version , CBlockIndex * pindex , const Consensus : : Params & consensusParams )
static UniValue SoftForkDesc ( const std : : string & name , int version , const CBlockIndex * pindex , const Consensus : : Params & consensusParams )
{
UniValue rv ( UniValue : : VOBJ ) ;
rv . pushKV ( " id " , name ) ;
@ -1277,20 +1276,21 @@ UniValue getblockchaininfo(const JSONRPCRequest& request)
LOCK ( cs_main ) ;
const CBlockIndex * tip = chainActive . Tip ( ) ;
UniValue obj ( UniValue : : VOBJ ) ;
obj . pushKV ( " chain " , Params ( ) . NetworkIDString ( ) ) ;
obj . pushKV ( " blocks " , ( int ) chainActive . Height ( ) ) ;
obj . pushKV ( " headers " , pindexBestHeader ? pindexBestHeader - > nHeight : - 1 ) ;
obj . pushKV ( " bestblockhash " , chainAc tive. Ti p( ) - > GetBlockHash ( ) . GetHex ( ) ) ;
obj . pushKV ( " difficulty " , ( double ) GetDifficulty ( chainAc tive. Ti p( ) ) ) ;
obj . pushKV ( " mediantime " , ( int64_t ) chainAc tive. Ti p( ) - > GetMedianTimePast ( ) ) ;
obj . pushKV ( " verificationprogress " , GuessVerificationProgress ( Params ( ) . TxData ( ) , chainAc tive. Ti p( ) ) ) ;
obj . pushKV ( " bestblockhash " , tip- > GetBlockHash ( ) . GetHex ( ) ) ;
obj . pushKV ( " difficulty " , ( double ) GetDifficulty ( tip) ) ;
obj . pushKV ( " mediantime " , ( int64_t ) tip- > GetMedianTimePast ( ) ) ;
obj . pushKV ( " verificationprogress " , GuessVerificationProgress ( Params ( ) . TxData ( ) , tip) ) ;
obj . pushKV ( " initialblockdownload " , IsInitialBlockDownload ( ) ) ;
obj . pushKV ( " chainwork " , chainAc tive. Ti p( ) - > nChainWork . GetHex ( ) ) ;
obj . pushKV ( " chainwork " , tip- > nChainWork . GetHex ( ) ) ;
obj . pushKV ( " size_on_disk " , CalculateCurrentUsage ( ) ) ;
obj . pushKV ( " pruned " , fPruneMode ) ;
if ( fPruneMode ) {
CBlockIndex * block = chainAc tive. Ti p( ) ;
const CBlockIndex * block = tip;
assert ( block ) ;
while ( block - > pprev & & ( block - > pprev - > nStatus & BLOCK_HAVE_DATA ) ) {
block = block - > pprev ;
@ -1307,7 +1307,6 @@ UniValue getblockchaininfo(const JSONRPCRequest& request)
}
const Consensus : : Params & consensusParams = Params ( ) . GetConsensus ( ) ;
CBlockIndex * tip = chainActive . Tip ( ) ;
UniValue softforks ( UniValue : : VARR ) ;
UniValue bip9_softforks ( UniValue : : VOBJ ) ;
softforks . push_back ( SoftForkDesc ( " bip34 " , 2 , tip , consensusParams ) ) ;