aboutsummaryrefslogtreecommitdiff
path: root/src/validation.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/validation.h')
-rw-r--r--src/validation.h46
1 files changed, 39 insertions, 7 deletions
diff --git a/src/validation.h b/src/validation.h
index 7ce60da634..e669ec46d5 100644
--- a/src/validation.h
+++ b/src/validation.h
@@ -114,7 +114,27 @@ double GuessVerificationProgress(const ChainTxData& data, const CBlockIndex* pin
void PruneBlockFilesManual(Chainstate& active_chainstate, int nManualPruneHeight);
/**
-* Validation result for a single transaction mempool acceptance.
+* Validation result for a transaction evaluated by MemPoolAccept (single or package).
+* Here are the expected fields and properties of a result depending on its ResultType, applicable to
+* results returned from package evaluation:
+*+---------------------------+----------------+-------------------+------------------+----------------+-------------------+
+*| Field or property | VALID | INVALID | MEMPOOL_ENTRY | DIFFERENT_WITNESS |
+*| | |--------------------------------------| | |
+*| | | TX_RECONSIDERABLE | Other | | |
+*+---------------------------+----------------+-------------------+------------------+----------------+-------------------+
+*| txid in mempool? | yes | no | no* | yes | yes |
+*| wtxid in mempool? | yes | no | no* | yes | no |
+*| m_state | yes, IsValid() | yes, IsInvalid() | yes, IsInvalid() | yes, IsValid() | yes, IsValid() |
+*| m_replaced_transactions | yes | no | no | no | no |
+*| m_vsize | yes | no | no | yes | no |
+*| m_base_fees | yes | no | no | yes | no |
+*| m_effective_feerate | yes | yes | no | no | no |
+*| m_wtxids_fee_calculations | yes | yes | no | no | no |
+*| m_other_wtxid | no | no | no | no | yes |
+*+---------------------------+----------------+-------------------+------------------+----------------+-------------------+
+* (*) Individual transaction acceptance doesn't return MEMPOOL_ENTRY and DIFFERENT_WITNESS. It returns
+* INVALID, with the errors txn-already-in-mempool and txn-same-nonwitness-data-in-mempool
+* respectively. In those cases, the txid or wtxid may be in the mempool for a TX_CONFLICT.
*/
struct MempoolAcceptResult {
/** Used to indicate the results of mempool validation. */
@@ -130,7 +150,6 @@ struct MempoolAcceptResult {
/** Contains information about why the transaction failed. */
const TxValidationState m_state;
- // The following fields are only present when m_result_type = ResultType::VALID or MEMPOOL_ENTRY
/** Mempool transactions replaced by the tx. */
const std::optional<std::list<CTransactionRef>> m_replaced_transactions;
/** Virtual size as used by the mempool, calculated using serialized size and sigops. */
@@ -141,7 +160,6 @@ struct MempoolAcceptResult {
* using prioritisetransaction (i.e. modified fees). If this transaction was submitted as a
* package, this is the package feerate, which may also include its descendants and/or
* ancestors (see m_wtxids_fee_calculations below).
- * Only present when m_result_type = ResultType::VALID.
*/
const std::optional<CFeeRate> m_effective_feerate;
/** Contains the wtxids of the transactions used for fee-related checks. Includes this
@@ -149,9 +167,8 @@ struct MempoolAcceptResult {
* package. This is not necessarily equivalent to the list of transactions passed to
* ProcessNewPackage().
* Only present when m_result_type = ResultType::VALID. */
- const std::optional<std::vector<uint256>> m_wtxids_fee_calculations;
+ const std::optional<std::vector<Wtxid>> m_wtxids_fee_calculations;
- // The following field is only present when m_result_type = ResultType::DIFFERENT_WITNESS
/** The wtxid of the transaction in the mempool which has the same txid but different witness. */
const std::optional<uint256> m_other_wtxid;
@@ -159,11 +176,17 @@ struct MempoolAcceptResult {
return MempoolAcceptResult(state);
}
+ static MempoolAcceptResult FeeFailure(TxValidationState state,
+ CFeeRate effective_feerate,
+ const std::vector<Wtxid>& wtxids_fee_calculations) {
+ return MempoolAcceptResult(state, effective_feerate, wtxids_fee_calculations);
+ }
+
static MempoolAcceptResult Success(std::list<CTransactionRef>&& replaced_txns,
int64_t vsize,
CAmount fees,
CFeeRate effective_feerate,
- const std::vector<uint256>& wtxids_fee_calculations) {
+ const std::vector<Wtxid>& wtxids_fee_calculations) {
return MempoolAcceptResult(std::move(replaced_txns), vsize, fees,
effective_feerate, wtxids_fee_calculations);
}
@@ -189,7 +212,7 @@ private:
int64_t vsize,
CAmount fees,
CFeeRate effective_feerate,
- const std::vector<uint256>& wtxids_fee_calculations)
+ const std::vector<Wtxid>& wtxids_fee_calculations)
: m_result_type(ResultType::VALID),
m_replaced_transactions(std::move(replaced_txns)),
m_vsize{vsize},
@@ -197,6 +220,15 @@ private:
m_effective_feerate(effective_feerate),
m_wtxids_fee_calculations(wtxids_fee_calculations) {}
+ /** Constructor for fee-related failure case */
+ explicit MempoolAcceptResult(TxValidationState state,
+ CFeeRate effective_feerate,
+ const std::vector<Wtxid>& wtxids_fee_calculations)
+ : m_result_type(ResultType::INVALID),
+ m_state(state),
+ m_effective_feerate(effective_feerate),
+ m_wtxids_fee_calculations(wtxids_fee_calculations) {}
+
/** Constructor for already-in-mempool case. It wouldn't replace any transactions. */
explicit MempoolAcceptResult(int64_t vsize, CAmount fees)
: m_result_type(ResultType::MEMPOOL_ENTRY), m_vsize{vsize}, m_base_fees(fees) {}