You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 6664717
Browse filesBrowse the repository at this point in the historyBrowse files
feat(zk): route all six DualLeafV2 value lanes and build every lane's inputs (#7099)
* feat(zk): route all six DualLeafV2 value lanes and build every lane's inputs
Two host-side gaps in the DualLeafV2 value lanes. Neither opens a verifier
gate: the stage-0 ValueLaneSubProofNotAccepted refusal, the stage-2 operand
match, filter_edge_true and encode_pattern_slot are untouched, and a test
asserts per lane that a manifest assembled entirely by the new builders is
still refused.
Routing. dual_leaf_v2::is_hookable_datatype and encode_literal now route
xsd:boolean, xsd:dateTime and xsd:date as well as xsd:integer, xsd:decimal and
xsd:double, so a graph committed under DualLeafV2 carries a real value hook,
under that datatype's own lane constant, for every literal on them. Before
this, a value-lane FILTER on one of those three bound an operand_enc no
committed leaf of the graph was, which is why value_pin refused them as
vacuous. Two deliberate consequences: the three newly routed lanes inherit the
fail-closed ingest rule, so an XSD-legal but non-canonical lexical on them
("1"^^xsd:boolean, a bare or non-Z xsd:dateTime, a 24:00:00 instant) now fails
the whole commitment instead of taking the degenerate string lane; and a V2
commitment over a graph that CONTAINS such a literal is re-based. Every leaf on
the three already-routed lanes, every degenerate string-lane leaf, every IRI
and blank-node leaf, and the whole-graph commitment over a graph of only those
are byte-identical, pinned by a fixed vector captured before the change.
DualLeafV1's routing is unchanged, so an already-issued V1 graph is unaffected.
Build helpers. build::build_filter_value_dl_{int, f64, decimal} complete the V2
builder set beside the existing _bool / _datetime / _date entries, over one
shared assembly rather than three copies: both operands go through the lane's
own dual_leaf_v2 encoder, the committed literal's lane constant is carried, and
the disclosed verdict is computed by that member's host verdict mirror
(integer_verdict, double_bits_verdict, the shared signed_epoch_verdict) rather
than taken from the caller. The decimal lane rescales the FILTER constant to
the committed literal's scale exactly, never rounded, refusing an inexact or
overflowing rescale, through the same two functions value_pin pins with, so the
builder's scale and the pin's cannot disagree.
BuiltFilterValueDlNumeric::lane_proof feeds the checked typed prove entry, so
the Prover.toml is rendered from validated typed fields and never from caller
TOML.
Tested as a composition: every one of the six lanes' builder output satisfies
value_pin::check_value_lane_pin for the matching typed FILTER, and changing any
single pinned field of it (member, lane constant, op, bound, verdict) is
refused with that field's own PinError. Live nargo+bb prove+verify covers one
helper per lane family. Host-side Rust only; no .nr source changed.
Research grade, NOT externally audited (sq-qhy4); the value lanes carry the
#769-accepted INV-VL downgrade (CR-G8). No soundness or privacy claim.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015CB7XiW3NDsggNCuDcuJJo
* zk: pin the routed V2 commitment, tidy test docs and the decimal scale message
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015CB7XiW3NDsggNCuDcuJJo
* zk: state the V2 date/time value domain precisely and the member-pinning dependency
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015CB7XiW3NDsggNCuDcuJJo
---------
Co-authored-by: Claude <noreply@anthropic.com>
bound: &Literal)` complete the V2 builder set next to the existing `_bool` / `_datetime` /
29
+
`_date` entries, over ONE shared assembly: both operands go through the lane's own
30
+
`dual_leaf_v2` encoder, the COMMITTED literal's lane constant is carried, and the disclosed
31
+
verdict is COMPUTED by that member's host verdict mirror (`build::integer_verdict`,
32
+
`build::double_bits_verdict`, the shared `build::signed_epoch_verdict`) rather than taken from
33
+
the caller. The decimal lane rescales the FILTER constant to the committed literal's scale
34
+
EXACTLY — never rounded — refusing an inexact or overflowing rescale with
35
+
`BuildValueDlV2Error::DecimalScaleNotRepresentable`, through the same two functions
36
+
`value_pin` pins with. `BuiltFilterValueDlNumeric::lane_proof` feeds the checked typed prove
37
+
entry, so the `Prover.toml` is rendered from validated typed fields and never from caller TOML.
38
+
Every lane's builder output satisfies `value_pin::check_value_lane_pin` for the matching typed
39
+
FILTER, and changing any single pinned field of it — member, lane constant, op, bound, verdict
40
+
— is refused with that field's own `PinError`. **The value-lane verifier gates are UNCHANGED
41
+
and still CLOSED:**`verifier::prefilter_manifest_structure` refuses every value-lane sub-proof
42
+
at stage 0 with `CheckError::ValueLaneSubProofNotAccepted`, the stage-2 operand match,
43
+
`filter_edge_true` and `encode_pattern_slot` are untouched, and a test asserts per lane that a
44
+
manifest assembled entirely by these builders is still refused. Host-side Rust only; no `.nr`
45
+
source changed. Research grade, NOT externally audited (`sq-qhy4`); the value lanes carry the
46
+
#769-accepted INV-VL downgrade (CR-G8). No soundness or privacy claim.
47
+
<!-- privacy-claims-allow: opt-in host routing + build helpers; the INV-VL downgrade and the external audit are framed as OPEN obligations; the verifier gates are stated as unchanged and closed; asserts no soundness/privacy property; sq-qhy4 / CR-G8 -->
48
+
12
49
-**sparq-zk-compose:** verifier-side **authenticated commitment method**. The verifier no longer has
13
50
to assume which commitment method a committed graph was made under, and it does not read one from
14
51
the manifest either — it RECOVERS it from the issuer signature. `method_auth` builds one candidate
0 commit comments