Changeset View
Changeset View
Standalone View
Standalone View
src/core_read.cpp
Show First 20 Lines • Show All 174 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) { | |||||
markblundeberg: In principle we could keep these input checks, since no valid transaction violates these. | |||||
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.eof() && CheckTxScriptsSanity(tx)) { | if (ssData.eof()) { | ||||
return true; | return true; | ||||
} | } | ||||
} catch (const std::exception &e) { | } catch (const std::exception &e) { | ||||
// Fall through. | // Fall through. | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 106 Lines • Show Last 20 Lines |
In principle we could keep these input checks, since no valid transaction violates these. However, it is nice to be able to decode transactions with intentionally weird scriptSigs even if they will never be broadcasted.