| 1247 | } |
| 1248 | |
| 1249 | MempoolAcceptResult MemPoolAccept::AcceptSingleTransaction(const CTransactionRef& ptx, ATMPArgs& args) |
| 1250 | { |
| 1251 | AssertLockHeld(cs_main); |
| 1252 | LOCK(m_pool.cs); // mempool "read lock" (held through GetMainSignals().TransactionAddedToMempool()) |
| 1253 | |
| 1254 | Workspace ws(ptx, args.m_chainparams.HashGenesisBlock()); |
| 1255 | |
| 1256 | if (!PreChecks(args, ws)) return MempoolAcceptResult::Failure(ws.m_state); |
| 1257 | |
| 1258 | if (m_rbf && !ReplacementChecks(ws)) return MempoolAcceptResult::Failure(ws.m_state); |
| 1259 | |
| 1260 | // Perform the inexpensive checks first and avoid hashing and signature verification unless |
| 1261 | // those checks pass, to mitigate CPU exhaustion denial-of-service attacks. |
| 1262 | if (!PolicyScriptChecks(args, ws)) return MempoolAcceptResult::Failure(ws.m_state); |
| 1263 | |
| 1264 | if (!ConsensusScriptChecks(args, ws)) return MempoolAcceptResult::Failure(ws.m_state); |
| 1265 | |
| 1266 | // Tx was accepted, but not added |
| 1267 | if (args.m_test_accept) { |
| 1268 | return MempoolAcceptResult::Success(std::move(ws.m_replaced_transactions), ws.m_vsize, ws.m_base_fees); |
| 1269 | } |
| 1270 | |
| 1271 | if (!Finalize(args, ws)) return MempoolAcceptResult::Failure(ws.m_state); |
| 1272 | |
| 1273 | GetMainSignals().TransactionAddedToMempool(ptx, m_pool.GetAndIncrementSequence()); |
| 1274 | |
| 1275 | return MempoolAcceptResult::Success(std::move(ws.m_replaced_transactions), ws.m_vsize, ws.m_base_fees); |
| 1276 | } |
| 1277 | |
| 1278 | PackageMempoolAcceptResult MemPoolAccept::AcceptMultipleTransactions(const std::vector<CTransactionRef>& txns, ATMPArgs& args) |
| 1279 | { |
no test coverage detected