Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
32feb57
docs: Clarify builder and PCZT documentation
ebfull Jun 13, 2026
76b6109
refactor: Use singular action enable names in circuit
ebfull Jun 13, 2026
e5da49f
refactor: Minor Orchard circuit refactorings and helpers
ebfull Jun 13, 2026
a5ab6b8
refactor: Extract unauthorized bundle finalization helper
ebfull Jun 13, 2026
e2ace8c
tests: Centralize builder integration test setup
ebfull Jun 13, 2026
a919a22
api: Bind batch validation to its verifying key
ebfull Jun 13, 2026
229a423
api: Require explicit Orchard circuit versions
ebfull Jun 19, 2026
c9d88ef
api: Introduce BundleProtocol as the bundle construction selector
ebfull Jun 19, 2026
dd98b36
api: Add cross-address semantics to bundle flags
ebfull Jun 13, 2026
4b0a7ad
api: Add NU6.3 bundle flag encoding
ebfull Jun 19, 2026
bfdcc8c
circuit: Carry cross-address flags in proof instances
ebfull Jun 19, 2026
1d1a97f
refactor: Add same-expanded-receiver address comparison
ebfull Jun 13, 2026
1108d06
circuit: Add post-NU 6.3 as a fixed circuit version
ebfull Jun 19, 2026
38935f0
circuit: Enforce restricted cross-address proofs in the post-NU 6.3 c…
ebfull Jun 19, 2026
9942174
api: Check PCZT cross-address restrictions
ebfull Jun 19, 2026
657b375
api: Build restricted cross-address bundles
ebfull Jun 19, 2026
a885075
api: Complete restricted post-NU 6.3 workflows
ebfull Jun 19, 2026
44f663a
docs: Document post-NU 6.3 circuit public API changes
ebfull Jun 19, 2026
c55a1e1
refactor: rename BundleProtocol -> BundlePoolRestrictions and its var…
daira Jun 23, 2026
b8def2a
Purely cosmetic changes to comments.
daira Jun 23, 2026
c25c8b3
Conceptual improvements to comments.
daira Jun 23, 2026
4093056
pczt: wrap VerifyError in ProverError::DisallowedCrossAddressTransfer
daira Jun 23, 2026
a4f4c01
bundle/builder: post-NU6.3 cross-address flag semantics; coinbase not…
daira Jun 23, 2026
cd793f5
doc: fix rustdoc link for bundle restrictions
ebfull Jun 23, 2026
8b9d310
Minor test coverage improvement.
daira Jun 23, 2026
a5b2743
Merge pull request #504 from ebfull/ironwood
ebfull Jun 23, 2026
059398a
chore: fix stale references
TalDerei Jun 23, 2026
44818e8
Add QR note version support
ValarDragon Jun 23, 2026
f0fd3b5
Add QR note version plumbing
ValarDragon Jun 23, 2026
5b45a4d
Update bundle test strategies for note versions
ValarDragon Jun 23, 2026
c6e29c4
Add Ironwood note encryption domain
ValarDragon Jun 23, 2026
247ebed
Add tests; Fix AI undoing the witness generation fix
ValarDragon Jun 23, 2026
ef10e25
Fix restricted bundle chain test setup
ValarDragon Jun 23, 2026
4f15ab7
Update src/bundle.rs
ValarDragon Jun 24, 2026
c445aba
Don't reject PCZT spends by note version on parse
ValarDragon Jun 24, 2026
bee5bf0
Update changelog
ValarDragon Jun 24, 2026
e149866
Merge pull request #508 from TalDerei/ironwood-followup-nits
ebfull Jun 24, 2026
b18ce41
Version-tag the rcm derivations: rcm -> rcm_v2, qr_rcm -> rcm_v3
ebfull Jun 24, 2026
ae14738
Expose RandomSeed::rcm_v3 under unstable-voting-circuits
ebfull Jun 24, 2026
be3f7b8
Add Note::psi() and read witness psi from Note, not RandomSeed
ebfull Jun 24, 2026
8d6df33
cargo fmt
ebfull Jun 24, 2026
a872b1b
Merge remote-tracking branch 'upstream/feat/ironwood' into dev/qr-not…
ebfull Jun 24, 2026
f53ba7a
Make bundle decryption helpers pool-aware
ebfull Jun 24, 2026
5d349dc
Limit builder note-version checks to outputs
ebfull Jun 24, 2026
ce8f7d5
Test PCZT note version parsing
ebfull Jun 24, 2026
cdf7332
Rename bundle pool restriction strategy
ebfull Jun 24, 2026
831b8aa
Clarify note encryption version handling
ebfull Jun 24, 2026
17360b5
Use sealed note encryption domain markers
ebfull Jun 24, 2026
27ea1d6
Remove unreachable error.
ebfull Jun 24, 2026
0947ee2
Update CHANGELOG.
ebfull Jun 24, 2026
62ec730
Merge pull request #509 from zcash/dev/qr-note-version
ebfull Jun 24, 2026
288ebab
Update bundle pool parameters for transaction IDs
ebfull Jun 25, 2026
91c3cdd
Revert unnecessary CHANGELOG.md updates.
ebfull Jun 25, 2026
a280ff8
Reference ZIP 229.
ebfull Jun 25, 2026
3fa3d42
Simplify anchor-placement selection and clarify commitment docs
ebfull Jun 25, 2026
3819a09
More CHANGELOG.md fixes.
ebfull Jun 25, 2026
e7f7226
nits: address feedback from @TalDerei
ebfull Jun 25, 2026
c63855f
CHANGELOG.md reorganizations and improvements
ebfull Jun 25, 2026
965caac
Merge pull request #510 from zcash/dev/tx-id
ebfull Jun 25, 2026
a0c1b83
Merge pull request #512 from zcash/ebfull/changelog-cleanups
ebfull Jun 25, 2026
9d6c6db
Reject Ironwood commitments for v5 transactions
ebfull Jun 26, 2026
30c4ea2
Merge pull request #513 from zcash/ebfull/fallible-commitment
ebfull Jun 26, 2026
0715766
Prerelease 0.15.0-pre.0
ebfull Jun 26, 2026
a9b5403
Distinguish value pool, protocol version, and bundle version
nuttycom Jun 28, 2026
4ce1b23
Lift Flags out of BundleType
nuttycom Jun 29, 2026
cbb6ed1
Fix private intra-doc link in Bundle::try_from_parts docs
nuttycom Jun 29, 2026
2f322a2
Use 1-based version numbering for ProtocolVersion and BundleVersion
nuttycom Jun 29, 2026
356ca9e
Make `builder::bundle` argument order consistent with `Builder::new`
nuttycom Jun 29, 2026
973dbd2
Merge pull request #519 from zcash/chore/naming_nits
ebfull Jun 29, 2026
840cd68
Prerelease 0.15.0-pre.1
ebfull Jun 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
301 changes: 300 additions & 1 deletion CHANGELOG.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "orchard"
version = "0.14.0"
version = "0.15.0-pre.1"
authors = [
"Sean Bowe <ewillbefull@gmail.com>",
"Jack Grigg <thestr4d@gmail.com>",
Expand Down
15 changes: 11 additions & 4 deletions benches/circuit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ use pprof::criterion::{Output, PProfProfiler};

use orchard::{
builder::{Builder, BundleType},
circuit::{ProvingKey, VerifyingKey},
bundle::BundleVersion,
circuit::{OrchardCircuitVersion, ProvingKey, VerifyingKey},
keys::{FullViewingKey, Scope, SpendingKey},
value::NoteValue,
Anchor, Bundle,
Expand All @@ -21,11 +22,17 @@ fn criterion_benchmark(c: &mut Criterion) {
let sk = SpendingKey::from_bytes([7; 32]).unwrap();
let recipient = FullViewingKey::from(&sk).address_at(0u32, Scope::External);

let vk = VerifyingKey::build();
let pk = ProvingKey::build();
let vk = VerifyingKey::build(OrchardCircuitVersion::FixedPostNu6_2);
let pk = ProvingKey::build(OrchardCircuitVersion::FixedPostNu6_2);

let create_bundle = |num_recipients| {
let mut builder = Builder::new(BundleType::DEFAULT, Anchor::from_bytes([0; 32]).unwrap());
let mut builder = Builder::new(
BundleType::DEFAULT,
BundleVersion::orchard_v2(),
BundleVersion::orchard_v2().default_flags(),
Anchor::from_bytes([0; 32]).unwrap(),
)
.unwrap();
for _ in 0..num_recipients {
builder
.add_output(None, recipient, NoteValue::from_raw(10), [0; 512])
Expand Down
13 changes: 10 additions & 3 deletions benches/note_decryption.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput};
use orchard::{
builder::{Builder, BundleType},
circuit::ProvingKey,
bundle::BundleVersion,
circuit::{OrchardCircuitVersion, ProvingKey},
keys::{FullViewingKey, PreparedIncomingViewingKey, Scope, SpendingKey},
note_encryption::{CompactAction, OrchardDomain},
value::NoteValue,
Expand All @@ -15,7 +16,7 @@ use pprof::criterion::{Output, PProfProfiler};

fn bench_note_decryption(c: &mut Criterion) {
let rng = OsRng;
let pk = ProvingKey::build();
let pk = ProvingKey::build(OrchardCircuitVersion::FixedPostNu6_2);

let fvk = FullViewingKey::from(&SpendingKey::from_bytes([7; 32]).unwrap());
let valid_ivk = fvk.to_ivk(Scope::External);
Expand Down Expand Up @@ -44,7 +45,13 @@ fn bench_note_decryption(c: &mut Criterion) {
.collect();

let bundle = {
let mut builder = Builder::new(BundleType::DEFAULT, Anchor::from_bytes([0; 32]).unwrap());
let mut builder = Builder::new(
BundleType::DEFAULT,
BundleVersion::orchard_v2(),
BundleVersion::orchard_v2().default_flags(),
Anchor::from_bytes([0; 32]).unwrap(),
)
.unwrap();
// The builder pads to two actions, and shuffles their order. Add two recipients
// so the first action is always decryptable.
builder
Expand Down
10 changes: 5 additions & 5 deletions src/action.rs
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ pub(crate) mod testing {
note_encryption::{OrchardDomain, OrchardNoteEncryption},
primitives::redpallas::{self, testing::arb_valid_spendauth_keypair},
value::{NoteValue, ValueCommitTrapdoor, ValueCommitment},
Note,
Note, NoteVersion,
};

use super::Action;
Expand All @@ -228,10 +228,10 @@ pub(crate) mod testing {

prop_compose! {
/// Generate an action without authorization data.
pub fn arb_unauthorized_action(spend_value: NoteValue, output_value: NoteValue)(
pub fn arb_unauthorized_action(note_version: NoteVersion, spend_value: NoteValue, output_value: NoteValue)(
nf in arb_nullifier(),
(_, rk) in arb_valid_spendauth_keypair(),
note in arb_note(output_value),
note in arb_note(output_value, note_version),
rng_seed in prop::array::uniform32(prop::num::u8::ANY),
) -> Action<()> {
let cmx = ExtractedNoteCommitment::from(note.commitment());
Expand All @@ -254,10 +254,10 @@ pub(crate) mod testing {

prop_compose! {
/// Generate an action with invalid (random) authorization data.
pub fn arb_action(spend_value: NoteValue, output_value: NoteValue)(
pub fn arb_action(note_version: NoteVersion, spend_value: NoteValue, output_value: NoteValue)(
nf in arb_nullifier(),
(rsk, rk) in arb_valid_spendauth_keypair(),
note in arb_note(output_value),
note in arb_note(output_value, note_version),
enc_rng_seed in prop::array::uniform32(prop::num::u8::ANY),
rng_seed in prop::array::uniform32(prop::num::u8::ANY),
fake_sighash in prop::array::uniform32(prop::num::u8::ANY),
Expand Down
10 changes: 10 additions & 0 deletions src/address.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,16 @@ impl Address {
&self.pk_d
}

/// Returns whether `self` and `other` correspond to the same expanded receiver, i.e.
/// have equal `(g_d, pk_d)`.
///
/// This matches the equality notion used by the `disableCrossAddress` circuit
/// constraint, and is intentionally distinct from `PartialEq` on `Address`, which
/// compares the raw diversifier encoding.
pub(crate) fn same_expanded_receiver(&self, other: &Self) -> bool {
self.g_d() == other.g_d() && self.pk_d() == other.pk_d()
}

/// Serializes this address to its "raw" encoding as specified in [Zcash Protocol Spec § 5.6.4.2: Orchard Raw Payment Addresses][orchardpaymentaddrencoding]
///
/// [orchardpaymentaddrencoding]: https://zips.z.cash/protocol/protocol.pdf#orchardpaymentaddrencoding
Expand Down
Loading
Loading