Skip to content
Bitcoin Roots

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. The two line-number columns refer to before and after.

doc/roots-features.md CHANGED
@@ -14,11 +14,12 @@ These upstream build conditions are not evidence that a missing optional
14
14
  library or platform was tested. See [portability profiles](roots-build-portability.md).
15
15
 
16
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
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
22
23
  equivalence; this does not retire the remaining operator-stats contract.
23
24
 
24
25
  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
29
  option to CMake does not implement it. No intended behavior is retired by a
29
30
  missing dependency.
30
31
 
31
- Code and test references in the contract body identify paths at pinned source
32
+ Unless explicitly marked as candidate evidence, code and test references in the
33
+ contract body identify paths at pinned source
32
34
  `10d772eb7f4b00b5193428a0dde4c06558d6c297`; they are rendered as source
33
35
  references rather than links into this candidate when their implementation
34
36
  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
43
  commit `49faec4f87f5cd19c88db01a82e5c68b087c8227`. Source and test links are
42
44
  version-specific aids; neither a function name nor the location of an admission
43
45
  check is a preservation requirement. The contracts do not authorize a change in
44
- consensus, a new feature, or repair of a documented gap.
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.
45
49
 
46
50
  **Acceptance rule for every ID:** preserve its observable results, defaults,
47
51
  supported configuration, units, errors and boundaries. Tests named below are
@@ -60,6 +64,35 @@ compatibility decision.
60
64
 
61
65
  ### Local policy and mining
62
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
+
63
96
  - **policy-parsing:** the [policy input compatibility contract](feature-contracts/policy-parsing.md)
64
97
  specifies scoped grammar, effective defaults, diagnostics, migration decisions
65
98
  and baseline characterization for Roots-added policy controls. Parser and
@@ -133,6 +166,11 @@ compatibility decision.
133
166
  `DynamicDustFeePublication` covers changing snapshots. Gap: estimator-target
134
167
  mode without an estimator is accepted by the parser; it is not evidence of a
135
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.
136
174
  - **policy-subdust:** apply a configurable deficit penalty to modified fees,
137
175
  using script-specific dust thresholds, without changing the actual fee or
138
176
  consensus validity. Enabled by default. The
@@ -163,8 +201,10 @@ compatibility decision.
163
201
  to coinbase consensus maturity. See coin age (`src/policy/coin_age_priority.cpp`, source reference)
164
202
  and admission (`src/validation.cpp`, source reference). Acceptance: priority accounting cases in
165
203
  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.
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.
168
208
  - **policy-reuse:** `spkreuse=allow` defaults to no extra restriction. The
169
209
  documented alternative `conflict` uses mempool scriptPubKey creation/spend
170
210
  tracking to reject reuse or consider policy conflicts for replacement. This is a local