v31.1-roots.1 · Commit 2: [PATCH 02/17] feat(policy): preserve Roots parsing and local transaction checks
doc/roots-features.md
Before: doc/roots-features.md · After: doc/roots-features.md
File metadata
index 48a828421d2248b4362e480e8c5f0088978a010d..3d43f86a86b05d1e57fcde41291f99e25ab824c2 100644
Download original patch · Release notes
Diff rows 1–94 of 94. 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.
doc/roots-features.md
CHANGED
|
@@ -14,11 +14,12 @@ These upstream build conditions are not evidence that a missing optional
|
|
| 14 |
library or platform was tested. See [portability profiles](roots-build-portability.md).
|
| 15 |
|
| 16 |
The source contracts below are preservation requirements, **not a claim that
|
| 17 |
-
Roots behavior has been ported**. Local policy/mining and strict Roots parsing
|
| 18 |
-
are deferred to L7; peer controls/health to L8; sweep, coin-control and per-send
|
| 19 |
-
RBF extensions to L9; read/write config, effective-policy RPC, resource support
|
| 20 |
-
and dormant statistics to L10; identity/desktop and maintenance integration to
|
| 21 |
-
L11. The narrow monotonic `uptime` RPC sub-aspect has reviewed upstream
|
|
|
|
| 22 |
equivalence; this does not retire the remaining operator-stats contract.
|
| 23 |
|
| 24 |
MiniUPnPc dependency discovery is retained, but its UPnP runtime and depends
|
|
@@ -28,7 +29,8 @@ progress remains deferred to desktop integration. Passing either undeclared
|
|
| 28 |
option to CMake does not implement it. No intended behavior is retired by a
|
| 29 |
missing dependency.
|
| 30 |
|
| 31 |
-
Code and test references in the contract body identify paths at pinned source
|
|
|
|
| 32 |
`10d772eb7f4b00b5193428a0dde4c06558d6c297`; they are rendered as source
|
| 33 |
references rather than links into this candidate when their implementation
|
| 34 |
has not been carried. Historical test results are not current candidate passes.
|
|
@@ -41,7 +43,9 @@ The source checked for this collection is Roots
|
|
| 41 |
commit `49faec4f87f5cd19c88db01a82e5c68b087c8227`. Source and test links are
|
| 42 |
version-specific aids; neither a function name nor the location of an admission
|
| 43 |
check is a preservation requirement. The contracts do not authorize a change in
|
| 44 |
-
consensus, a new feature, or repair of a documented gap.
|
|
|
|
|
|
|
| 45 |
|
| 46 |
**Acceptance rule for every ID:** preserve its observable results, defaults,
|
| 47 |
supported configuration, units, errors and boundaries. Tests named below are
|
|
@@ -60,6 +64,35 @@ compatibility decision.
|
|
| 60 |
|
| 61 |
### Local policy and mining
|
| 62 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 63 |
- **policy-parsing:** the [policy input compatibility contract](feature-contracts/policy-parsing.md)
|
| 64 |
specifies scoped grammar, effective defaults, diagnostics, migration decisions
|
| 65 |
and baseline characterization for Roots-added policy controls. Parser and
|
|
@@ -133,6 +166,11 @@ compatibility decision.
|
|
| 133 |
`DynamicDustFeePublication` covers changing snapshots. Gap: estimator-target
|
| 134 |
mode without an estimator is accepted by the parser; it is not evidence of a
|
| 135 |
working estimate. Extreme dynamic multiplier arithmetic needs separate coverage.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 136 |
- **policy-subdust:** apply a configurable deficit penalty to modified fees,
|
| 137 |
using script-specific dust thresholds, without changing the actual fee or
|
| 138 |
consensus validity. Enabled by default. The
|
|
@@ -163,8 +201,10 @@ compatibility decision.
|
|
| 163 |
to coinbase consensus maturity. See coin age (`src/policy/coin_age_priority.cpp`, source reference)
|
| 164 |
and admission (`src/validation.cpp`, source reference). Acceptance: priority accounting cases in
|
| 165 |
miner_tests.cpp (`src/test/miner_tests.cpp`, source reference) `CreateNewBlock_validity` cover the
|
| 166 |
-
shared age cache. Gap: dedicated enabled/disabled relay maturity/coin-block
|
| 167 |
-
boundaries and their valid-block fixtures.
|
|
|
|
|
|
|
| 168 |
- **policy-reuse:** `spkreuse=allow` defaults to no extra restriction. The
|
| 169 |
documented alternative `conflict` uses mempool scriptPubKey creation/spend
|
| 170 |
tracking to reject reuse or consider policy conflicts for replacement. This is a local
|
|
|
|
| 14 |
library or platform was tested. See [portability profiles](roots-build-portability.md).
|
| 15 |
|
| 16 |
The source contracts below are preservation requirements, **not a claim that
|
| 17 |
+
Roots behavior has been ported**. L7 implements scoped parsing and local transaction checks; graph accounting,
|
| 18 |
+
replacement/TRUC/reuse and dynamic dust are deferred to L8, and priority/template
|
| 19 |
+
mining to L9; peer controls/health to L10; sweep, coin-control and per-send
|
| 20 |
+
RBF extensions to L11; read/write config, effective-policy RPC, resource support
|
| 21 |
+
and dormant statistics to L12; identity/desktop and maintenance integration to
|
| 22 |
+
L13. The narrow monotonic `uptime` RPC sub-aspect has reviewed upstream
|
| 23 |
equivalence; this does not retire the remaining operator-stats contract.
|
| 24 |
|
| 25 |
MiniUPnPc dependency discovery is retained, but its UPnP runtime and depends
|
|
|
|
| 29 |
option to CMake does not implement it. No intended behavior is retired by a
|
| 30 |
missing dependency.
|
| 31 |
|
| 32 |
+
Unless explicitly marked as candidate evidence, code and test references in the
|
| 33 |
+
contract body identify paths at pinned source
|
| 34 |
`10d772eb7f4b00b5193428a0dde4c06558d6c297`; they are rendered as source
|
| 35 |
references rather than links into this candidate when their implementation
|
| 36 |
has not been carried. Historical test results are not current candidate passes.
|
|
|
|
| 43 |
commit `49faec4f87f5cd19c88db01a82e5c68b087c8227`. Source and test links are
|
| 44 |
version-specific aids; neither a function name nor the location of an admission
|
| 45 |
check is a preservation requirement. The contracts do not authorize a change in
|
| 46 |
+
consensus or a new feature. The user explicitly authorized the bounded L8
|
| 47 |
+
dynamic-dust startup/lifetime, missing-estimate fallback and safe-scaling repair;
|
| 48 |
+
other documented gaps remain preservation limitations.
|
| 49 |
|
| 50 |
**Acceptance rule for every ID:** preserve its observable results, defaults,
|
| 51 |
supported configuration, units, errors and boundaries. Tests named below are
|
|
|
|
| 64 |
|
| 65 |
### Local policy and mining
|
| 66 |
|
| 67 |
+
The L7 candidate implements `policy-parsing`, `policy-standardness`, carrier
|
| 68 |
+
recognition/budgets within `policy-carrier`, fixed thresholds and ephemeral
|
| 69 |
+
exceptions within `policy-dust`, and relay gates within `policy-coinage`.
|
| 70 |
+
Focused candidate acceptance passed in
|
| 71 |
+
[`policy_args_tests.cpp`](../src/test/policy_args_tests.cpp),
|
| 72 |
+
[`transaction_tests.cpp`](../src/test/transaction_tests.cpp),
|
| 73 |
+
[`feature_policy_args.py`](../test/functional/feature_policy_args.py),
|
| 74 |
+
[`mempool_datacarrier.py`](../test/functional/mempool_datacarrier.py),
|
| 75 |
+
[`mempool_dust.py`](../test/functional/mempool_dust.py),
|
| 76 |
+
[`mempool_sigoplimit.py`](../test/functional/mempool_sigoplimit.py), and
|
| 77 |
+
[`mempool_roots_local_policy.py`](../test/functional/mempool_roots_local_policy.py).
|
| 78 |
+
The last test covers enabled/disabled relay age, unconfirmed age, exact
|
| 79 |
+
coin-block boundaries, extreme configured bounds, local filter/ephemeral
|
| 80 |
+
switches and consensus-valid blocks for CAT21 and relay-age rejections.
|
| 81 |
+
L7.2 adds tip-reorg age checks, carrier full-count/standardness independence,
|
| 82 |
+
and consensus-valid blocks for local marker, pubkey, witness-version, token,
|
| 83 |
+
multiple-OP_RETURN, dust and relay-age rejections. The complete native unit
|
| 84 |
+
suite and applicable package/replacement/TRUC/cluster/mining functional suites
|
| 85 |
+
are candidate verification gates, with explicit local allowances in resource
|
| 86 |
+
fixtures. The v31
|
| 87 |
+
[`policy_args` fuzz target](../src/test/fuzz/policy_args.cpp) retains L5's grammar
|
| 88 |
+
oracles; [`transaction`](../src/test/fuzz/transaction.cpp) also exercises carrier
|
| 89 |
+
recognition. Bounded Clang 19 ASan/UBSan/libFuzzer campaigns executed these and
|
| 90 |
+
native coins-view policy callers with reproducible seeds. Final L7 review remains
|
| 91 |
+
pending; a bounded campaign is not exhaustive coverage.
|
| 92 |
+
Source acceptance and gaps below remain historical evidence; L8 owns carrier
|
| 93 |
+
extra weight, dynamic dust, subdust, replacement/TRUC and reuse, and L9 owns
|
| 94 |
+
mining. Explicitly supplied staged options warn that they are not enforced.
|
| 95 |
+
|
| 96 |
- **policy-parsing:** the [policy input compatibility contract](feature-contracts/policy-parsing.md)
|
| 97 |
specifies scoped grammar, effective defaults, diagnostics, migration decisions
|
| 98 |
and baseline characterization for Roots-added policy controls. Parser and
|
|
|
|
| 166 |
`DynamicDustFeePublication` covers changing snapshots. Gap: estimator-target
|
| 167 |
mode without an estimator is accepted by the parser; it is not evidence of a
|
| 168 |
working estimate. Extreme dynamic multiplier arithmetic needs separate coverage.
|
| 169 |
+
The source also aborts non-off startup because scheduler wiring is missing.
|
| 170 |
+
L8's explicitly authorized repair must add node-owned scheduling after successful
|
| 171 |
+
initialization, safe retry/shutdown lifetime, unavailable-estimator floor fallback
|
| 172 |
+
and overflow-safe scaling, with regression coverage. L7 carries syntax only;
|
| 173 |
+
this repaired runtime is not yet implemented.
|
| 174 |
- **policy-subdust:** apply a configurable deficit penalty to modified fees,
|
| 175 |
using script-specific dust thresholds, without changing the actual fee or
|
| 176 |
consensus validity. Enabled by default. The
|
|
|
|
| 201 |
to coinbase consensus maturity. See coin age (`src/policy/coin_age_priority.cpp`, source reference)
|
| 202 |
and admission (`src/validation.cpp`, source reference). Acceptance: priority accounting cases in
|
| 203 |
miner_tests.cpp (`src/test/miner_tests.cpp`, source reference) `CreateNewBlock_validity` cover the
|
| 204 |
+
shared age cache. Historical source gap: dedicated enabled/disabled relay
|
| 205 |
+
maturity/coin-block boundaries and valid-block fixtures. The candidate's
|
| 206 |
+
`mempool_roots_local_policy.py` supplies those cases and tip-reorg checks;
|
| 207 |
+
it does not port L9's priority cache or mining interactions.
|
| 208 |
- **policy-reuse:** `spkreuse=allow` defaults to no extra restriction. The
|
| 209 |
documented alternative `conflict` uses mempool scriptPubKey creation/spend
|
| 210 |
tracking to reject reuse or consider policy conflicts for replacement. This is a local
|