|
|
@ -51,6 +51,9 @@ |
|
|
|
# error "Bitcoin cannot be compiled without assertions." |
|
|
|
# error "Bitcoin cannot be compiled without assertions." |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define MICRO 0.000001 |
|
|
|
|
|
|
|
#define MILLI 0.001 |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Global state |
|
|
|
* Global state |
|
|
|
*/ |
|
|
|
*/ |
|
|
@ -1552,7 +1555,7 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int64_t nTime1 = GetTimeMicros(); nTimeCheck += nTime1 - nTimeStart; |
|
|
|
int64_t nTime1 = GetTimeMicros(); nTimeCheck += nTime1 - nTimeStart; |
|
|
|
LogPrint(BCLog::BENCH, " - Sanity checks: %.2fms [%.2fs (%.2fms/blk)]\n", 0.001 * (nTime1 - nTimeStart), nTimeCheck * 0.000001, nTimeCheck * 0.001 / nBlocksTotal); |
|
|
|
LogPrint(BCLog::BENCH, " - Sanity checks: %.2fms [%.2fs (%.2fms/blk)]\n", MILLI * (nTime1 - nTimeStart), nTimeCheck * MICRO, nTimeCheck * MILLI / nBlocksTotal); |
|
|
|
|
|
|
|
|
|
|
|
// 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.
|
|
|
@ -1619,7 +1622,7 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int64_t nTime2 = GetTimeMicros(); nTimeForks += nTime2 - nTime1; |
|
|
|
int64_t nTime2 = GetTimeMicros(); nTimeForks += nTime2 - nTime1; |
|
|
|
LogPrint(BCLog::BENCH, " - Fork checks: %.2fms [%.2fs (%.2fms/blk)]\n", 0.001 * (nTime2 - nTime1), nTimeForks * 0.000001, nTimeForks * 0.001 / nBlocksTotal); |
|
|
|
LogPrint(BCLog::BENCH, " - Fork checks: %.2fms [%.2fs (%.2fms/blk)]\n", MILLI * (nTime2 - nTime1), nTimeForks * MICRO, nTimeForks * MILLI / nBlocksTotal); |
|
|
|
|
|
|
|
|
|
|
|
CBlockUndo blockundo; |
|
|
|
CBlockUndo blockundo; |
|
|
|
|
|
|
|
|
|
|
@ -1693,7 +1696,7 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd |
|
|
|
pos.nTxOffset += ::GetSerializeSize(tx, SER_DISK, CLIENT_VERSION); |
|
|
|
pos.nTxOffset += ::GetSerializeSize(tx, SER_DISK, CLIENT_VERSION); |
|
|
|
} |
|
|
|
} |
|
|
|
int64_t nTime3 = GetTimeMicros(); nTimeConnect += nTime3 - nTime2; |
|
|
|
int64_t nTime3 = GetTimeMicros(); nTimeConnect += nTime3 - nTime2; |
|
|
|
LogPrint(BCLog::BENCH, " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs (%.2fms/blk)]\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, nTimeConnect * 0.001 / nBlocksTotal); |
|
|
|
LogPrint(BCLog::BENCH, " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs (%.2fms/blk)]\n", (unsigned)block.vtx.size(), MILLI * (nTime3 - nTime2), MILLI * (nTime3 - nTime2) / block.vtx.size(), nInputs <= 1 ? 0 : MILLI * (nTime3 - nTime2) / (nInputs-1), nTimeConnect * MICRO, nTimeConnect * MILLI / nBlocksTotal); |
|
|
|
|
|
|
|
|
|
|
|
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) |
|
|
@ -1705,7 +1708,7 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd |
|
|
|
if (!control.Wait()) |
|
|
|
if (!control.Wait()) |
|
|
|
return state.DoS(100, error("%s: CheckQueue failed", __func__), REJECT_INVALID, "block-validation-failed"); |
|
|
|
return state.DoS(100, error("%s: CheckQueue failed", __func__), REJECT_INVALID, "block-validation-failed"); |
|
|
|
int64_t nTime4 = GetTimeMicros(); nTimeVerify += nTime4 - nTime2; |
|
|
|
int64_t nTime4 = GetTimeMicros(); nTimeVerify += nTime4 - nTime2; |
|
|
|
LogPrint(BCLog::BENCH, " - Verify %u txins: %.2fms (%.3fms/txin) [%.2fs (%.2fms/blk)]\n", nInputs - 1, 0.001 * (nTime4 - nTime2), nInputs <= 1 ? 0 : 0.001 * (nTime4 - nTime2) / (nInputs-1), nTimeVerify * 0.000001, nTimeVerify * 0.001 / nBlocksTotal); |
|
|
|
LogPrint(BCLog::BENCH, " - Verify %u txins: %.2fms (%.3fms/txin) [%.2fs (%.2fms/blk)]\n", nInputs - 1, MILLI * (nTime4 - nTime2), nInputs <= 1 ? 0 : MILLI * (nTime4 - nTime2) / (nInputs-1), nTimeVerify * MICRO, nTimeVerify * MILLI / nBlocksTotal); |
|
|
|
|
|
|
|
|
|
|
|
if (fJustCheck) |
|
|
|
if (fJustCheck) |
|
|
|
return true; |
|
|
|
return true; |
|
|
@ -1737,10 +1740,10 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd |
|
|
|
view.SetBestBlock(pindex->GetBlockHash()); |
|
|
|
view.SetBestBlock(pindex->GetBlockHash()); |
|
|
|
|
|
|
|
|
|
|
|
int64_t nTime5 = GetTimeMicros(); nTimeIndex += nTime5 - nTime4; |
|
|
|
int64_t nTime5 = GetTimeMicros(); nTimeIndex += nTime5 - nTime4; |
|
|
|
LogPrint(BCLog::BENCH, " - Index writing: %.2fms [%.2fs (%.2fms/blk)]\n", 0.001 * (nTime5 - nTime4), nTimeIndex * 0.000001, nTimeIndex * 0.001 / nBlocksTotal); |
|
|
|
LogPrint(BCLog::BENCH, " - Index writing: %.2fms [%.2fs (%.2fms/blk)]\n", MILLI * (nTime5 - nTime4), nTimeIndex * MICRO, nTimeIndex * MILLI / nBlocksTotal); |
|
|
|
|
|
|
|
|
|
|
|
int64_t nTime6 = GetTimeMicros(); nTimeCallbacks += nTime6 - nTime5; |
|
|
|
int64_t nTime6 = GetTimeMicros(); nTimeCallbacks += nTime6 - nTime5; |
|
|
|
LogPrint(BCLog::BENCH, " - Callbacks: %.2fms [%.2fs (%.2fms/blk)]\n", 0.001 * (nTime6 - nTime5), nTimeCallbacks * 0.000001, nTimeCallbacks * 0.001 / nBlocksTotal); |
|
|
|
LogPrint(BCLog::BENCH, " - Callbacks: %.2fms [%.2fs (%.2fms/blk)]\n", MILLI * (nTime6 - nTime5), nTimeCallbacks * MICRO, nTimeCallbacks * MILLI / nBlocksTotal); |
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
@ -1959,7 +1962,7 @@ bool static DisconnectTip(CValidationState& state, const CChainParams& chainpara |
|
|
|
bool flushed = view.Flush(); |
|
|
|
bool flushed = view.Flush(); |
|
|
|
assert(flushed); |
|
|
|
assert(flushed); |
|
|
|
} |
|
|
|
} |
|
|
|
LogPrint(BCLog::BENCH, "- Disconnect block: %.2fms\n", (GetTimeMicros() - nStart) * 0.001); |
|
|
|
LogPrint(BCLog::BENCH, "- Disconnect block: %.2fms\n", (GetTimeMicros() - nStart) * MILLI); |
|
|
|
// Write the chain state to disk, if necessary.
|
|
|
|
// Write the chain state to disk, if necessary.
|
|
|
|
if (!FlushStateToDisk(state, FLUSH_STATE_IF_NEEDED)) |
|
|
|
if (!FlushStateToDisk(state, FLUSH_STATE_IF_NEEDED)) |
|
|
|
return false; |
|
|
|
return false; |
|
|
@ -2080,7 +2083,7 @@ bool static ConnectTip(CValidationState& state, const CChainParams& chainparams, |
|
|
|
// Apply the block atomically to the chain state.
|
|
|
|
// Apply the block atomically to the chain state.
|
|
|
|
int64_t nTime2 = GetTimeMicros(); nTimeReadFromDisk += nTime2 - nTime1; |
|
|
|
int64_t nTime2 = GetTimeMicros(); nTimeReadFromDisk += nTime2 - nTime1; |
|
|
|
int64_t nTime3; |
|
|
|
int64_t nTime3; |
|
|
|
LogPrint(BCLog::BENCH, " - Load block from disk: %.2fms [%.2fs]\n", (nTime2 - nTime1) * 0.001, nTimeReadFromDisk * 0.000001); |
|
|
|
LogPrint(BCLog::BENCH, " - Load block from disk: %.2fms [%.2fs]\n", (nTime2 - nTime1) * MILLI, nTimeReadFromDisk * MICRO); |
|
|
|
{ |
|
|
|
{ |
|
|
|
CCoinsViewCache view(pcoinsTip); |
|
|
|
CCoinsViewCache view(pcoinsTip); |
|
|
|
bool rv = ConnectBlock(blockConnecting, state, pindexNew, view, chainparams); |
|
|
|
bool rv = ConnectBlock(blockConnecting, state, pindexNew, view, chainparams); |
|
|
@ -2091,17 +2094,17 @@ bool static ConnectTip(CValidationState& state, const CChainParams& chainparams, |
|
|
|
return error("ConnectTip(): ConnectBlock %s failed", pindexNew->GetBlockHash().ToString()); |
|
|
|
return error("ConnectTip(): ConnectBlock %s failed", pindexNew->GetBlockHash().ToString()); |
|
|
|
} |
|
|
|
} |
|
|
|
nTime3 = GetTimeMicros(); nTimeConnectTotal += nTime3 - nTime2; |
|
|
|
nTime3 = GetTimeMicros(); nTimeConnectTotal += nTime3 - nTime2; |
|
|
|
LogPrint(BCLog::BENCH, " - Connect total: %.2fms [%.2fs (%.2fms/blk)]\n", (nTime3 - nTime2) * 0.001, nTimeConnectTotal * 0.000001, nTimeConnectTotal * 0.001 / nBlocksTotal); |
|
|
|
LogPrint(BCLog::BENCH, " - Connect total: %.2fms [%.2fs (%.2fms/blk)]\n", (nTime3 - nTime2) * MILLI, nTimeConnectTotal * MICRO, nTimeConnectTotal * MILLI / nBlocksTotal); |
|
|
|
bool flushed = view.Flush(); |
|
|
|
bool flushed = view.Flush(); |
|
|
|
assert(flushed); |
|
|
|
assert(flushed); |
|
|
|
} |
|
|
|
} |
|
|
|
int64_t nTime4 = GetTimeMicros(); nTimeFlush += nTime4 - nTime3; |
|
|
|
int64_t nTime4 = GetTimeMicros(); nTimeFlush += nTime4 - nTime3; |
|
|
|
LogPrint(BCLog::BENCH, " - Flush: %.2fms [%.2fs (%.2fms/blk)]\n", (nTime4 - nTime3) * 0.001, nTimeFlush * 0.000001, nTimeFlush * 0.001 / nBlocksTotal); |
|
|
|
LogPrint(BCLog::BENCH, " - Flush: %.2fms [%.2fs (%.2fms/blk)]\n", (nTime4 - nTime3) * MILLI, nTimeFlush * MICRO, nTimeFlush * MILLI / nBlocksTotal); |
|
|
|
// Write the chain state to disk, if necessary.
|
|
|
|
// Write the chain state to disk, if necessary.
|
|
|
|
if (!FlushStateToDisk(state, FLUSH_STATE_IF_NEEDED)) |
|
|
|
if (!FlushStateToDisk(state, FLUSH_STATE_IF_NEEDED)) |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
int64_t nTime5 = GetTimeMicros(); nTimeChainState += nTime5 - nTime4; |
|
|
|
int64_t nTime5 = GetTimeMicros(); nTimeChainState += nTime5 - nTime4; |
|
|
|
LogPrint(BCLog::BENCH, " - Writing chainstate: %.2fms [%.2fs (%.2fms/blk)]\n", (nTime5 - nTime4) * 0.001, nTimeChainState * 0.000001, nTimeChainState * 0.001 / nBlocksTotal); |
|
|
|
LogPrint(BCLog::BENCH, " - Writing chainstate: %.2fms [%.2fs (%.2fms/blk)]\n", (nTime5 - nTime4) * MILLI, nTimeChainState * MICRO, nTimeChainState * MILLI / nBlocksTotal); |
|
|
|
// Remove conflicting transactions from the mempool.;
|
|
|
|
// Remove conflicting transactions from the mempool.;
|
|
|
|
mempool.removeForBlock(blockConnecting.vtx, pindexNew->nHeight); |
|
|
|
mempool.removeForBlock(blockConnecting.vtx, pindexNew->nHeight); |
|
|
|
disconnectpool.removeForBlock(blockConnecting.vtx); |
|
|
|
disconnectpool.removeForBlock(blockConnecting.vtx); |
|
|
@ -2109,8 +2112,8 @@ bool static ConnectTip(CValidationState& state, const CChainParams& chainparams, |
|
|
|
UpdateTip(pindexNew, chainparams); |
|
|
|
UpdateTip(pindexNew, chainparams); |
|
|
|
|
|
|
|
|
|
|
|
int64_t nTime6 = GetTimeMicros(); nTimePostConnect += nTime6 - nTime5; nTimeTotal += nTime6 - nTime1; |
|
|
|
int64_t nTime6 = GetTimeMicros(); nTimePostConnect += nTime6 - nTime5; nTimeTotal += nTime6 - nTime1; |
|
|
|
LogPrint(BCLog::BENCH, " - Connect postprocess: %.2fms [%.2fs (%.2fms/blk)]\n", (nTime6 - nTime5) * 0.001, nTimePostConnect * 0.000001, nTimePostConnect * 0.001 / nBlocksTotal); |
|
|
|
LogPrint(BCLog::BENCH, " - Connect postprocess: %.2fms [%.2fs (%.2fms/blk)]\n", (nTime6 - nTime5) * MILLI, nTimePostConnect * MICRO, nTimePostConnect * MILLI / nBlocksTotal); |
|
|
|
LogPrint(BCLog::BENCH, "- Connect block: %.2fms [%.2fs (%.2fms/blk)]\n", (nTime6 - nTime1) * 0.001, nTimeTotal * 0.000001, nTimeTotal * 0.001 / nBlocksTotal); |
|
|
|
LogPrint(BCLog::BENCH, "- Connect block: %.2fms [%.2fs (%.2fms/blk)]\n", (nTime6 - nTime1) * MILLI, nTimeTotal * MICRO, nTimeTotal * MILLI / nBlocksTotal); |
|
|
|
|
|
|
|
|
|
|
|
connectTrace.BlockConnected(pindexNew, std::move(pthisBlock)); |
|
|
|
connectTrace.BlockConnected(pindexNew, std::move(pthisBlock)); |
|
|
|
return true; |
|
|
|
return true; |
|
|
@ -4123,7 +4126,7 @@ void DumpMempool(void) |
|
|
|
file.fclose(); |
|
|
|
file.fclose(); |
|
|
|
RenameOver(GetDataDir() / "mempool.dat.new", GetDataDir() / "mempool.dat"); |
|
|
|
RenameOver(GetDataDir() / "mempool.dat.new", GetDataDir() / "mempool.dat"); |
|
|
|
int64_t last = GetTimeMicros(); |
|
|
|
int64_t last = GetTimeMicros(); |
|
|
|
LogPrintf("Dumped mempool: %gs to copy, %gs to dump\n", (mid-start)*0.000001, (last-mid)*0.000001); |
|
|
|
LogPrintf("Dumped mempool: %gs to copy, %gs to dump\n", (mid-start)*MICRO, (last-mid)*MICRO); |
|
|
|
} catch (const std::exception& e) { |
|
|
|
} catch (const std::exception& e) { |
|
|
|
LogPrintf("Failed to dump mempool: %s. Continuing anyway.\n", e.what()); |
|
|
|
LogPrintf("Failed to dump mempool: %s. Continuing anyway.\n", e.what()); |
|
|
|
} |
|
|
|
} |
|
|
|