aboutsummaryrefslogtreecommitdiff
path: root/src/validation.cpp
diff options
context:
space:
mode:
authorglozow <gloriajzhao@gmail.com>2023-10-04 10:06:22 +0100
committerglozow <gloriajzhao@gmail.com>2023-11-07 11:26:17 +0000
commit1147e00e59e47f27024ec96629993c66a3ce4ef0 (patch)
treed33cde18586975b8582b3a6056d26731157d8c92 /src/validation.cpp
parent10dd9f2441f4618321bfa2865449ac2223c572a0 (diff)
downloadbitcoin-1147e00e59e47f27024ec96629993c66a3ce4ef0.tar.xz
[validation] change package-fee-too-low, return wtxid(s) and effective feerate
With subpackage evaluation and de-duplication, it's not always the entire package that is used in CheckFeerate. To be more helpful to the caller, specify which transactions were included in the evaluation and what the feerate was. Instead of PCKG_POLICY (which is supposed to be for package-wide errors), use PCKG_TX.
Diffstat (limited to 'src/validation.cpp')
-rw-r--r--src/validation.cpp28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/validation.cpp b/src/validation.cpp
index c478252f18..018566fa9c 100644
--- a/src/validation.cpp
+++ b/src/validation.cpp
@@ -1237,7 +1237,13 @@ MempoolAcceptResult MemPoolAccept::AcceptSingleTransaction(const CTransactionRef
Workspace ws(ptx);
const std::vector<Wtxid> single_wtxid{ws.m_ptx->GetWitnessHash()};
- if (!PreChecks(args, ws)) return MempoolAcceptResult::Failure(ws.m_state);
+ if (!PreChecks(args, ws)) {
+ if (ws.m_state.GetResult() == TxValidationResult::TX_RECONSIDERABLE) {
+ // Failed for fee reasons. Provide the effective feerate and which tx was included.
+ return MempoolAcceptResult::FeeFailure(ws.m_state, CFeeRate(ws.m_modified_fees, ws.m_vsize), single_wtxid);
+ }
+ return MempoolAcceptResult::Failure(ws.m_state);
+ }
if (m_rbf && !ReplacementChecks(ws)) return MempoolAcceptResult::Failure(ws.m_state);
@@ -1254,7 +1260,12 @@ MempoolAcceptResult MemPoolAccept::AcceptSingleTransaction(const CTransactionRef
ws.m_base_fees, effective_feerate, single_wtxid);
}
- if (!Finalize(args, ws)) return MempoolAcceptResult::Failure(ws.m_state);
+ if (!Finalize(args, ws)) {
+ // The only possible failure reason is fee-related (mempool full).
+ // Failed for fee reasons. Provide the effective feerate and which txns were included.
+ Assume(ws.m_state.GetResult() == TxValidationResult::TX_RECONSIDERABLE);
+ return MempoolAcceptResult::FeeFailure(ws.m_state, CFeeRate(ws.m_modified_fees, ws.m_vsize), {ws.m_ptx->GetWitnessHash()});
+ }
GetMainSignals().TransactionAddedToMempool(ptx, m_pool.GetAndIncrementSequence());
@@ -1308,11 +1319,16 @@ PackageMempoolAcceptResult MemPoolAccept::AcceptMultipleTransactions(const std::
const auto m_total_modified_fees = std::accumulate(workspaces.cbegin(), workspaces.cend(), CAmount{0},
[](CAmount sum, auto& ws) { return sum + ws.m_modified_fees; });
const CFeeRate package_feerate(m_total_modified_fees, m_total_vsize);
+ std::vector<Wtxid> all_package_wtxids;
+ all_package_wtxids.reserve(workspaces.size());
+ std::transform(workspaces.cbegin(), workspaces.cend(), std::back_inserter(all_package_wtxids),
+ [](const auto& ws) { return ws.m_ptx->GetWitnessHash(); });
TxValidationState placeholder_state;
if (args.m_package_feerates &&
!CheckFeeRate(m_total_vsize, m_total_modified_fees, placeholder_state)) {
- package_state.Invalid(PackageValidationResult::PCKG_POLICY, "package-fee-too-low");
- return PackageMempoolAcceptResult(package_state, {});
+ package_state.Invalid(PackageValidationResult::PCKG_TX, "transaction failed");
+ return PackageMempoolAcceptResult(package_state, {{workspaces.back().m_ptx->GetWitnessHash(),
+ MempoolAcceptResult::FeeFailure(placeholder_state, CFeeRate(m_total_modified_fees, m_total_vsize), all_package_wtxids)}});
}
// Apply package mempool ancestor/descendant limits. Skip if there is only one transaction,
@@ -1323,10 +1339,6 @@ PackageMempoolAcceptResult MemPoolAccept::AcceptMultipleTransactions(const std::
return PackageMempoolAcceptResult(package_state, std::move(results));
}
- std::vector<Wtxid> all_package_wtxids;
- all_package_wtxids.reserve(workspaces.size());
- std::transform(workspaces.cbegin(), workspaces.cend(), std::back_inserter(all_package_wtxids),
- [](const auto& ws) { return ws.m_ptx->GetWitnessHash(); });
for (Workspace& ws : workspaces) {
ws.m_package_feerate = package_feerate;
if (!PolicyScriptChecks(args, ws)) {