v31.1-roots.1 · Commit 3: [PATCH 03/17] feat(policy): preserve cluster accounting and repair dynamic dust
src/policy/policy.cpp
Before: src/policy/policy.cpp · After: src/policy/policy.cpp
File metadata
index d0455dd98cedea3adbc884b10ed5a1e58c570eb1..ae484bb292cfa24dec6f10fff5e55cbaa505be19 100644
Download original patch · Release notes
Diff rows 1–38 of 38. Line numbers refer to the original before/after files.
+ Added− RemovedUnmarked lines are context.
Scroll the code area horizontally to read long lines. Before is on the left; after is on the right. Unified view fits narrow screens more easily.
src/policy/policy.cpp
CHANGED
|
@@ -26,6 +26,9 @@
|
|
| 26 |
#include <utility>
|
| 27 |
#include <vector>
|
| 28 |
|
|
|
|
|
|
|
|
|
|
| 29 |
CAmount GetDustThreshold(const CTxOut& txout, const CFeeRate& dustRelayFeeIn)
|
| 30 |
{
|
| 31 |
// "Dust" is defined in terms of dustRelayFee,
|
|
@@ -692,3 +695,29 @@ bool IsWitnessStandard(const CTransaction& tx, const CCoinsViewCache& inputs)
|
|
| 692 |
std::string reason;
|
| 693 |
return IsWitnessStandard(tx, inputs, "", reason);
|
| 694 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
#include <utility>
|
| 27 |
#include <vector>
|
| 28 |
|
| 29 |
+
// Standardness also links into standalone wallet tools through bitcoin_common.
|
| 30 |
+
unsigned int g_script_size_policy_limit = DEFAULT_SCRIPT_SIZE_POLICY_LIMIT;
|
| 31 |
+
|
| 32 |
CAmount GetDustThreshold(const CTxOut& txout, const CFeeRate& dustRelayFeeIn)
|
| 33 |
{
|
| 34 |
// "Dust" is defined in terms of dustRelayFee,
|
|
|
|
| 695 |
std::string reason;
|
| 696 |
return IsWitnessStandard(tx, inputs, "", reason);
|
| 697 |
}
|
| 698 |
+
|
| 699 |
+
int32_t CalculateExtraTxWeight(const CTransaction& tx, const CCoinsViewCache& view, const unsigned int weight_per_data_byte)
|
| 700 |
+
{
|
| 701 |
+
int64_t mod_weight{0};
|
| 702 |
+
|
| 703 |
+
// Add in any extra weight for data bytes
|
| 704 |
+
if (weight_per_data_byte > 1) {
|
| 705 |
+
for (const CTxIn& txin : tx.vin) {
|
| 706 |
+
const CTxOut &utxo = view.AccessCoin(txin.prevout).out;
|
| 707 |
+
auto[script, consensus_weight_per_byte] = GetScriptForTransactionInput(utxo.scriptPubKey, txin);
|
| 708 |
+
if (weight_per_data_byte > consensus_weight_per_byte) {
|
| 709 |
+
const auto dcb = ScriptDatacarrierBytes(script, 0, &txin.scriptWitness);
|
| 710 |
+
mod_weight += int64_t(dcb.first + dcb.second) * (weight_per_data_byte - consensus_weight_per_byte);
|
| 711 |
+
}
|
| 712 |
+
}
|
| 713 |
+
if (weight_per_data_byte > WITNESS_SCALE_FACTOR) {
|
| 714 |
+
for (size_t i{tx.vout.size()}; i; ) {
|
| 715 |
+
const CTxOut& txout = tx.vout[--i];
|
| 716 |
+
const auto dcb = ScriptDatacarrierBytes(txout.scriptPubKey, tx.vout.size() - i);
|
| 717 |
+
mod_weight += int64_t(dcb.first + dcb.second) * (weight_per_data_byte - WITNESS_SCALE_FACTOR);
|
| 718 |
+
}
|
| 719 |
+
}
|
| 720 |
+
}
|
| 721 |
+
|
| 722 |
+
return int32_t(std::min(mod_weight, int64_t{std::numeric_limits<int32_t>::max()}));
|
| 723 |
+
}
|