feat: add unstable-voting-circuits feature to widen internals#488
Conversation
|
Note that this should be merged after we do the |
The feat commit added `OrchardBaseFieldBases::SpendAuthGBase` and `OrchardShortScalarBases::SpendAuthGShort` to the `pub use` re-export list in src/constants.rs, but `mod constants;` was still private — so the re-exports had no external effect, triggering `unused_imports` on the new names and failing the `deny: warnings` Clippy job on upstream CI. Making `pub mod constants;` with `#[allow(missing_docs)]` mirrors the identical hunk already present in zcash#488 (visibility-widening). When both PRs merge, git resolves the shared hunk trivially — no dead code or follow-up cleanup needed.
Generalizes OrchardFixedBases to support multiplying the spend
authorization generator G^Orchard by:
1. Full-width base-field scalars via FixedPointBaseField (new
OrchardBaseFieldBases::SpendAuthGBase variant, reuses the existing
85-window U/Z tables)
2. 64-bit signed short scalars via FixedPointShort (new
OrchardShortScalarBases::SpendAuthGShort variant, with new 22-window
Z_SHORT/U_SHORT precomputed tables)
New types:
- OrchardBaseFieldBases { NullifierK, SpendAuthGBase }
- OrchardShortScalarBases { ValueCommitV, SpendAuthGShort }
Breaking change: OrchardFixedBases is now
{Full(OrchardFixedBasesFull), Base(OrchardBaseFieldBases),
Short(OrchardShortScalarBases)} instead of the previous flat
{Full(...), NullifierK, ValueCommitV}. Internal callers
(value_commit_orchard, derive_nullifier) are rewired with .into().
The existing `impl From<NullifierK|ValueCommitV> for OrchardFixedBases`
continue to work, so callers using `.into()` are unaffected; only
callers that match on the enum variants directly need to update.
Also flips `mod constants;` to `#[allow(missing_docs)] pub mod constants;`
so that the new `pub use fixed_bases::{OrchardBaseFieldBases,
OrchardShortScalarBases}` re-exports in src/constants.rs are
externally visible. The identical 3-line hunk is also present in the
sibling visibility-widening PR (zcash#488); git will auto-
resolve on merge.
The main Orchard action circuit VK is unchanged, enforced by the
existing byte-equality check in src/circuit.rs::test_against_stored_vk
(format!("{:#?}\n", vk.vk.pinned()) == include_str!("circuit_description")).
All existing orchard tests pass unchanged.
Generalizes OrchardFixedBases to support multiplying the spend
authorization generator G^Orchard by:
1. Full-width base-field scalars via FixedPointBaseField (new
OrchardBaseFieldBases::SpendAuthGBase variant, reuses the existing
85-window U/Z tables)
2. 64-bit signed short scalars via FixedPointShort (new
OrchardShortScalarBases::SpendAuthGShort variant, with new 22-window
Z_SHORT/U_SHORT precomputed tables)
New types:
- OrchardBaseFieldBases { NullifierK, SpendAuthGBase }
- OrchardShortScalarBases { ValueCommitV, SpendAuthGShort }
Breaking change: OrchardFixedBases is now
{Full(OrchardFixedBasesFull), Base(OrchardBaseFieldBases),
Short(OrchardShortScalarBases)} instead of the previous flat
{Full(...), NullifierK, ValueCommitV}. Internal callers
(value_commit_orchard, derive_nullifier) are rewired with .into().
The existing `impl From<NullifierK|ValueCommitV> for OrchardFixedBases`
continue to work, so callers using `.into()` are unaffected; only
callers that match on the enum variants directly need to update.
Also flips `mod constants;` to `#[allow(missing_docs)] pub mod constants;`
so that the new `pub use fixed_bases::{OrchardBaseFieldBases,
OrchardShortScalarBases}` re-exports in src/constants.rs are
externally visible. The identical 3-line hunk is also present in the
sibling visibility-widening PR (zcash#488); git will auto-
resolve on merge.
The main Orchard action circuit VK is unchanged, enforced by the
existing byte-equality check in src/circuit.rs::test_against_stored_vk
(format!("{:#?}\n", vk.vk.pinned()) == include_str!("circuit_description")).
All existing orchard tests pass unchanged.
Generalizes OrchardFixedBases to support multiplying the spend
authorization generator G^Orchard by:
1. Full-width base-field scalars via FixedPointBaseField (new
OrchardBaseFieldBases::SpendAuthGBase variant, reuses the existing
85-window U/Z tables)
2. 64-bit signed short scalars via FixedPointShort (new
OrchardShortScalarBases::SpendAuthGShort variant, with new 22-window
Z_SHORT/U_SHORT precomputed tables)
New types:
- OrchardBaseFieldBases { NullifierK, SpendAuthGBase }
- OrchardShortScalarBases { ValueCommitV, SpendAuthGShort }
Breaking change: OrchardFixedBases is now
{Full(OrchardFixedBasesFull), Base(OrchardBaseFieldBases),
Short(OrchardShortScalarBases)} instead of the previous flat
{Full(...), NullifierK, ValueCommitV}. Internal callers
(value_commit_orchard, derive_nullifier) are rewired with .into().
The existing `impl From<NullifierK|ValueCommitV> for OrchardFixedBases`
continue to work, so callers using `.into()` are unaffected; only
callers that match on the enum variants directly need to update.
Also flips `mod constants;` to `#[allow(missing_docs)] pub mod constants;`
so that the new `pub use fixed_bases::{OrchardBaseFieldBases,
OrchardShortScalarBases}` re-exports in src/constants.rs are
externally visible. The identical 3-line hunk is also present in the
sibling visibility-widening PR (zcash#488); git will auto-
resolve on merge.
Adds a public-crate re-export at public/src/lib.rs so that
orchard::constants::{OrchardBaseFieldBases, OrchardShortScalarBases,
OrchardFixedBases, OrchardFixedBasesFull, NullifierK, ValueCommitV}
are reachable through the public `orchard` crate, matching the
CHANGELOG entries.
The main Orchard action circuit VK is unchanged, enforced by the
existing byte-equality check in src/circuit.rs::round_trip
(format!("{:#?}\n", vk.vk.pinned()) == include_str!("circuit_description")).
All existing orchard tests pass unchanged.
Generalizes OrchardFixedBases to support multiplying the spend
authorization generator G^Orchard by:
1. Full-width base-field scalars via FixedPointBaseField (new
OrchardBaseFieldBases::SpendAuthGBase variant, reuses the existing
85-window U/Z tables)
2. 64-bit signed short scalars via FixedPointShort (new
OrchardShortScalarBases::SpendAuthGShort variant, with new 22-window
Z_SHORT/U_SHORT precomputed tables)
New types:
- OrchardBaseFieldBases { NullifierK, SpendAuthGBase }
- OrchardShortScalarBases { ValueCommitV, SpendAuthGShort }
Breaking change: OrchardFixedBases is now
{Full(OrchardFixedBasesFull), Base(OrchardBaseFieldBases),
Short(OrchardShortScalarBases)} instead of the previous flat
{Full(...), NullifierK, ValueCommitV}. Internal callers
(value_commit_orchard, derive_nullifier) are rewired with .into().
The existing `impl From<NullifierK|ValueCommitV> for OrchardFixedBases`
continue to work, so callers using `.into()` are unaffected; only
callers that match on the enum variants directly need to update.
Also flips `mod constants;` to `#[allow(missing_docs)] pub mod constants;`
so that the new `pub use fixed_bases::{OrchardBaseFieldBases,
OrchardShortScalarBases}` re-exports in src/constants.rs are
externally visible. The identical 3-line hunk is also present in the
sibling visibility-widening PR (zcash#488); git will auto-
resolve on merge.
Adds a public-crate re-export at public/src/lib.rs so that
orchard::constants::{OrchardBaseFieldBases, OrchardShortScalarBases,
OrchardFixedBases, OrchardFixedBasesFull, NullifierK, ValueCommitV}
are reachable through the public `orchard` crate, matching the
CHANGELOG entries.
The main Orchard action circuit VK is unchanged, enforced by the
existing byte-equality check in src/circuit.rs::round_trip
(format!("{:#?}\n", vk.vk.pinned()) == include_str!("circuit_description")).
All existing orchard tests pass unchanged.
Generalizes OrchardFixedBases to support multiplying the spend
authorization generator G^Orchard by:
1. Full-width base-field scalars via FixedPointBaseField (new
OrchardBaseFieldBases::SpendAuthGBase variant, reuses the existing
85-window U/Z tables)
2. 64-bit signed short scalars via FixedPointShort (new
OrchardShortScalarBases::SpendAuthGShort variant, with new 22-window
Z_SHORT/U_SHORT precomputed tables)
New types:
- OrchardBaseFieldBases { NullifierK, SpendAuthGBase }
- OrchardShortScalarBases { ValueCommitV, SpendAuthGShort }
Breaking change: OrchardFixedBases is now
{Full(OrchardFixedBasesFull), Base(OrchardBaseFieldBases),
Short(OrchardShortScalarBases)} instead of the previous flat
{Full(...), NullifierK, ValueCommitV}. Internal callers
(value_commit_orchard, derive_nullifier) are rewired with .into().
The existing `impl From<NullifierK|ValueCommitV> for OrchardFixedBases`
continue to work, so callers using `.into()` are unaffected; only
callers that match on the enum variants directly need to update.
Also flips `mod constants;` to `#[allow(missing_docs)] pub mod constants;`
so that the new `pub use fixed_bases::{OrchardBaseFieldBases,
OrchardShortScalarBases}` re-exports in src/constants.rs are
externally visible. The identical 3-line hunk is also present in the
sibling visibility-widening PR (zcash#488); git will auto-
resolve on merge.
Adds a public-crate re-export at public/src/lib.rs so that
orchard::constants::{OrchardBaseFieldBases, OrchardShortScalarBases,
OrchardFixedBases, OrchardFixedBasesFull, NullifierK, ValueCommitV}
are reachable through the public `orchard` crate, matching the
CHANGELOG entries.
The main Orchard action circuit VK is unchanged, enforced by the
existing byte-equality check in src/circuit.rs::round_trip
(format!("{:#?}\n", vk.vk.pinned()) == include_str!("circuit_description")).
All existing orchard tests pass unchanged.
Generalizes OrchardFixedBases to support multiplying the spend
authorization generator G^Orchard by:
1. Full-width base-field scalars via FixedPointBaseField (new
OrchardBaseFieldBases::SpendAuthGBase variant, reuses the existing
85-window U/Z tables)
2. 64-bit signed short scalars via FixedPointShort (new
OrchardShortScalarBases::SpendAuthGShort variant, with new 22-window
Z_SHORT/U_SHORT precomputed tables)
New types:
- OrchardBaseFieldBases { NullifierK, SpendAuthGBase }
- OrchardShortScalarBases { ValueCommitV, SpendAuthGShort }
Breaking change: OrchardFixedBases is now
{Full(OrchardFixedBasesFull), Base(OrchardBaseFieldBases),
Short(OrchardShortScalarBases)} instead of the previous flat
{Full(...), NullifierK, ValueCommitV}. Internal callers
(value_commit_orchard, derive_nullifier) are rewired with .into().
The existing `impl From<NullifierK|ValueCommitV> for OrchardFixedBases`
continue to work, so callers using `.into()` are unaffected; only
callers that match on the enum variants directly need to update.
Also flips `mod constants;` to `#[allow(missing_docs)] pub mod constants;`
so that the new `pub use fixed_bases::{OrchardBaseFieldBases,
OrchardShortScalarBases}` re-exports in src/constants.rs are
externally visible. The identical 3-line hunk is also present in the
sibling visibility-widening PR (zcash#488); git will auto-
resolve on merge.
Adds a public-crate re-export at public/src/lib.rs so that
orchard::constants::{OrchardBaseFieldBases, OrchardShortScalarBases,
OrchardFixedBases, OrchardFixedBasesFull, NullifierK, ValueCommitV}
are reachable through the public `orchard` crate, matching the
CHANGELOG entries.
The main Orchard action circuit VK is unchanged, enforced by the
existing byte-equality check in src/circuit.rs::round_trip
(format!("{:#?}\n", vk.vk.pinned()) == include_str!("circuit_description")).
All existing orchard tests pass unchanged.
Generalizes OrchardFixedBases to support multiplying the spend
authorization generator G^Orchard by:
1. Full-width base-field scalars via FixedPointBaseField (new
OrchardBaseFieldBases::SpendAuthGBase variant, reuses the existing
85-window U/Z tables)
2. 64-bit signed short scalars via FixedPointShort (new
OrchardShortScalarBases::SpendAuthGShort variant, with new 22-window
Z_SHORT/U_SHORT precomputed tables)
New types:
- OrchardBaseFieldBases { NullifierK, SpendAuthGBase }
- OrchardShortScalarBases { ValueCommitV, SpendAuthGShort }
Breaking change: OrchardFixedBases is now
{Full(OrchardFixedBasesFull), Base(OrchardBaseFieldBases),
Short(OrchardShortScalarBases)} instead of the previous flat
{Full(...), NullifierK, ValueCommitV}. Internal callers
(value_commit_orchard, derive_nullifier) are rewired with .into().
The existing `impl From<NullifierK|ValueCommitV> for OrchardFixedBases`
continue to work, so callers using `.into()` are unaffected; only
callers that match on the enum variants directly need to update.
Also flips `mod constants;` to `#[allow(missing_docs)] pub mod constants;`
so that the new `pub use fixed_bases::{OrchardBaseFieldBases,
OrchardShortScalarBases}` re-exports in src/constants.rs are
externally visible. The identical 3-line hunk is also present in the
sibling visibility-widening PR (zcash#488); git will auto-
resolve on merge.
Adds a public-crate re-export at public/src/lib.rs so that
orchard::constants::{OrchardBaseFieldBases, OrchardShortScalarBases,
OrchardFixedBases, OrchardFixedBasesFull, NullifierK, ValueCommitV}
are reachable through the public `orchard` crate, matching the
CHANGELOG entries.
The main Orchard action circuit VK is unchanged, enforced by the
existing byte-equality check in src/circuit.rs::round_trip
(format!("{:#?}\n", vk.vk.pinned()) == include_str!("circuit_description")).
All existing orchard tests pass unchanged.
Generalizes OrchardFixedBases to support multiplying the spend
authorization generator G^Orchard by:
1. Full-width base-field scalars via FixedPointBaseField (new
OrchardBaseFieldBases::SpendAuthGBase variant, reuses the existing
85-window U/Z tables)
2. 64-bit signed short scalars via FixedPointShort (new
OrchardShortScalarBases::SpendAuthGShort variant, with new 22-window
Z_SHORT/U_SHORT precomputed tables)
New types:
- OrchardBaseFieldBases { NullifierK, SpendAuthGBase }
- OrchardShortScalarBases { ValueCommitV, SpendAuthGShort }
Breaking change: OrchardFixedBases is now
{Full(OrchardFixedBasesFull), Base(OrchardBaseFieldBases),
Short(OrchardShortScalarBases)} instead of the previous flat
{Full(...), NullifierK, ValueCommitV}. Internal callers
(value_commit_orchard, derive_nullifier) are rewired with .into().
The existing `impl From<NullifierK|ValueCommitV> for OrchardFixedBases`
continue to work, so callers using `.into()` are unaffected; only
callers that match on the enum variants directly need to update.
Also flips `mod constants;` to `#[allow(missing_docs)] pub mod constants;`
so that the new `pub use fixed_bases::{OrchardBaseFieldBases,
OrchardShortScalarBases}` re-exports in src/constants.rs are
externally visible. The identical 3-line hunk is also present in the
sibling visibility-widening PR (zcash#488); git will auto-
resolve on merge.
Adds a public-crate re-export at public/src/lib.rs so that
orchard::constants::{OrchardBaseFieldBases, OrchardShortScalarBases,
OrchardFixedBases, OrchardFixedBasesFull, NullifierK, ValueCommitV}
are reachable through the public `orchard` crate, matching the
CHANGELOG entries.
The main Orchard action circuit VK is unchanged, enforced by the
existing byte-equality check in src/circuit.rs::round_trip
(format!("{:#?}\n", vk.vk.pinned()) == include_str!("circuit_description")).
All existing orchard tests pass unchanged.
Generalizes OrchardFixedBases to support multiplying the spend
authorization generator G^Orchard by:
1. Full-width base-field scalars via FixedPointBaseField (new
OrchardBaseFieldBases::SpendAuthGBase variant, reuses the existing
85-window U/Z tables)
2. 64-bit signed short scalars via FixedPointShort (new
OrchardShortScalarBases::SpendAuthGShort variant, with new 22-window
Z_SHORT/U_SHORT precomputed tables)
New types:
- OrchardBaseFieldBases { NullifierK, SpendAuthGBase }
- OrchardShortScalarBases { ValueCommitV, SpendAuthGShort }
Breaking change: OrchardFixedBases is now
{Full(OrchardFixedBasesFull), Base(OrchardBaseFieldBases),
Short(OrchardShortScalarBases)} instead of the previous flat
{Full(...), NullifierK, ValueCommitV}. Internal callers
(value_commit_orchard, derive_nullifier) are rewired with .into().
The existing `impl From<NullifierK|ValueCommitV> for OrchardFixedBases`
continue to work, so callers using `.into()` are unaffected; only
callers that match on the enum variants directly need to update.
Also flips `mod constants;` to `#[allow(missing_docs)] pub mod constants;`
so that the new `pub use fixed_bases::{OrchardBaseFieldBases,
OrchardShortScalarBases}` re-exports in src/constants.rs are
externally visible. The identical 3-line hunk is also present in the
sibling visibility-widening PR (zcash#488); git will auto-
resolve on merge.
Adds a public-crate re-export at public/src/lib.rs so that
orchard::constants::{OrchardBaseFieldBases, OrchardShortScalarBases,
OrchardFixedBases, OrchardFixedBasesFull, NullifierK, ValueCommitV}
are reachable through the public `orchard` crate, matching the
CHANGELOG entries.
The main Orchard action circuit VK is unchanged, enforced by the
existing byte-equality check in src/circuit.rs::round_trip
(format!("{:#?}\n", vk.vk.pinned()) == include_str!("circuit_description")).
All existing orchard tests pass unchanged.
Generalizes OrchardFixedBases to support multiplying the spend
authorization generator G^Orchard by:
1. Full-width base-field scalars via FixedPointBaseField (new
OrchardBaseFieldBases::SpendAuthGBase variant, reuses the existing
85-window U/Z tables)
2. 64-bit signed short scalars via FixedPointShort (new
OrchardShortScalarBases::SpendAuthGShort variant, with new 22-window
Z_SHORT/U_SHORT precomputed tables)
New types:
- OrchardBaseFieldBases { NullifierK, SpendAuthGBase }
- OrchardShortScalarBases { ValueCommitV, SpendAuthGShort }
Breaking change: OrchardFixedBases is now
{Full(OrchardFixedBasesFull), Base(OrchardBaseFieldBases),
Short(OrchardShortScalarBases)} instead of the previous flat
{Full(...), NullifierK, ValueCommitV}. Internal callers
(value_commit_orchard, derive_nullifier) are rewired with .into().
The existing `impl From<NullifierK|ValueCommitV> for OrchardFixedBases`
continue to work, so callers using `.into()` are unaffected; only
callers that match on the enum variants directly need to update.
Also flips `mod constants;` to `#[allow(missing_docs)] pub mod constants;`
so that the new `pub use fixed_bases::{OrchardBaseFieldBases,
OrchardShortScalarBases}` re-exports in src/constants.rs are
externally visible. The identical 3-line hunk is also present in the
sibling visibility-widening PR (zcash#488); git will auto-
resolve on merge.
Adds a public-crate re-export at public/src/lib.rs so that
orchard::constants::{OrchardBaseFieldBases, OrchardShortScalarBases,
OrchardFixedBases, OrchardFixedBasesFull, NullifierK, ValueCommitV}
are reachable through the public `orchard` crate, matching the
CHANGELOG entries.
The main Orchard action circuit VK is unchanged, enforced by the
existing byte-equality check in src/circuit.rs::round_trip
(format!("{:#?}\n", vk.vk.pinned()) == include_str!("circuit_description")).
All existing orchard tests pass unchanged.
nuttycom
left a comment
There was a problem hiding this comment.
NACK pending detailed discussion, breaking the sealed-ness of the SigType trait needs strong justification. Also, are you certain that all of this surface area actually needs to be exposed?
|
@nuttycom I had a more confined version that only exposed the items that voting circuits needed, but then got guidance from @ebfull to convert anything with To move things forward, I can open a second PR that is only the items that we actually need for voting circuits if that is desired. |
Yes, please. We can always expose more if needed, but it's more of a hassle to close things off. |
|
@nuttycom on it now, thanks! |
|
@nuttycom The purpose of the crate split was to enable us to avoid having to make deliberate stable API decisions every time someone needs to repurpose an internal abstraction. As a general rule, anything that was If we really needed to close down visibility afterward for some reason we could do it with a major (breaking) release of The specific change that was a sealed trait pattern that was turned into a |
163527e to
ec28cec
Compare
|
@nuttycom just for clarity, I do have the minimal change staged on our fork as promised (valargroup#15), but it seems like the full widening might still be desired (aside from the error you flagged, which is now fixed) |
| #[cfg_attr(feature = "unstable-voting-circuits", visibility::make(pub))] | ||
| pub(crate) fn zero() -> Self { |
There was a problem hiding this comment.
This can be pub, it's equivalent to NoteValue::from_raw(0) which is already pub. (Alternatively, that means it doesn't actually need to be changed by this PR.)
| #[cfg_attr(feature = "unstable-voting-circuits", visibility::make(pub))] | |
| pub(crate) fn zero() -> Self { | |
| pub fn zero() -> Self { |
There was a problem hiding this comment.
Instead of making this a pub method, I'd like to make this a pub constant ZERO (and remove the pub(crate) method).
81f879c
81f879c to
e54e4e4
Compare
|
Some of the suggestions I accepted seems to have been reverted on my force push, I am re-applying them now. Will post here when ready for re-review. Thanks all! |
6b79bcc to
2341449
Compare
Mirrors the existing `unstable-frost` pattern: flag off leaves the public API byte-identical to main; flag on promotes the `pub(crate)` items a downstream voting circuit needs to `pub`. Uses `#[cfg_attr(..., visibility::make(pub))]` for most items, with cfg twin-declarations where the `visibility` proc-macro can't apply on stable (non-inline modules, tuple-struct fields).
2341449 to
c0b6b91
Compare
|
I have some suggestions that I want to just push onto the branch, please hold off force-pushing for a bit. Edit: ok for you to push now (I didn't have permission to push to this branch in any case), see valargroup#18 for my suggested changes. |
Remove the six `#[allow(missing_docs)]` attributes gating newly-public modules under `unstable-voting-circuits`, and document every item the lint was suppressing (modules, sub-configs, chip wrappers, enum variants, and the `generator()` entry points of each fixed-base table). The crate-wide `#![deny(missing_docs)]` policy now applies uniformly under the feature rather than being selectively relaxed. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
I've opened valargroup#18 on to this PR, please review @nuttycom @czarcas7ic. |
There was a problem hiding this comment.
Review — current state (assuming doc PR #18 merged)
Resolved since the first round of comments:
- Sealed-trait break in
src/primitives/redpallas.rs— fixed by the squashed commit; ebfull confirmed at line 186. Nullifieropaque-wrapper (Kris's and Daira-Emma's request) — applied.L_ORCHARD_{BASE,SCALAR}/L_VALUEunconditionallypub(Daira-Emma's suggestion) — applied, pluspub useat crate root.src/note.rsre-exports (Daira-Emma's suggestion) — applied.NoteValue::zerounconditionallypub(Daira-Emma's suggestion) — applied.Address::{g_d, pk_d}documented in CHANGELOG (Kris's request) — done.#[allow(missing_docs)]on the six newly-public modules — replaced with real docs in valargroup#18 (pending merge into this branch).src/primitives/redpallas.rs:118(cfg(test) fn dummy) — current state matches Kris's "doesn't need to change."- Daira-Emma's "Address::from_parts?" — reply clarified voting-circuits only reads, doesn't construct; acceptable.
src/circuit/gadget.rs:31visibility::makeattempt — ebfull linked thenon-inline modules in proc macro inputunstable-issue showing it can't work; Kris agreed "fine as it is."
[Removed false-positive discussion of clippy failures caused by version skew between my local clippy and CI's.]
Still-live design discussion:
Kris suggested a pub const ZERO: NoteValue in src/value.rs rather than pub fn zero(). The current code went with the pub fn. A const is marginally more idiomatic for a zero-argument invariant, and usable in const contexts; the fn matches NoteValue::from_raw(0)'s shape. Maintainer call.
Minor cleanup (discretionary, pre-existing):
gen_const_arrayinsrc/constants/util.rsispubbut used only within the crate (util.rs,spec.rs). Kris flagged this. Not introduced by this PR, but since the PR is already in that file, apub(crate)narrowing fits.- Kris's three sinsemilla.rs concerns (items could be private / panic needs docs) are pre-existing; not introduced by this PR. Out of scope.
- SpendInfo
pub(crate)fields insrc/builder.rs— same story, pre-existing.
Structural (Kris's main concern):
"Huge expansion of public API" — still true in absolute terms (~30 items conditionally graduated to pub under the feature, mapped 1:1 against valargroup/voting-circuits/UPSTREAM.md's checklist). Mitigations in place: feature flag, unstable- prefix, CHANGELOG flagging non-semver-stable. Each exposure justified by a concrete downstream consumer. Still worth being conservative about which items migrate from unstable-voting-circuits to unconditional pub in future releases.
🤖 This comment was prepared with the assistance of Claude Opus 4.7 (1M context).
Merged it in, thanks! |
|
I am now mobile but I will address Kris' concern at my soonest availability |
|
For the one remaining item:
I'll just remove this as a change in this PR, and do that in an isolated follow-up |
…cond PR as its not core to voting
Summary
Adds an opt-in feature flag
unstable-voting-circuitsthat surgically exposes the orchard internals needed to build a downstream voting circuit against this crate, following the same pattern as the existingunstable-frostflag.All visibility changes only upgrade to
pubunder--features unstable-voting-circuits. Theunstable-prefix signals that any items exposed under this flag are not covered by the crate's semver stability guarantees and may change in any future release.