From 99bf91f3c6b12ac6f1641d041342214792c551f8 Mon Sep 17 00:00:00 2001 From: ismaelsadeeq Date: Tue, 28 May 2024 12:27:05 +0100 Subject: [PATCH] [validation]: log received block percentile fee rates --- src/kernel/mempool_entry.h | 3 +++ src/validation.cpp | 31 +++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/kernel/mempool_entry.h b/src/kernel/mempool_entry.h index a65f9a4b12dcad..08f8adbe0a6f31 100644 --- a/src/kernel/mempool_entry.h +++ b/src/kernel/mempool_entry.h @@ -219,6 +219,9 @@ struct RemovedMempoolTransactionInfo { const std::chrono::seconds nTime; explicit RemovedMempoolTransactionInfo(const CTxMemPoolEntry& entry) : info{entry.GetSharedTx(), entry.GetFee(), entry.GetTxSize(), entry.GetHeight()}, nTime{entry.GetTime()} {} + + explicit RemovedMempoolTransactionInfo(const CTransactionRef& tx, const CAmount& fee, const int64_t vsize, const unsigned int height, const std::chrono::seconds time) + : info(tx, fee, vsize, height), nTime(time) {} }; struct NewMempoolTransactionInfo { diff --git a/src/validation.cpp b/src/validation.cpp index b47b1d09ae1e9a..6132fd83f84c33 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -32,6 +32,8 @@ #include #include #include +#include +#include #include #include #include @@ -2605,15 +2607,16 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state, int nInputs = 0; int64_t nSigOpsCost = 0; blockundo.vtxundo.reserve(block.vtx.size() - 1); + std::vector block_txs; for (unsigned int i = 0; i < block.vtx.size(); i++) { const CTransaction &tx = *(block.vtx[i]); nInputs += tx.vin.size(); + CAmount txfee = 0; if (!tx.IsCoinBase()) { - CAmount txfee = 0; TxValidationState tx_state; if (!Consensus::CheckTxInputs(tx, tx_state, view, pindex->nHeight, txfee)) { // Any transaction validation failure in ConnectBlock is a block consensus failure @@ -2646,7 +2649,8 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state, // * legacy (always) // * p2sh (when P2SH enabled in flags and excludes coinbase) // * witness (when witness enabled in flags and excludes coinbase) - nSigOpsCost += GetTransactionSigOpCost(tx, view, flags); + int64_t txSigOpCost = GetTransactionSigOpCost(tx, view, flags); + nSigOpsCost += txSigOpCost; if (nSigOpsCost > MAX_BLOCK_SIGOPS_COST) { LogPrintf("ERROR: ConnectBlock(): too many sigops\n"); return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-blk-sigops"); @@ -2666,6 +2670,9 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state, return false; } control.Add(std::move(vChecks)); + int64_t txVsize = GetVirtualTransactionSize(GetTransactionWeight(tx), txSigOpCost, nBytesPerSigOp); + auto tx_info = RemovedMempoolTransactionInfo(block.vtx[i], txfee, txVsize, /*dummy height=*/0, /*dummy time*/std::chrono::seconds{0}); + block_txs.push_back(tx_info); } CTxUndo undoDummy; @@ -2674,6 +2681,26 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state, } UpdateCoins(tx, view, i == 0 ? undoDummy : blockundo.vtxundo.back(), pindex->nHeight); } + + auto mini_miner_input = GetMiniMinerInput(block_txs); + auto linearizedResult = node::MiniMiner(std::get<0>(mini_miner_input), std::get<1>(mini_miner_input)).Linearize(); + const auto size_per_feerate = linearizedResult.size_per_feerate; + if (size_per_feerate.size() > 0) { + auto block_percentiles = CalculateBlockPercentiles(size_per_feerate); + CAmount lowest_fee_rate = std::get<0>(size_per_feerate[size_per_feerate.size() - 1]).GetFeePerK(); + CAmount highest_fee_rate = std::get<0>(size_per_feerate[0]).GetFeePerK(); + LogInfo("Connected Block: %s, %s, %s, %s, %s, %s, %s, %s\n", + pindex->GetBlockHash().ToString(), pindex->nHeight, highest_fee_rate, block_percentiles.p75.GetFeePerK(), block_percentiles.p50.GetFeePerK(), block_percentiles.p25.GetFeePerK(), block_percentiles.p5.GetFeePerK(), lowest_fee_rate); + TRACE8(validation, block_connected_fees, + block_hash.data(), + pindex->nHeight, + highest_fee_rate, + block_percentiles.p75.GetFeePerK(), + block_percentiles.p50.GetFeePerK(), + block_percentiles.p25.GetFeePerK(), + block_percentiles.p5.GetFeePerK(), + lowest_fee_rate); + } const auto time_3{SteadyClock::now()}; m_chainman.time_connect += time_3 - time_2; LogDebug(BCLog::BENCH, " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs (%.2fms/blk)]\n", (unsigned)block.vtx.size(),