Merge #8365: Treat high-sigop transactions as larger rather than rejecting them
ab942c1
Treat high-sigop transactions as larger rather than rejecting them (Pieter Wuille)
This commit is contained in:
commit
618c9dd8c6
6 changed files with 15 additions and 12 deletions
|
@ -446,7 +446,7 @@ std::string HelpMessage(HelpMessageMode mode)
|
||||||
strUsage += HelpMessageGroup(_("Node relay options:"));
|
strUsage += HelpMessageGroup(_("Node relay options:"));
|
||||||
if (showDebug)
|
if (showDebug)
|
||||||
strUsage += HelpMessageOpt("-acceptnonstdtxn", strprintf("Relay and mine \"non-standard\" transactions (%sdefault: %u)", "testnet/regtest only; ", !Params(CBaseChainParams::TESTNET).RequireStandard()));
|
strUsage += HelpMessageOpt("-acceptnonstdtxn", strprintf("Relay and mine \"non-standard\" transactions (%sdefault: %u)", "testnet/regtest only; ", !Params(CBaseChainParams::TESTNET).RequireStandard()));
|
||||||
strUsage += HelpMessageOpt("-bytespersigop", strprintf(_("Minimum bytes per sigop in transactions we relay and mine (default: %u)"), DEFAULT_BYTES_PER_SIGOP));
|
strUsage += HelpMessageOpt("-bytespersigop", strprintf(_("Equivalent bytes per sigop in transactions for relay and mining (default: %u)"), DEFAULT_BYTES_PER_SIGOP));
|
||||||
strUsage += HelpMessageOpt("-datacarrier", strprintf(_("Relay and mine data carrier transactions (default: %u)"), DEFAULT_ACCEPT_DATACARRIER));
|
strUsage += HelpMessageOpt("-datacarrier", strprintf(_("Relay and mine data carrier transactions (default: %u)"), DEFAULT_ACCEPT_DATACARRIER));
|
||||||
strUsage += HelpMessageOpt("-datacarriersize", strprintf(_("Maximum size of data in data carrier transactions we relay and mine (default: %u)"), MAX_OP_RETURN_RELAY));
|
strUsage += HelpMessageOpt("-datacarriersize", strprintf(_("Maximum size of data in data carrier transactions we relay and mine (default: %u)"), MAX_OP_RETURN_RELAY));
|
||||||
strUsage += HelpMessageOpt("-mempoolreplacement", strprintf(_("Enable transaction replacement in the memory pool (default: %u)"), DEFAULT_ENABLE_REPLACEMENT));
|
strUsage += HelpMessageOpt("-mempoolreplacement", strprintf(_("Enable transaction replacement in the memory pool (default: %u)"), DEFAULT_ENABLE_REPLACEMENT));
|
||||||
|
|
|
@ -74,7 +74,6 @@ bool fHavePruned = false;
|
||||||
bool fPruneMode = false;
|
bool fPruneMode = false;
|
||||||
bool fIsBareMultisigStd = DEFAULT_PERMIT_BAREMULTISIG;
|
bool fIsBareMultisigStd = DEFAULT_PERMIT_BAREMULTISIG;
|
||||||
bool fRequireStandard = true;
|
bool fRequireStandard = true;
|
||||||
unsigned int nBytesPerSigOp = DEFAULT_BYTES_PER_SIGOP;
|
|
||||||
bool fCheckBlockIndex = false;
|
bool fCheckBlockIndex = false;
|
||||||
bool fCheckpointsEnabled = DEFAULT_CHECKPOINTS_ENABLED;
|
bool fCheckpointsEnabled = DEFAULT_CHECKPOINTS_ENABLED;
|
||||||
size_t nCoinCacheUsage = 5000 * 300;
|
size_t nCoinCacheUsage = 5000 * 300;
|
||||||
|
@ -1296,7 +1295,7 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C
|
||||||
// itself can contain sigops MAX_STANDARD_TX_SIGOPS is less than
|
// itself can contain sigops MAX_STANDARD_TX_SIGOPS is less than
|
||||||
// MAX_BLOCK_SIGOPS; we still consider this an invalid rather than
|
// MAX_BLOCK_SIGOPS; we still consider this an invalid rather than
|
||||||
// merely non-standard transaction.
|
// merely non-standard transaction.
|
||||||
if ((nSigOpsCost > MAX_STANDARD_TX_SIGOPS_COST) || (nBytesPerSigOp && nSigOpsCost > nSize * WITNESS_SCALE_FACTOR / nBytesPerSigOp))
|
if (nSigOpsCost > MAX_STANDARD_TX_SIGOPS_COST)
|
||||||
return state.DoS(0, false, REJECT_NONSTANDARD, "bad-txns-too-many-sigops", false,
|
return state.DoS(0, false, REJECT_NONSTANDARD, "bad-txns-too-many-sigops", false,
|
||||||
strprintf("%d", nSigOpsCost));
|
strprintf("%d", nSigOpsCost));
|
||||||
|
|
||||||
|
|
|
@ -124,7 +124,6 @@ static const int64_t DEFAULT_MAX_TIP_AGE = 24 * 60 * 60;
|
||||||
|
|
||||||
/** Default for -permitbaremultisig */
|
/** Default for -permitbaremultisig */
|
||||||
static const bool DEFAULT_PERMIT_BAREMULTISIG = true;
|
static const bool DEFAULT_PERMIT_BAREMULTISIG = true;
|
||||||
static const unsigned int DEFAULT_BYTES_PER_SIGOP = 20;
|
|
||||||
static const bool DEFAULT_CHECKPOINTS_ENABLED = true;
|
static const bool DEFAULT_CHECKPOINTS_ENABLED = true;
|
||||||
static const bool DEFAULT_TXINDEX = false;
|
static const bool DEFAULT_TXINDEX = false;
|
||||||
static const unsigned int DEFAULT_BANSCORE_THRESHOLD = 100;
|
static const unsigned int DEFAULT_BANSCORE_THRESHOLD = 100;
|
||||||
|
@ -165,7 +164,6 @@ extern int nScriptCheckThreads;
|
||||||
extern bool fTxIndex;
|
extern bool fTxIndex;
|
||||||
extern bool fIsBareMultisigStd;
|
extern bool fIsBareMultisigStd;
|
||||||
extern bool fRequireStandard;
|
extern bool fRequireStandard;
|
||||||
extern unsigned int nBytesPerSigOp;
|
|
||||||
extern bool fCheckBlockIndex;
|
extern bool fCheckBlockIndex;
|
||||||
extern bool fCheckpointsEnabled;
|
extern bool fCheckpointsEnabled;
|
||||||
extern size_t nCoinCacheUsage;
|
extern size_t nCoinCacheUsage;
|
||||||
|
|
|
@ -151,12 +151,14 @@ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t GetVirtualTransactionSize(int64_t nWeight)
|
unsigned int nBytesPerSigOp = DEFAULT_BYTES_PER_SIGOP;
|
||||||
|
|
||||||
|
int64_t GetVirtualTransactionSize(int64_t nWeight, int64_t nSigOpCost)
|
||||||
{
|
{
|
||||||
return (nWeight + WITNESS_SCALE_FACTOR - 1) / WITNESS_SCALE_FACTOR;
|
return (std::max(nWeight, nSigOpCost * nBytesPerSigOp) + WITNESS_SCALE_FACTOR - 1) / WITNESS_SCALE_FACTOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t GetVirtualTransactionSize(const CTransaction& tx)
|
int64_t GetVirtualTransactionSize(const CTransaction& tx, int64_t nSigOpCost)
|
||||||
{
|
{
|
||||||
return GetVirtualTransactionSize(GetTransactionWeight(tx));
|
return GetVirtualTransactionSize(GetTransactionWeight(tx), nSigOpCost);
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,8 @@ static const unsigned int MAX_P2SH_SIGOPS = 15;
|
||||||
static const unsigned int MAX_STANDARD_TX_SIGOPS_COST = MAX_BLOCK_SIGOPS_COST/5;
|
static const unsigned int MAX_STANDARD_TX_SIGOPS_COST = MAX_BLOCK_SIGOPS_COST/5;
|
||||||
/** Default for -maxmempool, maximum megabytes of mempool memory usage */
|
/** Default for -maxmempool, maximum megabytes of mempool memory usage */
|
||||||
static const unsigned int DEFAULT_MAX_MEMPOOL_SIZE = 300;
|
static const unsigned int DEFAULT_MAX_MEMPOOL_SIZE = 300;
|
||||||
|
/** Default for -bytespersigop */
|
||||||
|
static const unsigned int DEFAULT_BYTES_PER_SIGOP = 20;
|
||||||
/**
|
/**
|
||||||
* Standard script verification flags that standard transactions will comply
|
* Standard script verification flags that standard transactions will comply
|
||||||
* with. However scripts violating these flags may still be present in valid
|
* with. However scripts violating these flags may still be present in valid
|
||||||
|
@ -66,8 +68,10 @@ bool IsStandardTx(const CTransaction& tx, std::string& reason);
|
||||||
*/
|
*/
|
||||||
bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs);
|
bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs);
|
||||||
|
|
||||||
|
extern unsigned int nBytesPerSigOp;
|
||||||
|
|
||||||
/** Compute the virtual transaction size (weight reinterpreted as bytes). */
|
/** Compute the virtual transaction size (weight reinterpreted as bytes). */
|
||||||
int64_t GetVirtualTransactionSize(int64_t nWeight);
|
int64_t GetVirtualTransactionSize(int64_t nWeight, int64_t nSigOpCost);
|
||||||
int64_t GetVirtualTransactionSize(const CTransaction& tx);
|
int64_t GetVirtualTransactionSize(const CTransaction& tx, int64_t nSigOpCost = 0);
|
||||||
|
|
||||||
#endif // BITCOIN_POLICY_POLICY_H
|
#endif // BITCOIN_POLICY_POLICY_H
|
||||||
|
|
|
@ -75,7 +75,7 @@ void CTxMemPoolEntry::UpdateLockPoints(const LockPoints& lp)
|
||||||
|
|
||||||
size_t CTxMemPoolEntry::GetTxSize() const
|
size_t CTxMemPoolEntry::GetTxSize() const
|
||||||
{
|
{
|
||||||
return GetVirtualTransactionSize(nTxWeight);
|
return GetVirtualTransactionSize(nTxWeight, sigOpCost);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the given tx for any in-mempool descendants.
|
// Update the given tx for any in-mempool descendants.
|
||||||
|
|
Loading…
Reference in a new issue