Reject transactions with excessive numbers of sigops
This commit is contained in:
parent
29ef389514
commit
4fad8e6d83
2 changed files with 14 additions and 3 deletions
15
src/main.cpp
15
src/main.cpp
|
@ -1016,9 +1016,18 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
|
||||||
if (Params().RequireStandard() && !AreInputsStandard(tx, view))
|
if (Params().RequireStandard() && !AreInputsStandard(tx, view))
|
||||||
return error("AcceptToMemoryPool: : nonstandard transaction input");
|
return error("AcceptToMemoryPool: : nonstandard transaction input");
|
||||||
|
|
||||||
// Note: if you modify this code to accept non-standard transactions, then
|
// Check that the transaction doesn't have an excessive number of
|
||||||
// you should add code here to check that the transaction does a
|
// sigops, making it impossible to mine. Since the coinbase transaction
|
||||||
// reasonable number of ECDSA signature verifications.
|
// itself can contain sigops MAX_TX_SIGOPS is less than
|
||||||
|
// MAX_BLOCK_SIGOPS; we still consider this an invalid rather than
|
||||||
|
// merely non-standard transaction.
|
||||||
|
unsigned int nSigOps = GetLegacySigOpCount(tx);
|
||||||
|
nSigOps += GetP2SHSigOpCount(tx, view);
|
||||||
|
if (nSigOps > MAX_TX_SIGOPS)
|
||||||
|
return state.DoS(0,
|
||||||
|
error("AcceptToMemoryPool : too many sigops %s, %d > %d",
|
||||||
|
hash.ToString(), nSigOps, MAX_TX_SIGOPS),
|
||||||
|
REJECT_NONSTANDARD, "bad-txns-too-many-sigops");
|
||||||
|
|
||||||
int64_t nValueOut = tx.GetValueOut();
|
int64_t nValueOut = tx.GetValueOut();
|
||||||
int64_t nFees = nValueIn-nValueOut;
|
int64_t nFees = nValueIn-nValueOut;
|
||||||
|
|
|
@ -45,6 +45,8 @@ static const unsigned int MAX_STANDARD_TX_SIZE = 100000;
|
||||||
static const unsigned int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50;
|
static const unsigned int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50;
|
||||||
/** Maxiumum number of signature check operations in an IsStandard() P2SH script */
|
/** Maxiumum number of signature check operations in an IsStandard() P2SH script */
|
||||||
static const unsigned int MAX_P2SH_SIGOPS = 15;
|
static const unsigned int MAX_P2SH_SIGOPS = 15;
|
||||||
|
/** The maximum number of sigops we're willing to relay/mine in a single tx */
|
||||||
|
static const unsigned int MAX_TX_SIGOPS = MAX_BLOCK_SIGOPS/5;
|
||||||
/** The maximum number of orphan transactions kept in memory */
|
/** The maximum number of orphan transactions kept in memory */
|
||||||
static const unsigned int MAX_ORPHAN_TRANSACTIONS = MAX_BLOCK_SIZE/100;
|
static const unsigned int MAX_ORPHAN_TRANSACTIONS = MAX_BLOCK_SIZE/100;
|
||||||
/** Default for -maxorphanblocks, maximum number of orphan blocks kept in memory */
|
/** Default for -maxorphanblocks, maximum number of orphan blocks kept in memory */
|
||||||
|
|
Loading…
Reference in a new issue