|
|
|
@ -88,10 +88,32 @@ CScript ParseScript(const std::string& s)
@@ -88,10 +88,32 @@ CScript ParseScript(const std::string& s)
|
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Check that all of the input and output scripts of a transaction contains valid opcodes
|
|
|
|
|
bool CheckTxScriptsSanity(const CMutableTransaction& tx) |
|
|
|
|
{ |
|
|
|
|
// Check input scripts for non-coinbase txs
|
|
|
|
|
if (!CTransaction(tx).IsCoinBase()) { |
|
|
|
|
for (unsigned int i = 0; i < tx.vin.size(); i++) { |
|
|
|
|
if (!tx.vin[i].scriptSig.HasValidOps() || tx.vin[i].scriptSig.size() > MAX_SCRIPT_SIZE) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// Check output scripts
|
|
|
|
|
for (unsigned int i = 0; i < tx.vout.size(); i++) { |
|
|
|
|
if (!tx.vout[i].scriptPubKey.HasValidOps() || tx.vout[i].scriptPubKey.size() > MAX_SCRIPT_SIZE) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool DecodeHexTx(CMutableTransaction& tx, const std::string& strHexTx, bool fTryNoWitness) |
|
|
|
|
{ |
|
|
|
|
if (!IsHex(strHexTx)) |
|
|
|
|
if (!IsHex(strHexTx)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::vector<unsigned char> txData(ParseHex(strHexTx)); |
|
|
|
|
|
|
|
|
@ -99,7 +121,7 @@ bool DecodeHexTx(CMutableTransaction& tx, const std::string& strHexTx, bool fTry
@@ -99,7 +121,7 @@ bool DecodeHexTx(CMutableTransaction& tx, const std::string& strHexTx, bool fTry
|
|
|
|
|
CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS); |
|
|
|
|
try { |
|
|
|
|
ssData >> tx; |
|
|
|
|
if (ssData.eof()) { |
|
|
|
|
if (ssData.eof() && CheckTxScriptsSanity(tx)) { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -111,9 +133,10 @@ bool DecodeHexTx(CMutableTransaction& tx, const std::string& strHexTx, bool fTry
@@ -111,9 +133,10 @@ bool DecodeHexTx(CMutableTransaction& tx, const std::string& strHexTx, bool fTry
|
|
|
|
|
CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); |
|
|
|
|
try { |
|
|
|
|
ssData >> tx; |
|
|
|
|
if (!ssData.empty()) |
|
|
|
|
if (!ssData.empty()) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
catch (const std::exception&) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|