mirror of
https://github.com/ElementsProject/elements.git
synced 2026-08-15 12:51:00 +02:00
Sanity check transaction scripts in DecodeHexTx
Make sure that the scripts of decoded transactions are valid scripts.
This commit is contained in:
parent
5b75c47784
commit
ac4e438229
3 changed files with 31 additions and 4 deletions
|
|
@ -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
|
|||
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,8 +133,9 @@ 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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue