diff options
author | Wladimir J. van der Laan <laanwj@gmail.com> | 2014-08-12 14:56:59 +0200 |
---|---|---|
committer | Wladimir J. van der Laan <laanwj@gmail.com> | 2014-08-12 14:57:13 +0200 |
commit | 8ebe42435ab1deda622a7bbfc638b0b2393150ee (patch) | |
tree | bb8f1279b216b453bdc854f1964555dd5dff459e /src | |
parent | e257b7c4c4517bc90237d879b40a380a8f596788 (diff) | |
parent | 4fad8e6d831729efa1965fa2034e7e51d3d0a1be (diff) |
Merge pull request #4150
4fad8e6 Reject transactions with excessive numbers of sigops (Peter Todd)
Diffstat (limited to 'src')
-rw-r--r-- | src/main.cpp | 15 | ||||
-rw-r--r-- | src/main.h | 2 |
2 files changed, 14 insertions, 3 deletions
diff --git a/src/main.cpp b/src/main.cpp index 55206600e2..e135e93adb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -956,9 +956,18 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa if (Params().RequireStandard() && !AreInputsStandard(tx, view)) return error("AcceptToMemoryPool: : nonstandard transaction input"); - // Note: if you modify this code to accept non-standard transactions, then - // you should add code here to check that the transaction does a - // reasonable number of ECDSA signature verifications. + // Check that the transaction doesn't have an excessive number of + // sigops, making it impossible to mine. Since the coinbase transaction + // 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 nFees = nValueIn-nValueOut; diff --git a/src/main.h b/src/main.h index a27020459a..01d3f119e1 100644 --- a/src/main.h +++ b/src/main.h @@ -45,6 +45,8 @@ static const unsigned int MAX_STANDARD_TX_SIZE = 100000; static const unsigned int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50; /** Maxiumum number of signature check operations in an IsStandard() P2SH script */ 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 */ static const unsigned int MAX_ORPHAN_TRANSACTIONS = MAX_BLOCK_SIZE/100; /** Default for -maxorphanblocks, maximum number of orphan blocks kept in memory */ |