Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
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
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
Expand Up @@ -127,4 +127,4 @@ codegen-units = 1
[patch.crates-io]
zcash_note_encryption = { version = "0.4", git = "https://github.com/QED-it/zcash_note_encryption", branch = "zsa1" }
sapling = { package = "sapling-crypto", version = "0.1.3", git = "https://github.com/QED-it/sapling-crypto", branch = "zsa1" }
orchard = { version = "0.8.0", git = "https://github.com/QED-it/orchard", rev = "25020f857fd40125b3872ece1c0a2e2059145a17" }
orchard = { version = "0.8.0", git = "https://github.com/QED-it/orchard", rev = "3dbdbc52c6e2ffeca015ae6eb80ad7f1c870384d" }
2 changes: 1 addition & 1 deletion zcash_client_backend/src/decrypt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use zcash_primitives::{
use crate::{data_api::DecryptedTransaction, keys::UnifiedFullViewingKey};

#[cfg(feature = "orchard")]
use orchard::note_encryption::OrchardDomain;
use orchard::domain::OrchardDomain;

/// An enumeration of the possible relationships a TXO can have to the wallet.
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
Expand Down
4 changes: 2 additions & 2 deletions zcash_client_backend/src/proto.rs
Original file line number Diff line number Diff line change
Expand Up @@ -187,12 +187,12 @@ impl compact_formats::CompactSaplingSpend {

#[cfg(feature = "orchard")]
impl TryFrom<&compact_formats::CompactOrchardAction>
for orchard::note_encryption::CompactAction<orchard::orchard_flavor::OrchardVanilla>
for orchard::domain::CompactAction<orchard::orchard_flavor::OrchardVanilla>
{
type Error = ();

fn try_from(value: &compact_formats::CompactOrchardAction) -> Result<Self, Self::Error> {
Ok(orchard::note_encryption::CompactAction::from_parts(
Ok(orchard::domain::CompactAction::from_parts(
value.nf()?,
value.cmx()?,
value.ephemeral_key()?,
Expand Down
6 changes: 3 additions & 3 deletions zcash_client_backend/src/scanning.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ use crate::{

#[cfg(feature = "orchard")]
use orchard::{
note_encryption::{CompactAction, OrchardDomain},
domain::{CompactAction, OrchardDomain},
orchard_flavor::OrchardVanilla,
tree::MerkleHashOrchard,
};
Expand Down Expand Up @@ -537,14 +537,14 @@ type TaggedSaplingBatchRunner<IvkTag, Tasks> = BatchRunner<
type TaggedOrchardBatch<IvkTag> = Batch<
IvkTag,
OrchardDomain<OrchardVanilla>,
orchard::note_encryption::CompactAction<OrchardVanilla>,
orchard::domain::CompactAction<OrchardVanilla>,
CompactDecryptor,
>;
#[cfg(feature = "orchard")]
type TaggedOrchardBatchRunner<IvkTag, Tasks> = BatchRunner<
IvkTag,
OrchardDomain<OrchardVanilla>,
orchard::note_encryption::CompactAction<OrchardVanilla>,
orchard::domain::CompactAction<OrchardVanilla>,
CompactDecryptor,
Tasks,
>;
Expand Down
2 changes: 1 addition & 1 deletion zcash_client_sqlite/src/wallet/orchard.rs
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,7 @@ pub(crate) mod tests {
use incrementalmerkletree::{Hashable, Level};
use orchard::{
keys::{FullViewingKey, SpendingKey},
note_encryption::OrchardDomain,
domain::OrchardDomain,
tree::MerkleHashOrchard,
};
use shardtree::error::ShardTreeError;
Expand Down
64 changes: 17 additions & 47 deletions zcash_primitives/src/transaction/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,7 @@ impl<'a, P: consensus::Parameters> Builder<'a, P, ()> {
ik: IssuanceAuthorizingKey,
asset_desc: Vec<u8>,
issue_info: Option<IssueInfo>,
first_issuance: bool,
) -> Result<(), Error<FE>> {
assert!(self.build_config.orchard_bundle_type()? == BundleType::DEFAULT_ZSA);

Expand All @@ -482,6 +483,7 @@ impl<'a, P: consensus::Parameters> Builder<'a, P, ()> {
IssuanceValidatingKey::from(&ik),
asset_desc,
issue_info,
first_issuance,
OsRng,
)
.map_err(Error::IssuanceBundle)?
Expand All @@ -499,12 +501,13 @@ impl<'a, P: consensus::Parameters> Builder<'a, P, ()> {
asset_desc: &[u8],
recipient: Address,
value: orchard::value::NoteValue,
first_issuance: bool,
) -> Result<(), Error<FE>> {
assert!(self.build_config.orchard_bundle_type()? == BundleType::DEFAULT_ZSA);
self.issuance_builder
.as_mut()
.ok_or(Error::IssuanceBuilderNotAvailable)?
.add_recipient(asset_desc, recipient, value, OsRng)
.add_recipient(asset_desc, recipient, value, first_issuance, OsRng)
.map_err(Error::IssuanceBundle)?;

Ok(())
Expand Down Expand Up @@ -874,19 +877,13 @@ impl<'a, P: consensus::Parameters, U: sapling::builder::ProverProgress> Builder<
if bundle_type == BundleType::DEFAULT_ZSA {
#[cfg(zcash_unstable = "nu6" /* TODO nu7 */ )]
{
let (bundle, meta) = builder
.build(&mut rng)
.map_err(Error::OrchardBuild)?
.unwrap();
let (bundle, meta) = builder.build(&mut rng).map_err(Error::OrchardBuild)?;

unproven_orchard_zsa_bundle = Some(bundle);
orchard_meta = meta;
}
} else {
let (bundle, meta) = builder
.build(&mut rng)
.map_err(Error::OrchardBuild)?
.unwrap();
let (bundle, meta) = builder.build(&mut rng).map_err(Error::OrchardBuild)?;
unproven_orchard_bundle = Some(bundle);
orchard_meta = meta;
}
Expand Down Expand Up @@ -1458,20 +1455,14 @@ mod tests {
let asset_desc: Vec<u8> = "asset_desc".into();

builder
.init_issuance_bundle::<FeeError>(iak, asset_desc.clone(), None)
.init_issuance_bundle::<FeeError>(iak, asset_desc.clone(), None, false)
.unwrap();

let tx = builder.mock_build_no_fee(OsRng).unwrap().into_transaction();
let bundle = tx.issue_bundle().unwrap();

assert_eq!(bundle.actions().len(), 1, "There should be only one action");
let actions = bundle.get_actions_by_desc(&asset_desc);
assert_eq!(
actions.len(),
1,
"The one action should correspond to asset_desc"
);
let action = actions[0];
let action = bundle.get_action_by_desc(&asset_desc).unwrap();
assert!(action.is_finalized(), "Action should be finalized");
assert_eq!(action.notes().len(), 0, "Action should have zero notes");
}
Expand All @@ -1491,20 +1482,15 @@ mod tests {
recipient: address,
value: NoteValue::from_raw(42),
}),
false,
)
.unwrap();

let binding = builder.mock_build_no_fee(OsRng).unwrap().into_transaction();
let bundle = binding.issue_bundle().unwrap();

assert_eq!(bundle.actions().len(), 1, "There should be only one action");
let actions = bundle.get_actions_by_desc(&asset_desc);
assert_eq!(
actions.len(),
1,
"The one action should correspond to asset_desc"
);
let action = actions[0];
let action = bundle.get_action_by_desc(&asset_desc).unwrap();
assert!(!action.is_finalized(), "Action should not be finalized");
assert_eq!(action.notes().len(), 1, "Action should have 1 note");
assert_eq!(
Expand All @@ -1529,23 +1515,18 @@ mod tests {
recipient: address,
value: NoteValue::from_raw(42),
}),
false,
)
.unwrap();
builder
.add_recipient::<FeeError>(&asset_desc, address, NoteValue::from_raw(21))
.add_recipient::<FeeError>(&asset_desc, address, NoteValue::from_raw(21), false)
.unwrap();

let binding = builder.mock_build_no_fee(OsRng).unwrap().into_transaction();
let bundle = binding.issue_bundle().unwrap();

assert_eq!(bundle.actions().len(), 1, "There should be only one action");
let actions = bundle.get_actions_by_desc(&asset_desc);
assert_eq!(
actions.len(),
1,
"The one action should correspond to asset_desc"
);
let action = actions[0];
let action = bundle.get_action_by_desc(&asset_desc).unwrap();
assert!(!action.is_finalized(), "Action should not be finalized");
assert_eq!(action.notes().len(), 2, "Action should have 2 notes");
assert_eq!(
Expand Down Expand Up @@ -1575,24 +1556,19 @@ mod tests {
recipient: address,
value: NoteValue::from_raw(42),
}),
false,
)
.unwrap();
builder
.add_recipient::<FeeError>(&asset_desc_2, address, NoteValue::from_raw(21))
.add_recipient::<FeeError>(&asset_desc_2, address, NoteValue::from_raw(21), false)
Comment thread
PaulLaux marked this conversation as resolved.
.unwrap();

let binding = builder.mock_build_no_fee(OsRng).unwrap().into_transaction();
let bundle = binding.issue_bundle().unwrap();

assert_eq!(bundle.actions().len(), 2, "There should be 2 actions");

let actions = bundle.get_actions_by_desc(&asset_desc_1);
assert_eq!(
actions.len(),
1,
"Only one action should correspond to asset_desc_1"
);
let action = actions[0];
let action = bundle.get_action_by_desc(&asset_desc_1).unwrap();
assert!(!action.is_finalized(), "Action should not be finalized");
assert_eq!(action.notes().len(), 1, "Action should have 1 note");
assert_eq!(
Expand All @@ -1605,13 +1581,7 @@ mod tests {
"Incorrect notes sum"
);

let actions_2 = bundle.get_actions_by_desc(&asset_desc_2);
assert_eq!(
actions_2.len(),
1,
"Only one action should correspond to asset_desc_2"
);
let action2 = actions_2[0];
let action2 = bundle.get_action_by_desc(&asset_desc_2).unwrap();
assert!(!action2.is_finalized(), "Action should not be finalized");
assert_eq!(action2.notes().len(), 1, "Action should have 1 note");
assert_eq!(
Expand Down
4 changes: 2 additions & 2 deletions zcash_primitives/src/transaction/components/orchard.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ use byteorder::{ReadBytesExt, WriteBytesExt};
use nonempty::NonEmpty;
use orchard::{
bundle::{Authorization, Authorized, Flags},
domain::OrchardDomainCommon,
note::{AssetBase, ExtractedNoteCommitment, Nullifier, TransmittedNoteCiphertext},
note_encryption::OrchardDomainCommon,
orchard_flavor::{OrchardVanilla, OrchardZSA},
primitives::redpallas::{self, SigType, Signature, SpendAuth, VerificationKey},
value::{NoteValue, ValueCommitment},
Expand Down Expand Up @@ -390,7 +390,7 @@ fn write_orchard_bundle_contents<W: Write, D: OrchardDomainCommon + WriteBurn<W>
|w, b| w.write_u8(*b),
)?;

writer.write_u32::<LittleEndian>(u32::from(timelimit))?;
writer.write_u32::<LittleEndian>(timelimit)?;

Array::write(
&mut writer,
Expand Down
8 changes: 3 additions & 5 deletions zcash_primitives/src/transaction/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ const V5_VERSION_GROUP_ID: u32 = 0x26A7270A;
#[cfg(zcash_unstable = "nu6" /* TODO nu7 */ )]
const V6_TX_VERSION: u32 = 6;
#[cfg(zcash_unstable = "nu6" /* TODO nu7 */ )]
const V6_VERSION_GROUP_ID: u32 = 0x124A69F8; // TODO ???
const V6_VERSION_GROUP_ID: u32 = 0x77777777; // TODO ???

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

still todo?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have values for V6 anywhere? Anyway this one is consistent with python so I suggest to merge as is and probably create new PR with final values when we have them


/// These versions are used exclusively for in-development transaction
/// serialization, and will never be active under the consensus rules.
Expand Down Expand Up @@ -338,12 +338,10 @@ impl Authorization for Unauthorized {
type TransparentAuth = transparent::builder::Unauthorized;
type SaplingAuth =
sapling_builder::InProgress<sapling_builder::Proven, sapling_builder::Unsigned>;
type OrchardAuth =
orchard::builder::InProgress<Unproven<OrchardVanilla>, orchard::builder::Unauthorized>;
type OrchardAuth = orchard::builder::InProgress<Unproven, orchard::builder::Unauthorized>;

#[cfg(zcash_unstable = "nu6" /* TODO nu7 */ )]
type OrchardZsaAuth =
orchard::builder::InProgress<Unproven<OrchardZSA>, orchard::builder::Unauthorized>;
type OrchardZsaAuth = orchard::builder::InProgress<Unproven, orchard::builder::Unauthorized>;

#[cfg(zcash_unstable = "nu6" /* TODO nu7 */ )]
type IssueAuth = orchard::issuance::Unauthorized;
Expand Down
Loading