From: CryptoManiac Date: Fri, 9 Jan 2015 06:43:03 +0000 (+0300) Subject: Merge pull request #106 from fsb4000/non-standard-transaction X-Git-Tag: nvc-v0.5.1~20 X-Git-Url: https://git.novaco.in/?a=commitdiff_plain;h=c1714c3c8cca1e1d2f7e4705be8bef9bb92ac372;hp=94f80afa985d61b0dd769b49bdd38f4f4c926107;p=novacoin.git Merge pull request #106 from fsb4000/non-standard-transaction Log reason for non-standard transaction rejection --- diff --git a/src/main.cpp b/src/main.cpp index e5668f9..7853aa3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -297,10 +297,13 @@ bool CTransaction::ReadFromDisk(COutPoint prevout) return ReadFromDisk(txdb, prevout, txindex); } -bool CTransaction::IsStandard() const +bool CTransaction::IsStandard(string& strReason) const { if (nVersion > CTransaction::CURRENT_VERSION) + { + strReason = "version"; return false; + } unsigned int nDataOut = 0; txnouttype whichType; @@ -310,24 +313,34 @@ bool CTransaction::IsStandard() const // 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) + { + strReason = "scriptsig-size"; return false; + } if (!txin.scriptSig.IsPushOnly()) + { + strReason = "scriptsig-not-pushonly"; return false; + } if (!txin.scriptSig.HasCanonicalPushes()) { + strReason = "txin-scriptsig-not-canonicalpushes"; return false; } } BOOST_FOREACH(const CTxOut& txout, vout) { if (!::IsStandard(txout.scriptPubKey, whichType)) { + strReason = "scriptpubkey"; return false; } if (whichType == TX_NULL_DATA) nDataOut++; else { if (txout.nValue == 0) { + strReason = "txout-value=0"; return false; } if (!txout.scriptPubKey.HasCanonicalPushes()) { + strReason = "txout-scriptsig-not-canonicalpushes"; return false; } } @@ -335,6 +348,7 @@ bool CTransaction::IsStandard() const // only one OP_RETURN txout is permitted if (nDataOut > 1) { + strReason = "multi-op-return"; return false; } @@ -625,8 +639,9 @@ bool CTxMemPool::accept(CTxDB& txdb, CTransaction &tx, bool fCheckInputs, 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()); // Do we already have it? uint256 hash = tx.GetHash(); diff --git a/src/main.h b/src/main.h index 0ef9a9d..93f4904 100644 --- a/src/main.h +++ b/src/main.h @@ -548,7 +548,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