limit claim script sizes to 2^13 bytes
This commit is contained in:
parent
df370a367f
commit
60ddd1b89b
4 changed files with 50 additions and 0 deletions
|
@ -717,6 +717,8 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state)
|
|||
nValueOut += txout.nValue;
|
||||
if (!MoneyRange(nValueOut))
|
||||
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
|
||||
|
|
|
@ -130,3 +130,9 @@ CScript StripClaimScriptPrefix(const CScript& scriptIn, int& op)
|
|||
return CScript(pc, scriptIn.end());
|
||||
}
|
||||
|
||||
size_t ClaimScriptSize(const CScript& scriptIn)
|
||||
{
|
||||
CScript strippedScript = StripClaimScriptPrefix(scriptIn);
|
||||
return scriptIn.size() - strippedScript.size();
|
||||
}
|
||||
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
|
||||
#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, CScript::const_iterator& pc);
|
||||
CScript StripClaimScriptPrefix(const CScript& scriptIn);
|
||||
|
@ -13,5 +15,6 @@ CScript StripClaimScriptPrefix(const CScript& scriptIn, int& op);
|
|||
uint160 ClaimIdHash(const uint256& txhash, uint32_t nOut);
|
||||
std::vector<unsigned char> uint32_t_to_vch(uint32_t n);
|
||||
uint32_t vch_to_uint32_t(std::vector<unsigned char>& vchN);
|
||||
size_t ClaimScriptSize(const CScript& scriptIn);
|
||||
|
||||
#endif // BITCOIN_NAMECLAIM_H
|
||||
|
|
|
@ -408,4 +408,43 @@ BOOST_AUTO_TEST_CASE(test_IsStandard)
|
|||
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()
|
||||
|
|
Loading…
Reference in a new issue