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 (const auto &i : tx.vin) { | |||||
if (!i.scriptSig.HasValidOps() || | |||||
i.scriptSig.size() > MAX_SCRIPT_SIZE) { | |||||
return false; | |||||
} | |||||
} | |||||
} | |||||
// Check output scripts | |||||
for (const auto &o : tx.vout) { | |||||
if (!o.scriptPubKey.HasValidOps() || | |||||
o.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.eof() && CheckTxScriptsSanity(tx)) { | ||||
return false; | return true; | ||||
} | } | ||||
} catch (const std::exception &) { | } catch (const std::exception &e) { | ||||
return false; | // Fall through. | ||||
} | } | ||||
return true; | return false; | ||||
} | } | ||||
bool DecodeHexBlockHeader(CBlockHeader &header, const std::string &hex_header) { | bool DecodeHexBlockHeader(CBlockHeader &header, const std::string &hex_header) { | ||||
if (!IsHex(hex_header)) { | if (!IsHex(hex_header)) { | ||||
return false; | return false; | ||||
} | } | ||||
const std::vector<uint8_t> header_data{ParseHex(hex_header)}; | const std::vector<uint8_t> header_data{ParseHex(hex_header)}; | ||||
▲ Show 20 Lines • Show All 50 Lines • Show Last 20 Lines |