limit claim script sizes to 2^13 bytes

This commit is contained in:
Jimmy Kiselak 2016-04-11 20:48:16 -04:00
parent df370a367f
commit 60ddd1b89b
4 changed files with 50 additions and 0 deletions

View file

@ -717,6 +717,8 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state)
nValueOut += txout.nValue; nValueOut += txout.nValue;
if (!MoneyRange(nValueOut)) if (!MoneyRange(nValueOut))
return state.DoS(100, false, REJECT_INVALID, "bad-txns-txouttotal-toolarge"); return state.DoS(100, false, REJECT_INVALID, "bad-txns-txouttotal-toolarge");
if (ClaimScriptSize(txout.scriptPubKey) > MAX_CLAIM_SCRIPT_SIZE)
return state.DoS(100, false, REJECT_INVALID, "bad-txns-claimscriptsize-toolarg");
} }
// Check for duplicate inputs // Check for duplicate inputs

View file

@ -130,3 +130,9 @@ CScript StripClaimScriptPrefix(const CScript& scriptIn, int& op)
return CScript(pc, scriptIn.end()); return CScript(pc, scriptIn.end());
} }
size_t ClaimScriptSize(const CScript& scriptIn)
{
CScript strippedScript = StripClaimScriptPrefix(scriptIn);
return scriptIn.size() - strippedScript.size();
}

View file

@ -6,6 +6,8 @@
#include <vector> #include <vector>
#define MAX_CLAIM_SCRIPT_SIZE 8192
bool DecodeClaimScript(const CScript& scriptIn, int& op, std::vector<std::vector<unsigned char> >& vvchParams); bool DecodeClaimScript(const CScript& scriptIn, int& op, std::vector<std::vector<unsigned char> >& vvchParams);
bool DecodeClaimScript(const CScript& scriptIn, int& op, std::vector<std::vector<unsigned char> >& vvchParams, CScript::const_iterator& pc); bool DecodeClaimScript(const CScript& scriptIn, int& op, std::vector<std::vector<unsigned char> >& vvchParams, CScript::const_iterator& pc);
CScript StripClaimScriptPrefix(const CScript& scriptIn); CScript StripClaimScriptPrefix(const CScript& scriptIn);
@ -13,5 +15,6 @@ CScript StripClaimScriptPrefix(const CScript& scriptIn, int& op);
uint160 ClaimIdHash(const uint256& txhash, uint32_t nOut); uint160 ClaimIdHash(const uint256& txhash, uint32_t nOut);
std::vector<unsigned char> uint32_t_to_vch(uint32_t n); std::vector<unsigned char> uint32_t_to_vch(uint32_t n);
uint32_t vch_to_uint32_t(std::vector<unsigned char>& vchN); uint32_t vch_to_uint32_t(std::vector<unsigned char>& vchN);
size_t ClaimScriptSize(const CScript& scriptIn);
#endif // BITCOIN_NAMECLAIM_H #endif // BITCOIN_NAMECLAIM_H

View file

@ -408,4 +408,43 @@ BOOST_AUTO_TEST_CASE(test_IsStandard)
BOOST_CHECK(IsStandardTx(t, reason)); BOOST_CHECK(IsStandardTx(t, reason));
} }
BOOST_AUTO_TEST_CASE(test_claimsValid)
{
LOCK(cs_main);
CBasicKeyStore keystore;
CCoinsView coinsDummy;
CCoinsViewCache coins(&coinsDummy);
std::vector<CMutableTransaction> dummyTransactions = SetupDummyInputs(keystore, coins);
CMutableTransaction t;
t.vin.resize(1);
t.vin[0].prevout.hash = dummyTransactions[0].GetHash();
t.vin[0].prevout.n = 1;
t.vin[0].scriptSig << std::vector<unsigned char>(65, 0);
t.vout.resize(1);
t.vout[0].nValue = 90*CENT;
std::vector<unsigned char> vchName;
std::vector<unsigned char> vchValue;
vchName.resize(0);
vchValue.resize(0);
t.vout[0].scriptPubKey = CScript() << OP_CLAIM_NAME << vchName << vchValue << OP_2DROP << OP_DROP << OP_TRUE;
CValidationState state;
BOOST_CHECK(CheckTransaction(t, state));
BOOST_CHECK(state.IsValid());
vchName = std::vector<unsigned char>(2<<12, '0');
vchValue = std::vector<unsigned char>(2<<12, '0');
t.vout[0].scriptPubKey = CScript() << OP_CLAIM_NAME << vchName << vchValue << OP_2DROP << OP_DROP << OP_TRUE;
state = CValidationState();
BOOST_CHECK(!CheckTransaction(t, state));
BOOST_CHECK(!state.IsValid());
}
BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE_END()