diff options
author | Jeff Garzik <jgarzik@bitpay.com> | 2013-06-05 14:52:06 -0400 |
---|---|---|
committer | Wladimir J. van der Laan <laanwj@gmail.com> | 2013-11-26 14:00:47 +0100 |
commit | c4892eb4b3fd7f263f3d8584029a24340837fa66 (patch) | |
tree | 84911c94d9d336af5eafd1a0641e66607e7a6a37 | |
parent | 633d95ec222db340242410a581e65805eb863af9 (diff) |
Log reason for non-standard transaction rejection
Conflicts:
src/main.cpp
Rebased-from: cb3076a3daa68eebf19c681ab48a0c0d9f0ce7a5
-rw-r--r-- | src/main.cpp | 36 | ||||
-rw-r--r-- | src/main.h | 7 |
2 files changed, 32 insertions, 11 deletions
diff --git a/src/main.cpp b/src/main.cpp index f8d8697a3e..726a49c611 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -366,37 +366,51 @@ bool CTxOut::IsDust() const return ((nValue*1000)/(3*((int)GetSerializeSize(SER_DISK,0)+148)) < CTransaction::nMinRelayTxFee); } -bool CTransaction::IsStandard() const +bool CTransaction::IsStandard(string& strReason) const { - if (nVersion > CTransaction::CURRENT_VERSION || nVersion < 1) + if (nVersion > CTransaction::CURRENT_VERSION || nVersion < 1) { + strReason = "version"; return false; + } - if (!IsFinal()) + if (!IsFinal()) { + strReason = "not-final"; return false; + } // Extremely large transactions with lots of inputs can cost the network // almost as much to process as they cost the sender in fees, because // computing signature hashes is O(ninputs*txsize). Limiting transactions // to MAX_STANDARD_TX_SIZE mitigates CPU exhaustion attacks. unsigned int sz = this->GetSerializeSize(SER_NETWORK, CTransaction::CURRENT_VERSION); - if (sz >= MAX_STANDARD_TX_SIZE) + if (sz >= MAX_STANDARD_TX_SIZE) { + strReason = "tx-size"; return false; + } BOOST_FOREACH(const CTxIn& txin, vin) { // Biggest 'standard' txin is a 3-signature 3-of-3 CHECKMULTISIG // pay-to-script-hash, which is 3 ~80-byte signatures, 3 // ~65-byte public keys, plus a few script ops. - if (txin.scriptSig.size() > 500) + if (txin.scriptSig.size() > 500) { + strReason = "scriptsig-size"; return false; - if (!txin.scriptSig.IsPushOnly()) + } + if (!txin.scriptSig.IsPushOnly()) { + strReason = "scriptsig-not-pushonly"; return false; + } } BOOST_FOREACH(const CTxOut& txout, vout) { - if (!::IsStandard(txout.scriptPubKey)) + if (!::IsStandard(txout.scriptPubKey)) { + strReason = "scriptpubkey"; return false; - if (txout.IsDust()) + } + if (txout.IsDust()) { + strReason = "dust"; return false; + } } return true; } @@ -661,8 +675,10 @@ bool CTxMemPool::accept(CValidationState &state, CTransaction &tx, bool fCheckIn return error("CTxMemPool::accept() : not accepting nLockTime beyond 2038 yet"); // Rather not work on nonstandard transactions (unless -testnet) - if (!fTestNet && !tx.IsStandard()) - return error("CTxMemPool::accept() : nonstandard transaction type"); + string strNonStd; + if (!fTestNet && !tx.IsStandard(strNonStd)) + return error("CTxMemPool::accept() : nonstandard transaction (%s)", + strNonStd.c_str()); // is it already in the memory pool? uint256 hash = tx.GetHash(); diff --git a/src/main.h b/src/main.h index 76020420cb..94260dc2e4 100644 --- a/src/main.h +++ b/src/main.h @@ -559,7 +559,12 @@ public: /** Check for standard transaction types @return True if all outputs (scriptPubKeys) use only standard transaction forms */ - bool IsStandard() const; + bool IsStandard(std::string& strReason) const; + bool IsStandard() const + { + std::string strReason; + return IsStandard(strReason); + } /** Check for standard transaction types @param[in] mapInputs Map of previous transactions that have outputs we're spending |