v31.1-roots.1 · Commit 4: [PATCH 04/17] feat(mining): preserve Roots priority and template policies
doc/roots-v31-port-review.md
Before: doc/roots-v31-port-review.md · After: doc/roots-v31-port-review.md
File metadata
index ed0e6801d8e20769989961c3e1f2eb053db943ff..17b088f77e5b1e74c074db3f70766dea64156ca2 100644
Download original patch · Release notes
Diff rows 1–121 of 121. 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-v31-port-review.md
CHANGED
|
@@ -108,7 +108,7 @@ contract with remaining Roots behavior. Existing source gaps remain explicit.
|
|
| 108 |
|
| 109 |
| Contract | Disposition / theme | Upstream comparison, adaptation and acceptance gate |
|
| 110 |
| --- | --- | --- |
|
| 111 |
-
| policy-parsing | adapted / L7,L8 | `node::ApplyArgsManOptions` consumes cluster limits and scoped grammar; L8 consumes graph controls and repairs dynamic-dust publication. Mining controls remain parsing-only until L9. Preserve L2's complete-token/range/diagnostic decisions, quarter-vbyte rounding and CLI/config precedence. Parser unit/startup and L5 fuzz boundaries are carried; integrated read/write precedence remains L12. |
|
| 112 |
| effective-policy | adapted / L12 | `getmempoolinfo` has cluster-era size/fee information but no Roots `policy` object. Read authoritative initialized v31 state plus synchronized dynamic dust; retain L3's schema, units and enforcement gates. Port `rpc_effective_policy.py`, help and admission parity assertions. L4 supplied no snapshot refactor to carry. |
|
| 113 |
| policy-standardness | adapted / L7 | Core `IsStandardTx` takes carrier budget, bare-multisig flag and dust rate. Core permits bare multisig by default and lacks Roots configurable script/witness, strict sigop, CAT21/token and ephemeral modes. Preserve Roots limits/defaults/reasons solely in local gates. Run transaction/sigop/TRUC cases and valid-block fixtures; do not change script consensus. |
|
| 114 |
| policy-carrier | adapted / L7,L8 | Core defaults to a 100,000-vbyte OP_RETURN budget, not Roots' aggregate 83-byte budget, and lacks recognized input/witness carriers and cost weighting. L7 adapts detection/budgets; L8 adapts extra policy weight to `TxGraph` fee/weight accounting. Retain Roots `multi-op-return` rejection despite source help conflict. Port `mempool_datacarrier.py`, extra-weight boundaries, tapscript and L5 dust-cost interactions. |
|
|
@@ -347,8 +347,8 @@ L5 interaction ownership remains bounded:
|
|
| 347 |
| Parser grammar, types, negation, cost and dynamic syntax round trips | L7 unit/startup and actual sanitizer fuzz; no dynamic runtime claim. |
|
| 348 |
| Fixed dust thresholds, ephemeral/local standardness, carrier budgets and valid blocks | L7 focused tests and broader native regression fixtures. |
|
| 349 |
| Subdust deficit rounding/saturation, carrier extra weight, fee deltas, replacement/package/TRUC/reuse combinations | L8; existing source methods and arithmetic fuzz remain required gates. L7's native regression runs do not establish these Roots extensions. |
|
| 350 |
-
| Dynamic startup, publication, estimator fallback, extreme scaling and retry/shutdown | Authorized bounded L8 repair, still deferred; default off remains unchanged. |
|
| 351 |
-
| Priority ancestors, residual mining, template normalization, actual-versus-modified reward interactions | L9, including source L5 joint mining/block fixtures; native mining passes are regression evidence only. |
|
| 352 |
| Integrated Roots confrw precedence | L12 only; ordinary CLI/config/JSON cases run in L7. |
|
| 353 |
|
| 354 |
Prior-release mempool compatibility remains skipped because release fixtures are
|
|
@@ -450,3 +450,103 @@ publication, changing-rate test and standardness-snapshot source history.
|
|
| 450 |
L8.1's conservative representable-case graph restrictions remain explicit in
|
| 451 |
[sub-dust semantics](feature-contracts/subdust.md). L9 mining combinations and
|
| 452 |
L12 integrated runtime configuration remain their respective owners.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 108 |
|
| 109 |
| Contract | Disposition / theme | Upstream comparison, adaptation and acceptance gate |
|
| 110 |
| --- | --- | --- |
|
| 111 |
+
| policy-parsing | adapted / L7,L8 | `node::ApplyArgsManOptions` consumes cluster limits and scoped grammar; L8 consumes graph controls and repairs dynamic-dust publication. L9 consumes mining size and priority controls. Preserve L2's complete-token/range/diagnostic decisions, quarter-vbyte rounding and CLI/config precedence. Parser unit/startup and L5 fuzz boundaries are carried; integrated read/write precedence remains L12. |
|
| 112 |
| effective-policy | adapted / L12 | `getmempoolinfo` has cluster-era size/fee information but no Roots `policy` object. Read authoritative initialized v31 state plus synchronized dynamic dust; retain L3's schema, units and enforcement gates. Port `rpc_effective_policy.py`, help and admission parity assertions. L4 supplied no snapshot refactor to carry. |
|
| 113 |
| policy-standardness | adapted / L7 | Core `IsStandardTx` takes carrier budget, bare-multisig flag and dust rate. Core permits bare multisig by default and lacks Roots configurable script/witness, strict sigop, CAT21/token and ephemeral modes. Preserve Roots limits/defaults/reasons solely in local gates. Run transaction/sigop/TRUC cases and valid-block fixtures; do not change script consensus. |
|
| 114 |
| policy-carrier | adapted / L7,L8 | Core defaults to a 100,000-vbyte OP_RETURN budget, not Roots' aggregate 83-byte budget, and lacks recognized input/witness carriers and cost weighting. L7 adapts detection/budgets; L8 adapts extra policy weight to `TxGraph` fee/weight accounting. Retain Roots `multi-op-return` rejection despite source help conflict. Port `mempool_datacarrier.py`, extra-weight boundaries, tapscript and L5 dust-cost interactions. |
|
|
|
|
| 347 |
| Parser grammar, types, negation, cost and dynamic syntax round trips | L7 unit/startup and actual sanitizer fuzz; no dynamic runtime claim. |
|
| 348 |
| Fixed dust thresholds, ephemeral/local standardness, carrier budgets and valid blocks | L7 focused tests and broader native regression fixtures. |
|
| 349 |
| Subdust deficit rounding/saturation, carrier extra weight, fee deltas, replacement/package/TRUC/reuse combinations | L8; existing source methods and arithmetic fuzz remain required gates. L7's native regression runs do not establish these Roots extensions. |
|
| 350 |
+
| Dynamic startup, publication, estimator fallback, extreme scaling and retry/shutdown | Authorized bounded L8 repair delivered; L9 repeats the joint publication/template/reward gate. Default off is unchanged. |
|
| 351 |
+
| Priority ancestors, residual mining, template normalization, actual-versus-modified reward interactions | L9 source L5 fixtures and native residual/priority/resource regressions delivered; joint gates below. |
|
| 352 |
| Integrated Roots confrw precedence | L12 only; ordinary CLI/config/JSON cases run in L7. |
|
| 353 |
|
| 354 |
Prior-release mempool compatibility remains skipped because release fixtures are
|
|
|
|
| 450 |
L8.1's conservative representable-case graph restrictions remain explicit in
|
| 451 |
[sub-dust semantics](feature-contracts/subdust.md). L9 mining combinations and
|
| 452 |
L12 integrated runtime configuration remain their respective owners.
|
| 453 |
+
|
| 454 |
+
## L9.1 priority selection and residual native chunks
|
| 455 |
+
|
| 456 |
+
Local mining defaults are Roots' 1,200,000 weight units, 1,000 sat/kvB and
|
| 457 |
+
100,000 serialized-byte priority area. Size-only and weight-only settings
|
| 458 |
+
leave the other resource at its protocol maximum; both settings enforce both.
|
| 459 |
+
Serialized size reserves 1,000 bytes as on the source; native weight reserve
|
| 460 |
+
normalization and additional coinbase sigops remain intact. Resource equality
|
| 461 |
+
is excluded by the inherited conservative template boundary.
|
| 462 |
+
|
| 463 |
+
Coin age is evaluated from the active UTXO set under the chain and mempool
|
| 464 |
+
locks, using the source's modified-vsize input discount. This deliberately
|
| 465 |
+
replaces entry caches and confirmation/reorg repair indexes: formerly
|
| 466 |
+
unconfirmed inputs start aging when present in the active UTXO set. Parent
|
| 467 |
+
readiness, priority/individual actual-feerate/descending-txid ordering and the final
|
| 468 |
+
area/threshold-crossing transaction follow source behavior. No priority delta
|
| 469 |
+
API is added; the existing mining RPC changes fee deltas only.
|
| 470 |
+
|
| 471 |
+
After a nonempty priority prefix, a temporary native TxGraph contains exactly
|
| 472 |
+
the remaining entries and direct dependencies. Already included parents and
|
| 473 |
+
their policy fees/weights are absent, so each descendant's native residual
|
| 474 |
+
chunk has accurate resource and fee accounting. It retains configured cluster
|
| 475 |
+
bounds, native bounded optimization and L8's conservative aggregate signed
|
| 476 |
+
budgets. This costs O(mempool) temporary storage plus native cluster work;
|
| 477 |
+
priority-disabled or empty-prefix templates use the existing graph directly.
|
| 478 |
+
Builders have local RAII ownership and are destroyed before residual refs and
|
| 479 |
+
graphs. Template assembly does not mutate or stage the live mempool graph.
|
| 480 |
+
Chunks are included/skipped whole, in native dependency order. Actual
|
| 481 |
+
serialized sizes and sigops are checked alongside native policy weight;
|
| 482 |
+
entries are asserted unique and actual fees alone fund the coinbase reward.
|
| 483 |
+
|
| 484 |
+
Provenance: priority/template content from `1b73fe3d21`, `ec9db369f5`,
|
| 485 |
+
`875fa15829`, `9ab60f217b`, `9d9c125d9e` and joint fixtures from
|
| 486 |
+
`10d772eb7f`. Retain Jaromil/devjoinedthechat credit and inherited Core/Knots
|
| 487 |
+
lineage. L9.2 owns the whole joint policy/mining gate and split-test accounting;
|
| 488 |
+
only integrated `confrw` remains deferred to L12.
|
| 489 |
+
|
| 490 |
+
## L9.2 split coverage and consensus separation
|
| 491 |
+
|
| 492 |
+
The source L5 commit `10d772eb7f` adds twelve functional subdust methods; every
|
| 493 |
+
method is present and invoked in the candidate. Ownership is reconciled here:
|
| 494 |
+
|
| 495 |
+
| Source methods / coverage | Delivered candidate gate |
|
| 496 |
+
| --- | --- |
|
| 497 |
+
| `test_dust_output_increases_required_fee`, `test_partial_dust_proportional_penalty`, `test_multiple_dust_outputs_stack`, `test_penalty_disabled`, `test_op_return_not_penalized`, `test_above_dust_not_penalized` | L8 admission/accounting boundaries, retained in the joint subdust functional run. |
|
| 498 |
+
| `test_threshold_and_low_rate_boundaries`, `test_anchor_and_standardness` | L7 dust/standardness plus L8 rounding; retained zero/low-rate and local-reject/valid-block gates. |
|
| 499 |
+
| `test_carrier_cost_interaction` | L8 independently charged carrier weight and deficit; L9 residual odd policy weight and exact descendant fee/resource boundaries. |
|
| 500 |
+
| `test_fee_delta_and_replacement` | L8 actual/modified fields and replacement fee diagrams; L9 residual delta one-sat boundary and priority tie independence from operator deltas. |
|
| 501 |
+
| `test_package_and_truc` | L8 ordinary-parent relay floor, native sponsorship, TRUC mode selection and modified package fields; joint package/RBF/TRUC scripts run with L9 assembly. |
|
| 502 |
+
| `test_mining_and_block_acceptance` | L9 priority on/off, minfee equality, penalty disabled, fee delta, actual rewards under both selection modes, and local-reject/valid-block acceptance. |
|
| 503 |
+
| Source parser `policy_args` and arithmetic/admission `subdust_fee_penalty` fuzz | L7/L8 independent grammar/arithmetic oracles retained; current bounded L9 sanitizer smoke plus native pool template option fuzz. |
|
| 504 |
+
| L8 dynamic runtime/publication/estimator/retry/reload and immutability | Existing functional cases retained, with current template fee fields and mined rewards checked after publication and operator-delta persistence. |
|
| 505 |
+
| Source priority-parent/stale-ancestor mining corrections | Native one/two-parent, shared/waiting descendant, repeated-build, exact remaining fee/weight/size and duplicate/order regressions. |
|
| 506 |
+
| Source integrated Roots `confrw` precedence subsection | Only split-policy/mining integration deferral; L12. Ordinary CLI/config/JSON startup cases remain active. |
|
| 507 |
+
|
| 508 |
+
Synthetic residual accounting tests combine a priority-selected negative-modified
|
| 509 |
+
parent with a carrier-adjusted descendant. The descendant meets an exact
|
| 510 |
+
rounded-vsize floor, misses it after a one-sat operator delta, and respects the
|
| 511 |
+
remaining policy-weight boundary. Actual parent/child fees and coinbase rewards
|
| 512 |
+
are checked separately. Pool fuzz assembly varies priority enabled/disabled,
|
| 513 |
+
serialized size, weight, reserve and sigop reservations before block removal
|
| 514 |
+
and reorg admission. These are short smoke checks, not exhaustive campaigns.
|
| 515 |
+
|
| 516 |
+
Mining's synthetic fixtures now lock cs_main before mempool, matching production
|
| 517 |
+
lock order. Fee-only ephemeral and estimation fixtures explicitly disable the
|
| 518 |
+
source priority area; the estimator retains its native low-feerate sampling
|
| 519 |
+
with an explicit template fee floor. The disconnected-pool bulk fixture requests
|
| 520 |
+
the source's protocol-max template weight and FIFO fee ordering. Assertions
|
| 521 |
+
are retained. Sequence-lock fixtures use fee selection, and large-block upload
|
| 522 |
+
accounting requests the source size-only profile. The general mining test checks
|
| 523 |
+
the Roots default weight/fee limits and explicitly requests protocol-max weight
|
| 524 |
+
for its separate reserve-boundary case. Roots defaults remain covered by the
|
| 525 |
+
dedicated template matrix.
|
| 526 |
+
|
| 527 |
+
`validation.cpp` from `bool CheckBlock(` through end-of-file is byte-identical
|
| 528 |
+
to the authenticated v31.1 base. The consensus subtree, interpreter, block
|
| 529 |
+
primitive and kernel chain files have no candidate changes. This L9 diff touches
|
| 530 |
+
only local template selection/configuration plus tests/docs and a read-only
|
| 531 |
+
mempool builder accessor. No block-size/weight acceptance gate reads Roots local
|
| 532 |
+
template limits. Functional and unit tests add transactions excluded by local
|
| 533 |
+
policy/templates to valid blocks and accept them through the native interface.
|
| 534 |
+
No RDTS/BIP110 or other new consensus rule is present.
|
| 535 |
+
|
| 536 |
+
The per-contract/source-commit accounting above remains complete (72 commits,
|
| 537 |
+
25 contracts) and retains Jaromil/devjoinedthechat plus Core/Knots attribution.
|
| 538 |
+
Within the L7–L9 policy/mining split no parsing-only mining controls or unowned
|
| 539 |
+
source interaction cases remain. Optional platform/dependency gates remain
|
| 540 |
+
explicit environment gaps; heavy/nightly CI is L13.2, not a preservation claim.
|
| 541 |
+
|
| 542 |
+
The L9 acceptance gate includes 751 GCC unit cases, 154 CTest passes plus the
|
| 543 |
+
external script-assets skip, and 274 functional passes plus 17 environment
|
| 544 |
+
skips. One frozen functional sweep exposed six inherited fixture assumptions;
|
| 545 |
+
only those fixtures were corrected and rerun against the same daemon. CTest
|
| 546 |
+
launches interrupted by a unit-binary relink were rerun after the build finished.
|
| 547 |
+
The current miner cases also passed separately after the lock-order fixture
|
| 548 |
+
correction. Scoped Clang ASan/UBSan checks cover 44 policy/miner unit cases and
|
| 549 |
+
the dynamic/subdust template-reward interactions. The existing template matrix
|
| 550 |
+
sanitizer evidence retains the same production source and daemon hash. Parser,
|
| 551 |
+
penalty arithmetic and randomized native pool assembly have bounded sanitizer
|
| 552 |
+
fuzz smoke coverage. No repeated full sweep or exhaustive fuzz claim is made.
|