Changeset View
Changeset View
Standalone View
Standalone View
src/core_read.cpp
Show First 20 Lines • Show All 173 Lines • ▼ Show 20 Lines | next: | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
return result; | 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 DecodeHexTx(CMutableTransaction &tx, const std::string &strHexTx) { | ||||
if (!IsHex(strHexTx)) { | if (!IsHex(strHexTx)) { | ||||
return false; | return false; | ||||
} | } | ||||
std::vector<uint8_t> txData(ParseHex(strHexTx)); | std::vector<uint8_t> txData(ParseHex(strHexTx)); | ||||
CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); | CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); | ||||
try { | try { | ||||
ssData >> tx; | ssData >> tx; | ||||
if (!ssData.empty()) { | if (!ssData.empty() && CheckTxScriptsSanity(tx)) { | ||||
return false; | return false; | ||||
} | } | ||||
} catch (const std::exception &) { | } catch (const std::exception &) { | ||||
return false; | return false; | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 52 Lines • Show Last 20 Lines |