mirror of
https://github.com/Retropex/bitcoin.git
synced 2025-05-27 20:42:33 +02:00
Restore original bytespersigop as bytespersigopstrict
Plus a bugfix to accurately count sigops for this purpose
This commit is contained in:
parent
142eb4992b
commit
ab4abe8097
@ -580,6 +580,7 @@ void SetupServerArgs(ArgsManager& argsman)
|
||||
argsman.AddArg("-incrementalrelayfee=<amt>", strprintf("Fee rate (in %s/kvB) used to define cost of relay, used for mempool limiting and replacement policy. (default: %s)", CURRENCY_UNIT, FormatMoney(DEFAULT_INCREMENTAL_RELAY_FEE)), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::NODE_RELAY);
|
||||
argsman.AddArg("-dustrelayfee=<amt>", strprintf("Fee rate (in %s/kvB) used to define dust, the value of an output such that it will cost more than its value in fees at this fee rate to spend it. (default: %s)", CURRENCY_UNIT, FormatMoney(DUST_RELAY_TX_FEE)), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::NODE_RELAY);
|
||||
argsman.AddArg("-bytespersigop", strprintf("Equivalent bytes per sigop in transactions for relay and mining (default: %u)", DEFAULT_BYTES_PER_SIGOP), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
|
||||
argsman.AddArg("-bytespersigopstrict", strprintf("Minimum bytes per sigop in transactions we relay and mine (default: %u)", DEFAULT_BYTES_PER_SIGOP_STRICT), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
|
||||
argsman.AddArg("-datacarrier", strprintf("Relay and mine data carrier transactions (default: %u)", DEFAULT_ACCEPT_DATACARRIER), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
|
||||
argsman.AddArg("-datacarriersize", strprintf("Maximum size of data in data carrier transactions we relay and mine (default: %u)", MAX_OP_RETURN_RELAY), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
|
||||
argsman.AddArg("-mempoolfullrbf", strprintf("Accept transaction replace-by-fee without requiring replaceability signaling (default: %u)", DEFAULT_MEMPOOL_FULL_RBF), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
|
||||
|
@ -7,6 +7,7 @@
|
||||
|
||||
#include <policy/policy.h>
|
||||
|
||||
#include <consensus/tx_verify.h>
|
||||
#include <coins.h>
|
||||
#include <consensus/amount.h>
|
||||
#include <consensus/consensus.h>
|
||||
|
@ -36,6 +36,8 @@ static constexpr unsigned int MAX_STANDARD_TX_SIGOPS_COST{MAX_BLOCK_SIGOPS_COST/
|
||||
static constexpr unsigned int DEFAULT_INCREMENTAL_RELAY_FEE{1000};
|
||||
/** Default for -bytespersigop */
|
||||
static constexpr unsigned int DEFAULT_BYTES_PER_SIGOP{20};
|
||||
/** Default for -bytespersigopstrict */
|
||||
static constexpr unsigned int DEFAULT_BYTES_PER_SIGOP_STRICT{20};
|
||||
/** Default for -permitbaremultisig */
|
||||
static constexpr bool DEFAULT_PERMIT_BAREMULTISIG{true};
|
||||
/** The maximum number of witness stack items in a standard P2WSH script */
|
||||
|
@ -8,3 +8,4 @@
|
||||
#include <policy/policy.h>
|
||||
|
||||
unsigned int nBytesPerSigOp = DEFAULT_BYTES_PER_SIGOP;
|
||||
unsigned int nBytesPerSigOpStrict = DEFAULT_BYTES_PER_SIGOP_STRICT;
|
||||
|
@ -7,5 +7,6 @@
|
||||
#define BITCOIN_POLICY_SETTINGS_H
|
||||
|
||||
extern unsigned int nBytesPerSigOp;
|
||||
extern unsigned int nBytesPerSigOpStrict;
|
||||
|
||||
#endif // BITCOIN_POLICY_SETTINGS_H
|
||||
|
@ -260,6 +260,38 @@ bool CheckSequenceLocksAtTip(CBlockIndex* tip,
|
||||
// Returns the script flags which should be checked for a given block
|
||||
static unsigned int GetBlockScriptFlags(const CBlockIndex& block_index, const ChainstateManager& chainman);
|
||||
|
||||
/** Compute accurate total signature operation cost of a transaction.
|
||||
* Not consensus-critical, since legacy sigops counting is always used in the protocol.
|
||||
*/
|
||||
int64_t GetAccurateTransactionSigOpCost(const CTransaction& tx, const CCoinsViewCache& inputs, int flags)
|
||||
{
|
||||
if (tx.IsCoinBase()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned int nSigOps = 0;
|
||||
for (const auto& txin : tx.vin) {
|
||||
nSigOps += txin.scriptSig.GetSigOpCount(false);
|
||||
}
|
||||
|
||||
if (flags & SCRIPT_VERIFY_P2SH) {
|
||||
nSigOps += GetP2SHSigOpCount(tx, inputs);
|
||||
}
|
||||
|
||||
nSigOps *= WITNESS_SCALE_FACTOR;
|
||||
|
||||
if (flags & SCRIPT_VERIFY_WITNESS) {
|
||||
for (const auto& txin : tx.vin) {
|
||||
const Coin& coin = inputs.AccessCoin(txin.prevout);
|
||||
assert(!coin.IsSpent());
|
||||
const CTxOut &prevout = coin.out;
|
||||
nSigOps += CountWitnessSigOps(txin.scriptSig, prevout.scriptPubKey, &txin.scriptWitness, flags);
|
||||
}
|
||||
}
|
||||
|
||||
return nSigOps;
|
||||
}
|
||||
|
||||
void LimitMempoolSize(CTxMemPool& pool, CCoinsViewCache& coins_cache)
|
||||
EXCLUSIVE_LOCKS_REQUIRED(::cs_main, pool.cs)
|
||||
{
|
||||
@ -860,9 +892,12 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
|
||||
fSpendsCoinbase, nSigOpsCost, lock_points.value()));
|
||||
ws.m_vsize = entry->GetTxSize();
|
||||
|
||||
if (nSigOpsCost > MAX_STANDARD_TX_SIGOPS_COST)
|
||||
// To avoid rejecting low-sigop bare-multisig transactions, the sigops
|
||||
// are counted a second time more accurately.
|
||||
if ((nSigOpsCost > MAX_STANDARD_TX_SIGOPS_COST) || (nBytesPerSigOpStrict && GetAccurateTransactionSigOpCost(tx, m_view, STANDARD_SCRIPT_VERIFY_FLAGS) > ws.m_vsize * WITNESS_SCALE_FACTOR / nBytesPerSigOpStrict)) {
|
||||
MaybeRejectDbg(TxValidationResult::TX_NOT_STANDARD, "bad-txns-too-many-sigops",
|
||||
strprintf("%d", nSigOpsCost));
|
||||
}
|
||||
|
||||
// No individual transactions are allowed below the min relay feerate and mempool min feerate except from
|
||||
// disconnected blocks and transactions in a package. Package transactions will be checked using
|
||||
|
Loading…
Reference in New Issue
Block a user