|
|
@ -1711,6 +1711,8 @@ void PartitionCheck(bool (*initialDownloadCheck)(), CCriticalSection& cs, const |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int64_t nTimeCheck = 0; |
|
|
|
|
|
|
|
static int64_t nTimeForks = 0; |
|
|
|
static int64_t nTimeVerify = 0; |
|
|
|
static int64_t nTimeVerify = 0; |
|
|
|
static int64_t nTimeConnect = 0; |
|
|
|
static int64_t nTimeConnect = 0; |
|
|
|
static int64_t nTimeIndex = 0; |
|
|
|
static int64_t nTimeIndex = 0; |
|
|
@ -1721,6 +1723,9 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin |
|
|
|
{ |
|
|
|
{ |
|
|
|
const CChainParams& chainparams = Params(); |
|
|
|
const CChainParams& chainparams = Params(); |
|
|
|
AssertLockHeld(cs_main); |
|
|
|
AssertLockHeld(cs_main); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int64_t nTimeStart = GetTimeMicros(); |
|
|
|
|
|
|
|
|
|
|
|
// Check it again in case a previous version let a bad block in
|
|
|
|
// Check it again in case a previous version let a bad block in
|
|
|
|
if (!CheckBlock(block, state, !fJustCheck, !fJustCheck)) |
|
|
|
if (!CheckBlock(block, state, !fJustCheck, !fJustCheck)) |
|
|
|
return false; |
|
|
|
return false; |
|
|
@ -1746,6 +1751,9 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int64_t nTime1 = GetTimeMicros(); nTimeCheck += nTime1 - nTimeStart; |
|
|
|
|
|
|
|
LogPrint("bench", " - Sanity checks: %.2fms [%.2fs]\n", 0.001 * (nTime1 - nTimeStart), nTimeCheck * 0.000001); |
|
|
|
|
|
|
|
|
|
|
|
// Do not allow blocks that contain transactions which 'overwrite' older transactions,
|
|
|
|
// Do not allow blocks that contain transactions which 'overwrite' older transactions,
|
|
|
|
// unless those are already completely spent.
|
|
|
|
// unless those are already completely spent.
|
|
|
|
// If such overwrites are allowed, coinbases and transactions depending upon those
|
|
|
|
// If such overwrites are allowed, coinbases and transactions depending upon those
|
|
|
@ -1788,11 +1796,13 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin |
|
|
|
flags |= SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY; |
|
|
|
flags |= SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int64_t nTime2 = GetTimeMicros(); nTimeForks += nTime2 - nTime1; |
|
|
|
|
|
|
|
LogPrint("bench", " - Fork checks: %.2fms [%.2fs]\n", 0.001 * (nTime2 - nTime1), nTimeForks * 0.000001); |
|
|
|
|
|
|
|
|
|
|
|
CBlockUndo blockundo; |
|
|
|
CBlockUndo blockundo; |
|
|
|
|
|
|
|
|
|
|
|
CCheckQueueControl<CScriptCheck> control(fScriptChecks && nScriptCheckThreads ? &scriptcheckqueue : NULL); |
|
|
|
CCheckQueueControl<CScriptCheck> control(fScriptChecks && nScriptCheckThreads ? &scriptcheckqueue : NULL); |
|
|
|
|
|
|
|
|
|
|
|
int64_t nTimeStart = GetTimeMicros(); |
|
|
|
|
|
|
|
CAmount nFees = 0; |
|
|
|
CAmount nFees = 0; |
|
|
|
int nInputs = 0; |
|
|
|
int nInputs = 0; |
|
|
|
unsigned int nSigOps = 0; |
|
|
|
unsigned int nSigOps = 0; |
|
|
@ -1845,8 +1855,8 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin |
|
|
|
vPos.push_back(std::make_pair(tx.GetHash(), pos)); |
|
|
|
vPos.push_back(std::make_pair(tx.GetHash(), pos)); |
|
|
|
pos.nTxOffset += ::GetSerializeSize(tx, SER_DISK, CLIENT_VERSION); |
|
|
|
pos.nTxOffset += ::GetSerializeSize(tx, SER_DISK, CLIENT_VERSION); |
|
|
|
} |
|
|
|
} |
|
|
|
int64_t nTime1 = GetTimeMicros(); nTimeConnect += nTime1 - nTimeStart; |
|
|
|
int64_t nTime3 = GetTimeMicros(); nTimeConnect += nTime3 - nTime2; |
|
|
|
LogPrint("bench", " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs]\n", (unsigned)block.vtx.size(), 0.001 * (nTime1 - nTimeStart), 0.001 * (nTime1 - nTimeStart) / block.vtx.size(), nInputs <= 1 ? 0 : 0.001 * (nTime1 - nTimeStart) / (nInputs-1), nTimeConnect * 0.000001); |
|
|
|
LogPrint("bench", " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs]\n", (unsigned)block.vtx.size(), 0.001 * (nTime3 - nTime2), 0.001 * (nTime3 - nTime2) / block.vtx.size(), nInputs <= 1 ? 0 : 0.001 * (nTime3 - nTime2) / (nInputs-1), nTimeConnect * 0.000001); |
|
|
|
|
|
|
|
|
|
|
|
CAmount blockReward = nFees + GetBlockSubsidy(pindex->nHeight, chainparams.GetConsensus()); |
|
|
|
CAmount blockReward = nFees + GetBlockSubsidy(pindex->nHeight, chainparams.GetConsensus()); |
|
|
|
if (block.vtx[0].GetValueOut() > blockReward) |
|
|
|
if (block.vtx[0].GetValueOut() > blockReward) |
|
|
@ -1857,8 +1867,8 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin |
|
|
|
|
|
|
|
|
|
|
|
if (!control.Wait()) |
|
|
|
if (!control.Wait()) |
|
|
|
return state.DoS(100, false); |
|
|
|
return state.DoS(100, false); |
|
|
|
int64_t nTime2 = GetTimeMicros(); nTimeVerify += nTime2 - nTimeStart; |
|
|
|
int64_t nTime4 = GetTimeMicros(); nTimeVerify += nTime4 - nTime2; |
|
|
|
LogPrint("bench", " - Verify %u txins: %.2fms (%.3fms/txin) [%.2fs]\n", nInputs - 1, 0.001 * (nTime2 - nTimeStart), nInputs <= 1 ? 0 : 0.001 * (nTime2 - nTimeStart) / (nInputs-1), nTimeVerify * 0.000001); |
|
|
|
LogPrint("bench", " - Verify %u txins: %.2fms (%.3fms/txin) [%.2fs]\n", nInputs - 1, 0.001 * (nTime4 - nTime2), nInputs <= 1 ? 0 : 0.001 * (nTime4 - nTime2) / (nInputs-1), nTimeVerify * 0.000001); |
|
|
|
|
|
|
|
|
|
|
|
if (fJustCheck) |
|
|
|
if (fJustCheck) |
|
|
|
return true; |
|
|
|
return true; |
|
|
@ -1889,16 +1899,16 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin |
|
|
|
// add this block to the view's block chain
|
|
|
|
// add this block to the view's block chain
|
|
|
|
view.SetBestBlock(pindex->GetBlockHash()); |
|
|
|
view.SetBestBlock(pindex->GetBlockHash()); |
|
|
|
|
|
|
|
|
|
|
|
int64_t nTime3 = GetTimeMicros(); nTimeIndex += nTime3 - nTime2; |
|
|
|
int64_t nTime5 = GetTimeMicros(); nTimeIndex += nTime5 - nTime4; |
|
|
|
LogPrint("bench", " - Index writing: %.2fms [%.2fs]\n", 0.001 * (nTime3 - nTime2), nTimeIndex * 0.000001); |
|
|
|
LogPrint("bench", " - Index writing: %.2fms [%.2fs]\n", 0.001 * (nTime5 - nTime4), nTimeIndex * 0.000001); |
|
|
|
|
|
|
|
|
|
|
|
// Watch for changes to the previous coinbase transaction.
|
|
|
|
// Watch for changes to the previous coinbase transaction.
|
|
|
|
static uint256 hashPrevBestCoinBase; |
|
|
|
static uint256 hashPrevBestCoinBase; |
|
|
|
GetMainSignals().UpdatedTransaction(hashPrevBestCoinBase); |
|
|
|
GetMainSignals().UpdatedTransaction(hashPrevBestCoinBase); |
|
|
|
hashPrevBestCoinBase = block.vtx[0].GetHash(); |
|
|
|
hashPrevBestCoinBase = block.vtx[0].GetHash(); |
|
|
|
|
|
|
|
|
|
|
|
int64_t nTime4 = GetTimeMicros(); nTimeCallbacks += nTime4 - nTime3; |
|
|
|
int64_t nTime6 = GetTimeMicros(); nTimeCallbacks += nTime6 - nTime5; |
|
|
|
LogPrint("bench", " - Callbacks: %.2fms [%.2fs]\n", 0.001 * (nTime4 - nTime3), nTimeCallbacks * 0.000001); |
|
|
|
LogPrint("bench", " - Callbacks: %.2fms [%.2fs]\n", 0.001 * (nTime6 - nTime5), nTimeCallbacks * 0.000001); |
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|