Return txid even if ATMP fails for new transaction

Github-Pull: #9302
Rebased-From: b3a74100b8
This commit is contained in:
Pieter Wuille
2016-12-08 11:49:28 -08:00
committed by MarcoFalke
parent 35174a0280
commit f5d606e5ab
2 changed files with 12 additions and 11 deletions

View File

@@ -1442,7 +1442,8 @@ void CWallet::ReacceptWalletTransactions()
CWalletTx& wtx = *(item.second); CWalletTx& wtx = *(item.second);
LOCK(mempool.cs); LOCK(mempool.cs);
wtx.AcceptToMemoryPool(false, maxTxFee); CValidationState state;
wtx.AcceptToMemoryPool(false, maxTxFee, state);
} }
} }
@@ -1451,8 +1452,9 @@ bool CWalletTx::RelayWalletTransaction()
assert(pwallet->GetBroadcastTransactions()); assert(pwallet->GetBroadcastTransactions());
if (!IsCoinBase() && !isAbandoned() && GetDepthInMainChain() == 0) if (!IsCoinBase() && !isAbandoned() && GetDepthInMainChain() == 0)
{ {
CValidationState state;
/* GetDepthInMainChain already catches known conflicts. */ /* GetDepthInMainChain already catches known conflicts. */
if (InMempool() || AcceptToMemoryPool(false, maxTxFee)) { if (InMempool() || AcceptToMemoryPool(false, maxTxFee, state)) {
LogPrintf("Relaying wtx %s\n", GetHash().ToString()); LogPrintf("Relaying wtx %s\n", GetHash().ToString());
RelayTransaction((CTransaction)*this); RelayTransaction((CTransaction)*this);
return true; return true;
@@ -2482,14 +2484,14 @@ bool CWallet::CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey)
if (fBroadcastTransactions) if (fBroadcastTransactions)
{ {
CValidationState state;
// Broadcast // Broadcast
if (!wtxNew.AcceptToMemoryPool(false, maxTxFee)) if (!wtxNew.AcceptToMemoryPool(false, maxTxFee, state)) {
{ LogPrintf("CommitTransaction(): Transaction cannot be broadcast immediately, %s\n", state.GetRejectReason());
// This must not fail. The transaction has already been signed and recorded. // TODO: if we expect the failure to be long term or permanent, instead delete wtx from the wallet and return failure.
LogPrintf("CommitTransaction(): Error: Transaction not valid\n"); } else {
return false; wtxNew.RelayWalletTransaction();
} }
wtxNew.RelayWalletTransaction();
} }
} }
return true; return true;
@@ -3595,8 +3597,7 @@ int CMerkleTx::GetBlocksToMaturity() const
} }
bool CMerkleTx::AcceptToMemoryPool(bool fLimitFree, CAmount nAbsurdFee) bool CMerkleTx::AcceptToMemoryPool(bool fLimitFree, CAmount nAbsurdFee, CValidationState& state)
{ {
CValidationState state;
return ::AcceptToMemoryPool(mempool, state, *this, fLimitFree, NULL, false, nAbsurdFee); return ::AcceptToMemoryPool(mempool, state, *this, fLimitFree, NULL, false, nAbsurdFee);
} }

View File

@@ -213,7 +213,7 @@ public:
bool IsInMainChain() const { const CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet) > 0; } bool IsInMainChain() const { const CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet) > 0; }
int GetBlocksToMaturity() const; int GetBlocksToMaturity() const;
/** Pass this transaction to the mempool. Fails if absolute fee exceeds absurd fee. */ /** Pass this transaction to the mempool. Fails if absolute fee exceeds absurd fee. */
bool AcceptToMemoryPool(bool fLimitFree, const CAmount nAbsurdFee); bool AcceptToMemoryPool(bool fLimitFree, const CAmount nAbsurdFee, CValidationState& state);
bool hashUnset() const { return (hashBlock.IsNull() || hashBlock == ABANDON_HASH); } bool hashUnset() const { return (hashBlock.IsNull() || hashBlock == ABANDON_HASH); }
bool isAbandoned() const { return (hashBlock == ABANDON_HASH); } bool isAbandoned() const { return (hashBlock == ABANDON_HASH); }
void setAbandoned() { hashBlock = ABANDON_HASH; } void setAbandoned() { hashBlock = ABANDON_HASH; }