diff --git a/Cargo.lock b/Cargo.lock index 534bfdef69..39c860757e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4230,6 +4230,7 @@ dependencies = [ "colored_json", "comfy-table", "decaf377", + "decaf377-rdsa", "dialoguer", "directories", "ed25519-consensus", @@ -4630,6 +4631,7 @@ dependencies = [ "penumbra-dex", "penumbra-proof-params", "penumbra-proto", + "penumbra-sct", "penumbra-shielded-pool", "penumbra-storage", "penumbra-tct", @@ -4771,6 +4773,8 @@ dependencies = [ "base64 0.20.0", "blake2b_simd 0.5.11", "decaf377", + "decaf377-fmd", + "decaf377-ka", "futures", "hex", "im", @@ -4896,6 +4900,7 @@ dependencies = [ "penumbra-proof-params", "penumbra-proto", "penumbra-sct", + "penumbra-shielded-pool", "penumbra-storage", "penumbra-tct", "proptest", @@ -5070,6 +5075,9 @@ dependencies = [ "bech32", "criterion 0.4.0", "decaf377", + "decaf377-fmd", + "decaf377-ka", + "decaf377-rdsa", "hex", "num-bigint", "once_cell", @@ -5080,6 +5088,7 @@ dependencies = [ "penumbra-governance", "penumbra-keys", "penumbra-num", + "penumbra-sct", "penumbra-shielded-pool", "penumbra-stake", "penumbra-tct", @@ -5127,18 +5136,26 @@ version = "0.55.0" dependencies = [ "anyhow", "ark-ff", + "ark-r1cs-std", + "ark-relations", + "ark-serialize", "async-trait", "bincode", "blake2b_simd 0.5.11", "bytes", + "decaf377", "decaf377-rdsa", + "hex", "metrics", + "once_cell", "penumbra-chain", "penumbra-component", "penumbra-crypto", + "penumbra-keys", "penumbra-proto", "penumbra-storage", "penumbra-tct", + "poseidon377", "rand 0.8.5", "rand_core 0.6.4", "serde", @@ -5161,12 +5178,15 @@ dependencies = [ "base64 0.20.0", "blake2b_simd 0.5.11", "bytes", + "chacha20poly1305", "decaf377", "decaf377-fmd", "decaf377-ka", "decaf377-rdsa", + "hex", "im", "metrics", + "once_cell", "penumbra-asset", "penumbra-chain", "penumbra-component", @@ -5184,6 +5204,7 @@ dependencies = [ "rand_core 0.6.4", "serde", "tendermint", + "thiserror", "tracing", ] @@ -5427,6 +5448,7 @@ dependencies = [ "penumbra-num", "penumbra-proof-params", "penumbra-proto", + "penumbra-sct", "penumbra-shielded-pool", "penumbra-stake", "penumbra-tct", @@ -5454,6 +5476,7 @@ dependencies = [ "bytes", "camino", "clap 3.2.25", + "decaf377", "digest 0.9.0", "ed25519-consensus", "futures", @@ -5555,6 +5578,7 @@ dependencies = [ "penumbra-keys", "penumbra-num", "penumbra-proto", + "penumbra-sct", "penumbra-shielded-pool", "penumbra-stake", "penumbra-tct", diff --git a/crates/bin/pcli/Cargo.toml b/crates/bin/pcli/Cargo.toml index be34402d6f..8183cc064e 100644 --- a/crates/bin/pcli/Cargo.toml +++ b/crates/bin/pcli/Cargo.toml @@ -43,6 +43,7 @@ penumbra-view = { path = "../../view" } # Penumbra dependencies decaf377 = { version = "0.4" } +decaf377-rdsa = { version = "0.6" } tendermint = { version = "0.32.0", features = ["rust-crypto"] } jmt = "0.6" diff --git a/crates/bin/pcli/src/command/query/shielded_pool.rs b/crates/bin/pcli/src/command/query/shielded_pool.rs index e354466083..dd4319add2 100644 --- a/crates/bin/pcli/src/command/query/shielded_pool.rs +++ b/crates/bin/pcli/src/command/query/shielded_pool.rs @@ -2,8 +2,8 @@ use anyhow::Result; use colored_json::prelude::*; use penumbra_chain::{NoteSource, SpendInfo}; use penumbra_compact_block::CompactBlock; -use penumbra_crypto::Nullifier; use penumbra_proto::DomainType; +use penumbra_sct::Nullifier; use penumbra_tct::StateCommitment; #[derive(Debug, clap::Subcommand)] diff --git a/crates/bin/pcli/src/command/view/tx.rs b/crates/bin/pcli/src/command/view/tx.rs index aba313faa3..316a970ed4 100644 --- a/crates/bin/pcli/src/command/view/tx.rs +++ b/crates/bin/pcli/src/command/view/tx.rs @@ -1,7 +1,6 @@ use anyhow::{Context, Result}; use comfy_table::{presets, Table}; use penumbra_asset::{asset::Cache, Value}; -use penumbra_crypto::{Note, NoteView}; use penumbra_dex::{ lp::position::Position, swap::SwapPlaintext, @@ -11,6 +10,7 @@ use penumbra_dex::{ }; use penumbra_keys::{keys::IncomingViewingKey, Address}; use penumbra_proto::{client::v1alpha1::GetTxRequest, DomainType}; +use penumbra_shielded_pool::{Note, NoteView}; use penumbra_transaction::{ view::action_view::{OutputView, SpendView}, Transaction, diff --git a/crates/bin/pcli/tests/proof.rs b/crates/bin/pcli/tests/proof.rs index dfc9fe41de..60e9420bba 100644 --- a/crates/bin/pcli/tests/proof.rs +++ b/crates/bin/pcli/tests/proof.rs @@ -2,12 +2,9 @@ //! proving/verification key. use ark_ff::UniformRand; -use decaf377::Fr; +use decaf377::{Fq, Fr}; +use decaf377_rdsa::{SigningKey, SpendAuth, VerificationKey}; use penumbra_asset::{asset, Balance, Value}; -use penumbra_crypto::{ - rdsa::{self, SpendAuth, VerificationKey}, - Fq, Note, Nullifier, -}; use penumbra_dex::{ swap::proof::SwapProof, swap::SwapPlaintext, swap_claim::proof::SwapClaimProof, BatchSwapOutputData, TradingPair, @@ -24,6 +21,8 @@ use penumbra_proof_params::{ SWAP_PROOF_PROVING_KEY, SWAP_PROOF_VERIFICATION_KEY, UNDELEGATECLAIM_PROOF_PROVING_KEY, UNDELEGATECLAIM_PROOF_VERIFICATION_KEY, }; +use penumbra_sct::Nullifier; +use penumbra_shielded_pool::Note; use penumbra_shielded_pool::{NullifierDerivationProof, OutputProof, SpendProof}; use penumbra_stake::{IdentityKey, Penalty, UnbondingToken, UndelegateClaimProof}; use penumbra_tct as tct; @@ -254,7 +253,7 @@ fn swap_claim_parameters_vs_current_swap_claim_circuit() { let anchor = sct.root(); let state_commitment_proof = sct.witness(swap_commitment).unwrap(); let position = state_commitment_proof.position(); - let nullifier: penumbra_crypto::Nullifier = Nullifier::derive(&nk, position, &swap_commitment); + let nullifier = Nullifier::derive(&nk, position, &swap_commitment); let epoch_duration = 20; let height = epoch_duration * position.epoch() + position.block(); @@ -405,7 +404,7 @@ fn undelegate_claim_parameters_vs_current_undelegate_claim_circuit() { let mut rng = OsRng; - let sk = rdsa::SigningKey::new_from_field(Fr::from(1u8)); + let sk = SigningKey::new_from_field(Fr::from(1u8)); let balance_blinding = Fr::from(1u8); let value1_amount = 1u64; let penalty_amount = 1u64; diff --git a/crates/core/app/src/action_handler/transaction.rs b/crates/core/app/src/action_handler/transaction.rs index 82a76c755e..0385f88f67 100644 --- a/crates/core/app/src/action_handler/transaction.rs +++ b/crates/core/app/src/action_handler/transaction.rs @@ -105,9 +105,8 @@ mod tests { use anyhow::Result; use penumbra_asset::{Value, STAKING_TOKEN_ASSET_ID}; use penumbra_chain::test_keys; - use penumbra_crypto::Note; use penumbra_fee::Fee; - use penumbra_shielded_pool::{OutputPlan, SpendPlan}; + use penumbra_shielded_pool::{Note, OutputPlan, SpendPlan}; use penumbra_tct as tct; use penumbra_transaction::{plan::TransactionPlan, WitnessData}; use rand_core::OsRng; diff --git a/crates/core/app/src/governance/state_key.rs b/crates/core/app/src/governance/state_key.rs index 56095372bd..6528008f30 100644 --- a/crates/core/app/src/governance/state_key.rs +++ b/crates/core/app/src/governance/state_key.rs @@ -1,4 +1,4 @@ -use penumbra_crypto::Nullifier; +use penumbra_sct::Nullifier; use penumbra_stake::IdentityKey; pub fn next_proposal_id() -> &'static str { diff --git a/crates/core/app/src/governance/view.rs b/crates/core/app/src/governance/view.rs index b5a09b23cd..0a62b47fe4 100644 --- a/crates/core/app/src/governance/view.rs +++ b/crates/core/app/src/governance/view.rs @@ -11,9 +11,9 @@ use penumbra_chain::{ component::{StateReadExt as _, StateWriteExt as _}, params::ChainParameters, }; -use penumbra_crypto::Nullifier; use penumbra_num::Amount; use penumbra_proto::{StateReadProto, StateWriteProto}; +use penumbra_sct::Nullifier; use penumbra_shielded_pool::component::{StateReadExt as _, SupplyRead}; use penumbra_stake::{DelegationToken, GovernanceKey, IdentityKey}; use penumbra_storage::{StateRead, StateWrite}; diff --git a/crates/core/app/src/mock_client.rs b/crates/core/app/src/mock_client.rs index becb3c3ae0..b8d55f39b0 100644 --- a/crates/core/app/src/mock_client.rs +++ b/crates/core/app/src/mock_client.rs @@ -1,10 +1,10 @@ use std::collections::BTreeMap; use penumbra_compact_block::{component::StateReadExt as _, CompactBlock, StatePayload}; -use penumbra_crypto::{note, Note}; use penumbra_dex::swap::SwapPlaintext; use penumbra_keys::FullViewingKey; use penumbra_sct::component::StateReadExt as _; +use penumbra_shielded_pool::{note, Note}; use penumbra_storage::StateRead; use penumbra_tct as tct; diff --git a/crates/core/component/chain/src/genesis/allocation.rs b/crates/core/component/chain/src/genesis/allocation.rs index cb0a016956..9be5c65a5e 100644 --- a/crates/core/component/chain/src/genesis/allocation.rs +++ b/crates/core/component/chain/src/genesis/allocation.rs @@ -1,5 +1,3 @@ -use penumbra_asset::{asset, Value}; -use penumbra_crypto::{Note, Rseed}; use penumbra_keys::Address; use penumbra_num::Amount; use penumbra_proto::{core::chain::v1alpha1 as pb, DomainType, TypeUrl}; @@ -57,27 +55,6 @@ impl std::fmt::Debug for Allocation { } } -impl Allocation { - /// Obtain a note corresponding to this allocation. - /// - /// Note: to ensure determinism, this uses a zero rseed when - /// creating the note. - pub fn note(&self) -> Result { - Note::from_parts( - self.address, - Value { - amount: self.amount, - asset_id: asset::REGISTRY - .parse_denom(&self.denom) - .ok_or_else(|| anyhow::anyhow!("invalid denomination"))? - .id(), - }, - Rseed([0u8; 32]), - ) - .map_err(Into::into) - } -} - impl TypeUrl for Allocation { // TODO: verify! const TYPE_URL: &'static str = "/penumbra.core.chain.v1alpha1.genesis_app_state.Allocation"; diff --git a/crates/core/component/compact-block/Cargo.toml b/crates/core/component/compact-block/Cargo.toml index a783091235..7c9b4928fe 100644 --- a/crates/core/component/compact-block/Cargo.toml +++ b/crates/core/component/compact-block/Cargo.toml @@ -23,6 +23,7 @@ penumbra-component = { path = "../component", optional = true } penumbra-chain = { path = "../chain", default-features = false } penumbra-shielded-pool = { path = "../shielded-pool", default-features = false } penumbra-dex = { path = "../dex", default-features = false } +penumbra-sct = { path = "../sct", default-features = false } # Penumbra dependencies decaf377-rdsa = { version = "0.6" } diff --git a/crates/core/component/compact-block/src/compact_block.rs b/crates/core/component/compact-block/src/compact_block.rs index a1d11602cb..361edaadcc 100644 --- a/crates/core/component/compact-block/src/compact_block.rs +++ b/crates/core/component/compact-block/src/compact_block.rs @@ -2,11 +2,11 @@ use std::{collections::BTreeMap, convert::TryFrom}; use anyhow::Result; use penumbra_chain::params::{ChainParameters, FmdParameters}; -use penumbra_crypto::Nullifier; use penumbra_dex::{BatchSwapOutputData, TradingPair}; use penumbra_proto::{ client::v1alpha1::CompactBlockRangeResponse, core::chain::v1alpha1 as pb, DomainType, TypeUrl, }; +use penumbra_sct::Nullifier; use penumbra_tct::builder::{block, epoch}; use serde::{Deserialize, Serialize}; diff --git a/crates/core/component/compact-block/src/state_payload.rs b/crates/core/component/compact-block/src/state_payload.rs index 1bb62d99cd..c412a50598 100644 --- a/crates/core/component/compact-block/src/state_payload.rs +++ b/crates/core/component/compact-block/src/state_payload.rs @@ -1,9 +1,9 @@ use std::convert::TryFrom; use anyhow::Result; -use penumbra_crypto::{note, NotePayload}; use penumbra_dex::swap::SwapPayload; use penumbra_proto::core::chain::v1alpha1::{self as pb}; +use penumbra_shielded_pool::{note, NotePayload}; use serde::{Deserialize, Serialize}; diff --git a/crates/core/component/dex/Cargo.toml b/crates/core/component/dex/Cargo.toml index 43ee477387..c9eea0aed1 100644 --- a/crates/core/component/dex/Cargo.toml +++ b/crates/core/component/dex/Cargo.toml @@ -26,6 +26,8 @@ penumbra-proof-params = { path = "../../../crypto/proof-params" } penumbra-asset = { path = "../../../core/asset", default-features = false } penumbra-num = { path = "../../../core/num", default-features = false } penumbra-keys = { path = "../../../core/keys", default-features = false } +decaf377-ka = { path = "../../../crypto/decaf377-ka/" } +decaf377-fmd = { path = "../../../crypto/decaf377-fmd/" } # Penumbra dependencies poseidon377 = { version = "0.6", features = ["r1cs"] } diff --git a/crates/core/component/dex/src/swap/ciphertext.rs b/crates/core/component/dex/src/swap/ciphertext.rs index 01df12a628..8cd044556c 100644 --- a/crates/core/component/dex/src/swap/ciphertext.rs +++ b/crates/core/component/dex/src/swap/ciphertext.rs @@ -1,7 +1,7 @@ use anyhow::Result; -use penumbra_crypto::{note, PayloadKey}; use penumbra_keys::keys::OutgoingViewingKey; +use penumbra_shielded_pool::{note, PayloadKey}; use super::{SwapPlaintext, SWAP_CIPHERTEXT_BYTES, SWAP_LEN_BYTES}; diff --git a/crates/core/component/dex/src/swap/plaintext.rs b/crates/core/component/dex/src/swap/plaintext.rs index 57c3d27193..13b59fa615 100644 --- a/crates/core/component/dex/src/swap/plaintext.rs +++ b/crates/core/component/dex/src/swap/plaintext.rs @@ -14,10 +14,12 @@ use penumbra_tct::StateCommitment; use poseidon377::{hash_1, hash_4, hash_7}; use rand_core::{CryptoRng, RngCore}; +use decaf377_ka as ka; use penumbra_asset::{asset, Value, ValueVar}; -use penumbra_crypto::{ka, note::StateCommitmentVar, Note, PayloadKey, Rseed}; use penumbra_keys::{keys::OutgoingViewingKey, Address, AddressVar}; use penumbra_num::{Amount, AmountVar}; +use penumbra_shielded_pool::{Note, PayloadKey, Rseed}; +use penumbra_tct::r1cs::StateCommitmentVar; use crate::{BatchSwapOutputData, TradingPair, TradingPairVar}; diff --git a/crates/core/component/dex/src/swap/proof.rs b/crates/core/component/dex/src/swap/proof.rs index 2268bc7da0..83fdc1ecb4 100644 --- a/crates/core/component/dex/src/swap/proof.rs +++ b/crates/core/component/dex/src/swap/proof.rs @@ -7,9 +7,13 @@ use ark_relations::r1cs::{ConstraintSynthesizer, ConstraintSystemRef}; use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; use ark_snark::SNARK; use decaf377::{Bls12_377, FieldExt}; +use decaf377::{Fq, Fr}; +use decaf377_fmd as fmd; +use decaf377_ka as ka; use penumbra_fee::Fee; use penumbra_proto::{core::crypto::v1alpha1 as pb, DomainType, TypeUrl}; use penumbra_tct as tct; +use penumbra_tct::r1cs::StateCommitmentVar; use rand_core::OsRng; use penumbra_asset::{ @@ -17,8 +21,8 @@ use penumbra_asset::{ balance::{self, commitment::BalanceCommitmentVar, BalanceVar}, Value, }; -use penumbra_crypto::{fmd, ka, note::StateCommitmentVar, Fq, Fr, Rseed}; use penumbra_keys::{keys::Diversifier, Address}; +use penumbra_shielded_pool::Rseed; use crate::{ swap::{SwapPlaintext, SwapPlaintextVar}, diff --git a/crates/core/component/dex/src/swap_claim/action.rs b/crates/core/component/dex/src/swap_claim/action.rs index c5eb40e705..fcaabb1965 100644 --- a/crates/core/component/dex/src/swap_claim/action.rs +++ b/crates/core/component/dex/src/swap_claim/action.rs @@ -1,9 +1,9 @@ use anyhow::Context; use penumbra_asset::Balance; -use penumbra_crypto::Nullifier; use penumbra_fee::Fee; use penumbra_proof_params::GROTH16_PROOF_LENGTH_BYTES; use penumbra_proto::{core::dex::v1alpha1 as pb, DomainType, TypeUrl}; +use penumbra_sct::Nullifier; use penumbra_tct as tct; use crate::BatchSwapOutputData; diff --git a/crates/core/component/dex/src/swap_claim/plan.rs b/crates/core/component/dex/src/swap_claim/plan.rs index 2331b57dcc..dd27d338da 100644 --- a/crates/core/component/dex/src/swap_claim/plan.rs +++ b/crates/core/component/dex/src/swap_claim/plan.rs @@ -1,11 +1,12 @@ use penumbra_asset::{Balance, Value}; -use penumbra_crypto::{FieldExt, Fq, Nullifier}; +use penumbra_crypto::{FieldExt, Fq}; use penumbra_keys::{ keys::{IncomingViewingKey, NullifierKey}, FullViewingKey, }; use penumbra_proof_params::SWAPCLAIM_PROOF_PROVING_KEY; use penumbra_proto::{core::dex::v1alpha1 as pb, DomainType, TypeUrl}; +use penumbra_sct::Nullifier; use penumbra_tct as tct; use serde::{Deserialize, Serialize}; diff --git a/crates/core/component/dex/src/swap_claim/proof.rs b/crates/core/component/dex/src/swap_claim/proof.rs index cd87a288c7..0daeccc7c6 100644 --- a/crates/core/component/dex/src/swap_claim/proof.rs +++ b/crates/core/component/dex/src/swap_claim/proof.rs @@ -6,22 +6,24 @@ use ark_r1cs_std::prelude::*; use ark_relations::r1cs::{ConstraintSynthesizer, ConstraintSystemRef}; use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; use ark_snark::SNARK; -use decaf377::{r1cs::FqVar, Bls12_377}; +use decaf377::{r1cs::FqVar, Bls12_377, Fq}; use penumbra_fee::Fee; use penumbra_proto::{core::crypto::v1alpha1 as pb, DomainType, TypeUrl}; use penumbra_tct as tct; +use penumbra_tct::r1cs::StateCommitmentVar; use rand_core::OsRng; use penumbra_asset::{ asset::{self}, Value, ValueVar, }; -use penumbra_crypto::{ - note::{self, NoteVar, StateCommitmentVar}, - Fq, Nullifier, NullifierVar, Rseed, -}; use penumbra_keys::keys::{NullifierKey, NullifierKeyVar, SeedPhrase, SpendKey}; use penumbra_num::{Amount, AmountVar}; +use penumbra_sct::{Nullifier, NullifierVar}; +use penumbra_shielded_pool::{ + note::{self, NoteVar}, + Rseed, +}; use crate::{ batch_swap_output_data::BatchSwapOutputDataVar, @@ -105,7 +107,7 @@ impl ConstraintSynthesizer for SwapClaimCircuit { let swap_plaintext_var = SwapPlaintextVar::new_witness(cs.clone(), || Ok(self.swap_plaintext.clone()))?; - let claimed_swap_commitment = note::StateCommitmentVar::new_witness(cs.clone(), || { + let claimed_swap_commitment = StateCommitmentVar::new_witness(cs.clone(), || { Ok(self.state_commitment_proof.commitment()) })?; diff --git a/crates/core/component/dex/src/swap_claim/view.rs b/crates/core/component/dex/src/swap_claim/view.rs index 91ed0fe911..1ed65032e1 100644 --- a/crates/core/component/dex/src/swap_claim/view.rs +++ b/crates/core/component/dex/src/swap_claim/view.rs @@ -1,5 +1,5 @@ -use penumbra_crypto::NoteView; use penumbra_proto::{core::dex::v1alpha1 as pbd, DomainType, TypeUrl}; +use penumbra_shielded_pool::NoteView; use serde::{Deserialize, Serialize}; use super::SwapClaim; diff --git a/crates/core/component/governance/Cargo.toml b/crates/core/component/governance/Cargo.toml index 52acfbea96..531ceb9dfb 100644 --- a/crates/core/component/governance/Cargo.toml +++ b/crates/core/component/governance/Cargo.toml @@ -27,6 +27,7 @@ penumbra-proof-params = { path = "../../../crypto/proof-params", default-feature penumbra-crypto = { path = "../../crypto", default-features = false } penumbra-sct = { path = "../sct", default-features = false } penumbra-component = { path = "../component", optional = true } +penumbra-shielded-pool = { path = "../shielded-pool", optional = true } penumbra-chain = { path = "../chain", default-features = false } penumbra-asset = { path = "../../../core/asset", default-features = false } penumbra-keys = { path = "../../../core/keys", default-features = false } diff --git a/crates/core/component/governance/src/delegator_vote/proof.rs b/crates/core/component/governance/src/delegator_vote/proof.rs index 29ee7a30a9..d45f5f9f12 100644 --- a/crates/core/component/governance/src/delegator_vote/proof.rs +++ b/crates/core/component/governance/src/delegator_vote/proof.rs @@ -15,16 +15,18 @@ use ark_snark::SNARK; use decaf377_rdsa::{SpendAuth, VerificationKey}; use penumbra_proto::{core::crypto::v1alpha1 as pb, DomainType, TypeUrl}; use penumbra_tct as tct; +use penumbra_tct::r1cs::StateCommitmentVar; use rand_core::OsRng; use tct::r1cs::PositionVar; use penumbra_asset::{balance, balance::commitment::BalanceCommitmentVar, Value}; -use penumbra_crypto::{note, Note, Nullifier, NullifierVar, Rseed}; use penumbra_keys::keys::{ AuthorizationKeyVar, IncomingViewingKeyVar, NullifierKey, NullifierKeyVar, RandomizedVerificationKey, SeedPhrase, SpendAuthRandomizerVar, SpendKey, }; use penumbra_proof_params::{ParameterSetup, VerifyingKeyExt, GROTH16_PROOF_LENGTH_BYTES}; +use penumbra_sct::{Nullifier, NullifierVar}; +use penumbra_shielded_pool::{note, Note, Rseed}; /// Groth16 proof for delegator voting. #[derive(Clone, Debug)] @@ -91,7 +93,7 @@ impl ConstraintSynthesizer for DelegatorVoteCircuit { fn generate_constraints(self, cs: ConstraintSystemRef) -> ark_relations::r1cs::Result<()> { // Witnesses let note_var = note::NoteVar::new_witness(cs.clone(), || Ok(self.note.clone()))?; - let claimed_note_commitment = note::StateCommitmentVar::new_witness(cs.clone(), || { + let claimed_note_commitment = StateCommitmentVar::new_witness(cs.clone(), || { Ok(self.state_commitment_proof.commitment()) })?; @@ -351,8 +353,8 @@ mod tests { use decaf377::{Fq, Fr}; use penumbra_asset::{asset, Value}; - use penumbra_crypto::Nullifier; use penumbra_keys::keys::{SeedPhrase, SpendKey}; + use penumbra_sct::Nullifier; use proptest::prelude::*; fn fr_strategy() -> BoxedStrategy { diff --git a/crates/core/component/sct/Cargo.toml b/crates/core/component/sct/Cargo.toml index 65e611eaf7..a779e19244 100644 --- a/crates/core/component/sct/Cargo.toml +++ b/crates/core/component/sct/Cargo.toml @@ -19,13 +19,19 @@ penumbra-storage = { path = "../../../storage", optional = true } penumbra-tct = { path = "../../../crypto/tct" } penumbra-crypto = { path = "../../crypto", default-features = false } penumbra-chain = { path = "../chain", default-features = false } +penumbra-keys = { path = "../../../core/keys", default-features = false } penumbra-component = { path = "../component", optional = true } # Penumbra dependencies +decaf377 = {version = "0.4", features = ["r1cs"] } +poseidon377 = { version = "0.6", features = ["r1cs"] } decaf377-rdsa = { version = "0.6" } # Crates.io dependencies +ark-r1cs-std = {version = "0.4", default-features = false } +ark-relations = "0.4" ark-ff = { version = "0.4", default_features = false } +ark-serialize = "0.4" metrics = "0.19.0" serde = { version = "1", features = ["derive"] } tracing = "0.1" @@ -37,6 +43,7 @@ bytes = "1" rand_core = { version = "0.6.3", features = ["getrandom"] } rand = "0.8" bincode = "1.3.3" - +once_cell = "1.8" +hex = "0.4" diff --git a/crates/core/component/sct/src/component/view.rs b/crates/core/component/sct/src/component/view.rs index fedb460287..ffc277e4cb 100644 --- a/crates/core/component/sct/src/component/view.rs +++ b/crates/core/component/sct/src/component/view.rs @@ -1,7 +1,6 @@ use anyhow::{anyhow, Result}; use async_trait::async_trait; use penumbra_chain::{component::StateReadExt as _, NoteSource}; -use penumbra_crypto::note; use penumbra_proto::{StateReadProto, StateWriteProto}; use penumbra_storage::{StateRead, StateWrite}; use penumbra_tct as tct; @@ -19,7 +18,7 @@ use crate::state_key; //#[async_trait(?Send)] #[async_trait] pub trait StateReadExt: StateRead { - async fn note_source(&self, commitment: note::StateCommitment) -> Result> { + async fn note_source(&self, commitment: tct::StateCommitment) -> Result> { self.get(&state_key::note_source(&commitment)).await } diff --git a/crates/core/component/sct/src/lib.rs b/crates/core/component/sct/src/lib.rs index 90348da8c9..8672408e73 100644 --- a/crates/core/component/sct/src/lib.rs +++ b/crates/core/component/sct/src/lib.rs @@ -5,4 +5,7 @@ pub mod component; pub mod event; +mod nullifier; pub mod state_key; + +pub use nullifier::{Nullifier, NullifierVar}; diff --git a/crates/core/crypto/src/nullifier.rs b/crates/core/component/sct/src/nullifier.rs similarity index 98% rename from crates/core/crypto/src/nullifier.rs rename to crates/core/component/sct/src/nullifier.rs index c226b31325..3095930abc 100644 --- a/crates/core/crypto/src/nullifier.rs +++ b/crates/core/component/sct/src/nullifier.rs @@ -3,7 +3,7 @@ use ark_r1cs_std::prelude::*; use ark_relations::r1cs::SynthesisError; use decaf377::{r1cs::FqVar, FieldExt, Fq}; use penumbra_tct as tct; -use penumbra_tct::StateCommitment; +use penumbra_tct::{r1cs::StateCommitmentVar, StateCommitment}; use poseidon377::hash_3; use once_cell::sync::Lazy; @@ -11,8 +11,6 @@ use penumbra_keys::keys::{NullifierKey, NullifierKeyVar}; use penumbra_proto::{core::crypto::v1alpha1 as pb, DomainType, TypeUrl}; use serde::{Deserialize, Serialize}; -use crate::note::StateCommitmentVar; - #[derive(PartialEq, Eq, Clone, Copy, Hash, PartialOrd, Ord, Serialize, Deserialize)] #[serde(try_from = "pb::Nullifier", into = "pb::Nullifier")] pub struct Nullifier(pub Fq); diff --git a/crates/core/component/sct/src/state_key.rs b/crates/core/component/sct/src/state_key.rs index 34f5196129..48f54da8f5 100644 --- a/crates/core/component/sct/src/state_key.rs +++ b/crates/core/component/sct/src/state_key.rs @@ -1,9 +1,8 @@ use std::string::String; -use penumbra_crypto::note; use penumbra_tct::{ builder::{block, epoch}, - Root, + Root, StateCommitment, }; pub fn anchor_by_height(height: u64) -> String { @@ -34,7 +33,7 @@ pub fn epoch_anchor_by_index(index: u64) -> String { format!("sct/epoch_anchor/{index}") } -pub fn note_source(note_commitment: ¬e::StateCommitment) -> String { +pub fn note_source(note_commitment: &StateCommitment) -> String { format!("sct/note_source/{note_commitment}") } diff --git a/crates/core/component/shielded-pool/Cargo.toml b/crates/core/component/shielded-pool/Cargo.toml index 7911b8b107..b063d68896 100644 --- a/crates/core/component/shielded-pool/Cargo.toml +++ b/crates/core/component/shielded-pool/Cargo.toml @@ -41,6 +41,8 @@ poseidon377 = { version = "0.6", features = ["r1cs"] } # Crates.io dependencies base64 = "0.20" +thiserror = "1" +chacha20poly1305 = "0.9.0" ark-r1cs-std = {version = "0.4", default-features = false } ark-relations = "0.4" ark-ff = { version = "0.4", default_features = false } @@ -58,6 +60,8 @@ bytes = "1" rand_core = { version = "0.6.3", features = ["getrandom"] } rand = "0.8" im = "15.1" +once_cell = "1.8" +hex = "0.4" [dev-dependencies] proptest = "1" diff --git a/crates/core/component/shielded-pool/src/component/note_manager.rs b/crates/core/component/shielded-pool/src/component/note_manager.rs index 1eab61c372..3c79d8415e 100644 --- a/crates/core/component/shielded-pool/src/component/note_manager.rs +++ b/crates/core/component/shielded-pool/src/component/note_manager.rs @@ -2,16 +2,17 @@ use anyhow::Result; use async_trait::async_trait; use penumbra_asset::Value; use penumbra_chain::{component::StateReadExt as _, NoteSource, SpendInfo}; -use penumbra_crypto::{Note, NotePayload, Nullifier, Rseed}; use penumbra_keys::Address; use penumbra_proto::StateWriteProto; use penumbra_sct::component::{SctManager as _, StateReadExt as _}; +use penumbra_sct::Nullifier; use penumbra_storage::StateWrite; use penumbra_tct as tct; use tct::StateCommitment; use tracing::instrument; use crate::state_key; +use crate::{Note, NotePayload, Rseed}; use super::SupplyWrite; diff --git a/crates/core/component/shielded-pool/src/component/shielded_pool.rs b/crates/core/component/shielded-pool/src/component/shielded_pool.rs index 708d0341f7..62d848d7d5 100644 --- a/crates/core/component/shielded-pool/src/component/shielded_pool.rs +++ b/crates/core/component/shielded-pool/src/component/shielded_pool.rs @@ -6,8 +6,8 @@ use async_trait::async_trait; use penumbra_asset::{asset, Value}; use penumbra_chain::{genesis, NoteSource, SpendInfo}; use penumbra_component::Component; -use penumbra_crypto::Nullifier; use penumbra_proto::StateReadProto; +use penumbra_sct::Nullifier; use penumbra_storage::StateRead; use penumbra_storage::StateWrite; use tendermint::v0_34::abci; diff --git a/crates/core/component/shielded-pool/src/event.rs b/crates/core/component/shielded-pool/src/event.rs index da97cb0588..bccaa126f6 100644 --- a/crates/core/component/shielded-pool/src/event.rs +++ b/crates/core/component/shielded-pool/src/event.rs @@ -1,6 +1,8 @@ -use penumbra_crypto::{NotePayload, Nullifier}; +use penumbra_sct::Nullifier; use tendermint::abci::{Event, EventAttributeIndexExt}; +use crate::NotePayload; + pub fn spend(nullifier: &Nullifier) -> Event { Event::new( "action_spend", diff --git a/crates/core/component/shielded-pool/src/lib.rs b/crates/core/component/shielded-pool/src/lib.rs index 7dd48934af..d5145e5119 100644 --- a/crates/core/component/shielded-pool/src/lib.rs +++ b/crates/core/component/shielded-pool/src/lib.rs @@ -7,6 +7,16 @@ pub mod component; pub mod event; pub mod state_key; +pub mod note; +mod note_payload; +pub mod rseed; +pub mod symmetric; + +pub use note::{Note, NoteCiphertext, NoteView}; +pub use note_payload::NotePayload; +pub use rseed::Rseed; +pub use symmetric::PayloadKey; + pub mod nullifier_derivation; pub mod output; pub mod spend; diff --git a/crates/core/crypto/src/note.rs b/crates/core/component/shielded-pool/src/note.rs similarity index 96% rename from crates/core/crypto/src/note.rs rename to crates/core/component/shielded-pool/src/note.rs index 4c1dd362b2..b314e0b4e5 100644 --- a/crates/core/crypto/src/note.rs +++ b/crates/core/component/shielded-pool/src/note.rs @@ -2,8 +2,11 @@ use std::convert::{TryFrom, TryInto}; use ark_ff::PrimeField; use blake2b_simd; -use decaf377::FieldExt; +use decaf377::{FieldExt, Fq}; +use decaf377_fmd as fmd; +use decaf377_ka as ka; use once_cell::sync::Lazy; +use penumbra_chain::genesis::Allocation; use penumbra_keys::{ keys::{Diversifier, FullViewingKey, IncomingViewingKey, OutgoingViewingKey}, Address, AddressView, @@ -14,7 +17,7 @@ use serde::{Deserialize, Serialize}; use thiserror; mod r1cs; -pub use r1cs::{NoteVar, StateCommitmentVar}; +pub use r1cs::NoteVar; pub use penumbra_tct::StateCommitment; @@ -22,9 +25,8 @@ use penumbra_asset::{asset, balance, Value, ValueView}; use penumbra_num::Amount; use crate::{ - fmd, ka, symmetric::{OutgoingCipherKey, OvkWrappedKey, PayloadKey, PayloadKind}, - Fq, NotePayload, Rseed, + NotePayload, Rseed, }; pub const NOTE_LEN_BYTES: usize = 160; @@ -114,6 +116,25 @@ impl Note { .diversified_public(&self.diversified_generator()) } + /// Obtain a note corresponding to this allocation. + /// + /// Note: to ensure determinism, this uses a zero rseed when + /// creating the note. + pub fn from_allocation(allocation: Allocation) -> Result { + Note::from_parts( + allocation.address, + Value { + amount: allocation.amount, + asset_id: asset::REGISTRY + .parse_denom(&allocation.denom) + .ok_or_else(|| anyhow::anyhow!("invalid denomination"))? + .id(), + }, + Rseed([0u8; 32]), + ) + .map_err(Into::into) + } + pub fn from_parts(address: Address, value: Value, rseed: Rseed) -> Result { Ok(Note { value, diff --git a/crates/core/crypto/src/note/r1cs.rs b/crates/core/component/shielded-pool/src/note/r1cs.rs similarity index 64% rename from crates/core/crypto/src/note/r1cs.rs rename to crates/core/component/shielded-pool/src/note/r1cs.rs index fe551bfe85..2a9af31707 100644 --- a/crates/core/crypto/src/note/r1cs.rs +++ b/crates/core/component/shielded-pool/src/note/r1cs.rs @@ -1,4 +1,3 @@ -use crate::{note, Note}; use ark_ff::ToConstraintField; use ark_r1cs_std::prelude::*; use ark_relations::r1cs::SynthesisError; @@ -8,6 +7,9 @@ use decaf377::{ }; use penumbra_asset::ValueVar; use penumbra_keys::address::AddressVar; +use penumbra_tct::r1cs::StateCommitmentVar; + +use crate::Note; use super::NOTECOMMIT_DOMAIN_SEP; @@ -89,57 +91,6 @@ impl ToConstraintField for Note { // should be `Note` which we cannot construct from the R1CS variable // since we do not have the rseed in-circuit. -pub struct StateCommitmentVar { - pub inner: FqVar, -} - -impl StateCommitmentVar { - pub fn inner(&self) -> FqVar { - self.inner.clone() - } -} - -impl AllocVar for StateCommitmentVar { - fn new_variable>( - cs: impl Into>, - f: impl FnOnce() -> Result, - mode: ark_r1cs_std::prelude::AllocationMode, - ) -> Result { - let ns = cs.into(); - let cs = ns.cs(); - match mode { - AllocationMode::Constant => unimplemented!(), - AllocationMode::Input => { - let note_commitment1 = f()?; - let note_commitment: note::StateCommitment = *note_commitment1.borrow(); - let inner = FqVar::new_input(cs, || Ok(note_commitment.0))?; - - Ok(Self { inner }) - } - AllocationMode::Witness => { - let note_commitment1 = f()?; - let note_commitment: note::StateCommitment = *note_commitment1.borrow(); - let inner = FqVar::new_witness(cs, || Ok(note_commitment.0))?; - - Ok(Self { inner }) - } - } - } -} - -impl R1CSVar for StateCommitmentVar { - type Value = note::StateCommitment; - - fn cs(&self) -> ark_relations::r1cs::ConstraintSystemRef { - self.inner.cs() - } - - fn value(&self) -> Result { - let inner = self.inner.value()?; - Ok(note::StateCommitment(inner)) - } -} - impl NoteVar { pub fn commit(&self) -> Result { let cs = self.amount().cs(); @@ -162,9 +113,3 @@ impl NoteVar { Ok(StateCommitmentVar { inner: commitment }) } } - -impl EqGadget for StateCommitmentVar { - fn is_eq(&self, other: &Self) -> Result, SynthesisError> { - self.inner.is_eq(&other.inner) - } -} diff --git a/crates/core/crypto/src/note_payload.rs b/crates/core/component/shielded-pool/src/note_payload.rs similarity index 98% rename from crates/core/crypto/src/note_payload.rs rename to crates/core/component/shielded-pool/src/note_payload.rs index 0df1cced2f..c3ea35673d 100644 --- a/crates/core/crypto/src/note_payload.rs +++ b/crates/core/component/shielded-pool/src/note_payload.rs @@ -7,7 +7,8 @@ use penumbra_num::Amount; use penumbra_proto::{core::crypto::v1alpha1 as pb, DomainType, TypeUrl}; use serde::{Deserialize, Serialize}; -use crate::{ka, note, Note, NoteCiphertext}; +use crate::{note, Note, NoteCiphertext}; +use decaf377_ka as ka; #[derive(Clone, Serialize, Deserialize)] #[serde(try_from = "pb::NotePayload", into = "pb::NotePayload")] diff --git a/crates/core/component/shielded-pool/src/nullifier_derivation.rs b/crates/core/component/shielded-pool/src/nullifier_derivation.rs index 3e739be97c..fbd1acfd5a 100644 --- a/crates/core/component/shielded-pool/src/nullifier_derivation.rs +++ b/crates/core/component/shielded-pool/src/nullifier_derivation.rs @@ -15,10 +15,11 @@ use penumbra_tct as tct; use rand::{CryptoRng, Rng}; use rand_core::OsRng; +use crate::{note, Note, Rseed}; use penumbra_asset::Value; -use penumbra_crypto::{note, Note, Nullifier, NullifierVar, Rseed}; use penumbra_keys::keys::{NullifierKey, NullifierKeyVar, SeedPhrase, SpendKey}; use penumbra_proof_params::{ParameterSetup, VerifyingKeyExt, GROTH16_PROOF_LENGTH_BYTES}; +use penumbra_sct::{Nullifier, NullifierVar}; /// Groth16 proof for correct nullifier derivation. #[derive(Clone, Debug)] @@ -195,15 +196,15 @@ mod tests { use ark_snark::SNARK; use decaf377::{Fq, Fr}; use penumbra_asset::{asset, Balance, Value}; - use penumbra_crypto::{Nullifier, Rseed}; use penumbra_keys::keys::{SeedPhrase, SpendKey}; + use penumbra_sct::Nullifier; use proptest::prelude::*; use penumbra_proto::core::crypto::v1alpha1 as pb; use penumbra_tct as tct; use rand_core::OsRng; - use penumbra_crypto::{note, Note}; + use crate::{note, Note, Rseed}; use ark_ff::PrimeField; diff --git a/crates/core/component/shielded-pool/src/output/action.rs b/crates/core/component/shielded-pool/src/output/action.rs index f33f463e4d..b5a5853018 100644 --- a/crates/core/component/shielded-pool/src/output/action.rs +++ b/crates/core/component/shielded-pool/src/output/action.rs @@ -3,15 +3,15 @@ use std::convert::{TryFrom, TryInto}; use anyhow::{Context, Error}; use bytes::Bytes; use penumbra_asset::balance; -use penumbra_crypto::{ - symmetric::{OvkWrappedKey, WrappedMemoKey}, - EffectHash, EffectingData, FieldExt, NotePayload, -}; +use penumbra_crypto::{EffectHash, EffectingData, FieldExt}; use penumbra_proto::{ core::crypto::v1alpha1 as pbc, core::transaction::v1alpha1 as pb, DomainType, TypeUrl, }; -use crate::OutputProof; +use crate::{ + symmetric::{OvkWrappedKey, WrappedMemoKey}, + NotePayload, OutputProof, +}; #[derive(Clone, Debug)] pub struct Output { diff --git a/crates/core/component/shielded-pool/src/output/plan.rs b/crates/core/component/shielded-pool/src/output/plan.rs index 2c17fac8a5..57ac80654a 100644 --- a/crates/core/component/shielded-pool/src/output/plan.rs +++ b/crates/core/component/shielded-pool/src/output/plan.rs @@ -1,6 +1,6 @@ use ark_ff::UniformRand; use penumbra_asset::{Balance, Value, STAKING_TOKEN_ASSET_ID}; -use penumbra_crypto::{ka, symmetric::WrappedMemoKey, FieldExt, Fq, Fr, Note, PayloadKey, Rseed}; +use penumbra_crypto::{ka, FieldExt, Fq, Fr}; use penumbra_keys::{ keys::{IncomingViewingKey, OutgoingViewingKey}, Address, @@ -10,6 +10,7 @@ use rand_core::{CryptoRng, RngCore}; use serde::{Deserialize, Serialize}; use super::{Body, Output, OutputProof}; +use crate::{symmetric::WrappedMemoKey, Note, PayloadKey, Rseed}; /// A planned [`Output`](Output). #[derive(Clone, Debug, Deserialize, Serialize)] @@ -172,11 +173,12 @@ impl TryFrom for OutputPlan { mod test { use super::OutputPlan; use penumbra_asset::Value; - use penumbra_crypto::PayloadKey; use penumbra_keys::keys::{SeedPhrase, SpendKey}; use penumbra_proof_params::OUTPUT_PROOF_VERIFICATION_KEY; use rand_core::OsRng; + use crate::PayloadKey; + #[test] /// Check that a valid output proof passes the `penumbra_crypto` integrity checks successfully. /// This test serves to anchor how an `OutputPlan` prepares its `OutputProof`, in particular diff --git a/crates/core/component/shielded-pool/src/output/proof.rs b/crates/core/component/shielded-pool/src/output/proof.rs index 32aea89f98..0563683668 100644 --- a/crates/core/component/shielded-pool/src/output/proof.rs +++ b/crates/core/component/shielded-pool/src/output/proof.rs @@ -16,14 +16,15 @@ use ark_relations::r1cs::{ConstraintSynthesizer, ConstraintSystemRef}; use ark_snark::SNARK; use penumbra_keys::{keys::Diversifier, Address}; use penumbra_proto::{core::crypto::v1alpha1 as pb, DomainType, TypeUrl}; +use penumbra_tct::r1cs::StateCommitmentVar; use rand_core::OsRng; +use crate::{note, Note, Rseed}; use penumbra_asset::{ balance, balance::{commitment::BalanceCommitmentVar, BalanceVar}, Value, }; -use penumbra_crypto::{note, Note, Rseed}; use penumbra_proof_params::{ParameterSetup, VerifyingKeyExt, GROTH16_PROOF_LENGTH_BYTES}; // Public: @@ -71,7 +72,7 @@ impl ConstraintSynthesizer for OutputCircuit { // Public inputs let claimed_note_commitment = - note::StateCommitmentVar::new_input(cs.clone(), || Ok(self.note_commitment))?; + StateCommitmentVar::new_input(cs.clone(), || Ok(self.note_commitment))?; let claimed_balance_commitment = BalanceCommitmentVar::new_input(cs.clone(), || Ok(self.balance_commitment))?; @@ -228,7 +229,7 @@ mod tests { use penumbra_proto::core::crypto::v1alpha1 as pb; use rand_core::OsRng; - use penumbra_crypto::{note, Note}; + use crate::{note, Note}; use ark_ff::PrimeField; diff --git a/crates/core/component/shielded-pool/src/output/view.rs b/crates/core/component/shielded-pool/src/output/view.rs index 66148b6390..ed5e6bfcf9 100644 --- a/crates/core/component/shielded-pool/src/output/view.rs +++ b/crates/core/component/shielded-pool/src/output/view.rs @@ -1,8 +1,8 @@ -use penumbra_crypto::{NoteView, PayloadKey}; use penumbra_proto::{core::transaction::v1alpha1 as pbt, DomainType, TypeUrl}; use serde::{Deserialize, Serialize}; use crate::Output; +use crate::{NoteView, PayloadKey}; #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(try_from = "pbt::OutputView", into = "pbt::OutputView")] diff --git a/crates/core/crypto/src/rseed.rs b/crates/core/component/shielded-pool/src/rseed.rs similarity index 95% rename from crates/core/crypto/src/rseed.rs rename to crates/core/component/shielded-pool/src/rseed.rs index a4fa28ec9f..66bf5516f5 100644 --- a/crates/core/crypto/src/rseed.rs +++ b/crates/core/component/shielded-pool/src/rseed.rs @@ -1,9 +1,9 @@ use ark_ff::PrimeField; +use decaf377::{Fq, Fr}; +use decaf377_ka as ka; use penumbra_keys::prf; use rand::{CryptoRng, RngCore}; -use crate::{ka, Fq, Fr}; - /// The rseed is a uniformly random 32-byte sequence included in the note plaintext. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub struct Rseed(pub [u8; 32]); diff --git a/crates/core/component/shielded-pool/src/spend/action.rs b/crates/core/component/shielded-pool/src/spend/action.rs index 75c9df68c3..c383c1ecbc 100644 --- a/crates/core/component/shielded-pool/src/spend/action.rs +++ b/crates/core/component/shielded-pool/src/spend/action.rs @@ -5,9 +5,10 @@ use bytes::Bytes; use penumbra_asset::balance; use penumbra_crypto::{ rdsa::{Signature, SpendAuth, VerificationKey}, - EffectHash, EffectingData, FieldExt, Nullifier, + EffectHash, EffectingData, FieldExt, }; use penumbra_proto::{core::transaction::v1alpha1 as transaction, DomainType, TypeUrl}; +use penumbra_sct::Nullifier; use crate::SpendProof; diff --git a/crates/core/component/shielded-pool/src/spend/plan.rs b/crates/core/component/shielded-pool/src/spend/plan.rs index 88749eec73..044190eda4 100644 --- a/crates/core/component/shielded-pool/src/spend/plan.rs +++ b/crates/core/component/shielded-pool/src/spend/plan.rs @@ -1,14 +1,16 @@ use ark_ff::UniformRand; use decaf377_rdsa::{Signature, SpendAuth}; use penumbra_asset::{Balance, Value, STAKING_TOKEN_ASSET_ID}; -use penumbra_crypto::{FieldExt, Fq, Fr, Note, Nullifier, Rseed}; +use penumbra_crypto::{FieldExt, Fq, Fr}; use penumbra_keys::{Address, FullViewingKey}; use penumbra_proto::{core::transaction::v1alpha1 as pb, DomainType, TypeUrl}; +use penumbra_sct::Nullifier; use penumbra_tct as tct; use rand_core::{CryptoRng, RngCore}; use serde::{Deserialize, Serialize}; use super::{Body, Spend, SpendProof}; +use crate::{Note, Rseed}; /// A planned [`Spend`](Spend). #[derive(Clone, Debug, Deserialize, Serialize)] diff --git a/crates/core/component/shielded-pool/src/spend/proof.rs b/crates/core/component/shielded-pool/src/spend/proof.rs index 32fb58b4a4..676b1e3a64 100644 --- a/crates/core/component/shielded-pool/src/spend/proof.rs +++ b/crates/core/component/shielded-pool/src/spend/proof.rs @@ -19,15 +19,17 @@ use ark_snark::SNARK; use decaf377_rdsa::{SpendAuth, VerificationKey}; use penumbra_proto::{core::crypto::v1alpha1 as pb, DomainType, TypeUrl}; use penumbra_tct as tct; +use penumbra_tct::r1cs::StateCommitmentVar; use rand_core::OsRng; +use crate::{note, Note, Rseed}; use penumbra_asset::{balance, balance::commitment::BalanceCommitmentVar, Value}; -use penumbra_crypto::{note, Note, Nullifier, NullifierVar, Rseed}; use penumbra_keys::keys::{ AuthorizationKeyVar, IncomingViewingKeyVar, NullifierKey, NullifierKeyVar, RandomizedVerificationKey, SeedPhrase, SpendAuthRandomizerVar, SpendKey, }; use penumbra_proof_params::{ParameterSetup, VerifyingKeyExt, GROTH16_PROOF_LENGTH_BYTES}; +use penumbra_sct::{Nullifier, NullifierVar}; /// Groth16 proof for spending existing notes. #[derive(Clone, Debug)] @@ -90,7 +92,7 @@ impl ConstraintSynthesizer for SpendCircuit { fn generate_constraints(self, cs: ConstraintSystemRef) -> ark_relations::r1cs::Result<()> { // Witnesses let note_var = note::NoteVar::new_witness(cs.clone(), || Ok(self.note.clone()))?; - let claimed_note_commitment = note::StateCommitmentVar::new_witness(cs.clone(), || { + let claimed_note_commitment = StateCommitmentVar::new_witness(cs.clone(), || { Ok(self.state_commitment_proof.commitment()) })?; @@ -329,19 +331,19 @@ mod tests { use ark_r1cs_std::prelude::Boolean; use decaf377::{Fq, Fr}; use penumbra_asset::{asset, Value}; - use penumbra_crypto::note::StateCommitment; - use penumbra_crypto::Nullifier; use penumbra_keys::{ keys::{SeedPhrase, SpendKey}, Address, }; + use penumbra_sct::Nullifier; + use penumbra_tct::StateCommitment; use proptest::prelude::*; use decaf377_rdsa::{SpendAuth, VerificationKey}; use penumbra_tct as tct; use rand_core::OsRng; - use penumbra_crypto::Note; + use crate::Note; use ark_ff::PrimeField; @@ -788,10 +790,9 @@ mod tests { Ok(self.state_commitment_proof.clone()) })?; let anchor_var = FqVar::new_input(cs.clone(), || Ok(Fq::from(self.anchor)))?; - let claimed_note_commitment = - note::StateCommitmentVar::new_witness(cs.clone(), || { - Ok(self.state_commitment_proof.commitment()) - })?; + let claimed_note_commitment = StateCommitmentVar::new_witness(cs.clone(), || { + Ok(self.state_commitment_proof.commitment()) + })?; let position_var = tct::r1cs::PositionVar::new_witness(cs.clone(), || { Ok(self.state_commitment_proof.position()) })?; diff --git a/crates/core/component/shielded-pool/src/spend/view.rs b/crates/core/component/shielded-pool/src/spend/view.rs index b6dc4a70da..825057d8bd 100644 --- a/crates/core/component/shielded-pool/src/spend/view.rs +++ b/crates/core/component/shielded-pool/src/spend/view.rs @@ -1,8 +1,7 @@ -use penumbra_crypto::NoteView; use penumbra_proto::{core::transaction::v1alpha1 as pbt, DomainType, TypeUrl}; use serde::{Deserialize, Serialize}; -use crate::Spend; +use crate::{NoteView, Spend}; #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(try_from = "pbt::SpendView", into = "pbt::SpendView")] diff --git a/crates/core/component/shielded-pool/src/state_key.rs b/crates/core/component/shielded-pool/src/state_key.rs index 2eb103aa26..edbb8d6121 100644 --- a/crates/core/component/shielded-pool/src/state_key.rs +++ b/crates/core/component/shielded-pool/src/state_key.rs @@ -1,5 +1,5 @@ use penumbra_asset::asset; -use penumbra_crypto::Nullifier; +use penumbra_sct::Nullifier; use std::string::String; pub fn token_supply(asset_id: &asset::Id) -> String { diff --git a/crates/core/crypto/src/symmetric.rs b/crates/core/component/shielded-pool/src/symmetric.rs similarity index 99% rename from crates/core/crypto/src/symmetric.rs rename to crates/core/component/shielded-pool/src/symmetric.rs index cefff9e9d0..5da720318e 100644 --- a/crates/core/crypto/src/symmetric.rs +++ b/crates/core/component/shielded-pool/src/symmetric.rs @@ -4,12 +4,14 @@ use chacha20poly1305::{ ChaCha20Poly1305, Key, Nonce, }; use decaf377::FieldExt; +use decaf377_ka as ka; use penumbra_asset::balance; use penumbra_keys::keys::{IncomingViewingKey, OutgoingViewingKey}; +use penumbra_proto::core::transaction::v1alpha1::{self as pb}; use rand::{CryptoRng, RngCore}; -use crate::{ka, note}; -use penumbra_proto::core::transaction::v1alpha1::{self as pb}; +use crate::note; + pub const PAYLOAD_KEY_LEN_BYTES: usize = 32; pub const OVK_WRAPPED_LEN_BYTES: usize = 48; pub const MEMOKEY_WRAPPED_LEN_BYTES: usize = 48; diff --git a/crates/core/crypto/src/lib.rs b/crates/core/crypto/src/lib.rs index 288a25b57b..c2057a3305 100644 --- a/crates/core/crypto/src/lib.rs +++ b/crates/core/crypto/src/lib.rs @@ -6,18 +6,7 @@ pub use decaf377_ka as ka; pub use decaf377_rdsa as rdsa; mod effect_hash; -pub mod note; -mod note_payload; -mod nullifier; -pub mod rseed; mod transaction; pub use effect_hash::{EffectHash, EffectingData}; -pub use note::{Note, NoteCiphertext, NoteView}; -pub use note_payload::NotePayload; -pub use nullifier::{Nullifier, NullifierVar}; -pub use rseed::Rseed; pub use transaction::TransactionContext; - -pub mod symmetric; -pub use symmetric::PayloadKey; diff --git a/crates/core/transaction/Cargo.toml b/crates/core/transaction/Cargo.toml index 83445c7a64..b9b1eee159 100644 --- a/crates/core/transaction/Cargo.toml +++ b/crates/core/transaction/Cargo.toml @@ -15,6 +15,7 @@ penumbra-crypto = { path = "../crypto/" } penumbra-chain = { path = "../component/chain/", default-features = false } penumbra-governance = { path = "../component/governance/", default-features = false } penumbra-shielded-pool = { path = "../component/shielded-pool/", default-features = false } +penumbra-sct = { path = "../component/sct/", default-features = false } penumbra-stake = { path = "../component/stake", default-features = false } penumbra-ibc = { path = "../component/ibc/", default-features = false } penumbra-dao = { path = "../component/dao/", default-features = false } diff --git a/crates/core/transaction/src/action/delegator_vote.rs b/crates/core/transaction/src/action/delegator_vote.rs index 97c973500e..6bf92827fd 100644 --- a/crates/core/transaction/src/action/delegator_vote.rs +++ b/crates/core/transaction/src/action/delegator_vote.rs @@ -3,10 +3,10 @@ use ark_ff::Zero; use decaf377::Fr; use decaf377_rdsa::{Signature, SpendAuth, VerificationKey}; use penumbra_asset::{balance, Value}; -use penumbra_crypto::Nullifier; use penumbra_governance::{DelegatorVoteProof, VotingReceiptToken}; use penumbra_num::Amount; use penumbra_proto::{core::governance::v1alpha1 as pb, DomainType, TypeUrl}; +use penumbra_sct::Nullifier; use penumbra_tct as tct; use crate::{ diff --git a/crates/core/transaction/src/effect_hash.rs b/crates/core/transaction/src/effect_hash.rs index f51e574263..1fe3206c31 100644 --- a/crates/core/transaction/src/effect_hash.rs +++ b/crates/core/transaction/src/effect_hash.rs @@ -1,7 +1,7 @@ use blake2b_simd::{Hash, Params}; use decaf377::FieldExt; use decaf377_fmd::Clue; -use penumbra_crypto::{EffectHash, NotePayload, PayloadKey}; +use penumbra_crypto::EffectHash; use penumbra_dex::{ lp::action::{PositionClose, PositionOpen, PositionRewardClaim, PositionWithdraw}, swap, swap_claim, TradingPair, @@ -9,6 +9,7 @@ use penumbra_dex::{ use penumbra_fee::Fee; use penumbra_keys::FullViewingKey; use penumbra_proto::DomainType; +use penumbra_shielded_pool::{NotePayload, PayloadKey}; use penumbra_stake::{Delegate, Undelegate, UndelegateClaimBody}; use crate::{ @@ -652,13 +653,13 @@ impl EffectingData for TradingPair { #[cfg(test)] mod tests { use penumbra_asset::{asset, Value, STAKING_TOKEN_ASSET_ID}; - use penumbra_crypto::Note; use penumbra_dex::{swap::SwapPlaintext, swap::SwapPlan, TradingPair}; use penumbra_fee::Fee; use penumbra_keys::{ keys::{SeedPhrase, SpendKey}, Address, }; + use penumbra_shielded_pool::Note; use penumbra_shielded_pool::{OutputPlan, SpendPlan}; use penumbra_tct as tct; use rand_core::OsRng; diff --git a/crates/core/transaction/src/is_action.rs b/crates/core/transaction/src/is_action.rs index 178176f9e1..360c2626e6 100644 --- a/crates/core/transaction/src/is_action.rs +++ b/crates/core/transaction/src/is_action.rs @@ -1,5 +1,6 @@ +use ark_ff::Zero; +use decaf377::Fr; use penumbra_asset::{balance, Value}; -use penumbra_crypto::{Fr, Note, Zero}; use penumbra_dao::{DaoDeposit, DaoOutput, DaoSpend}; use penumbra_dex::{ lp::{ @@ -10,7 +11,7 @@ use penumbra_dex::{ swap_claim::{SwapClaim, SwapClaimView}, }; use penumbra_ibc::{IbcAction, Ics20Withdrawal}; -use penumbra_shielded_pool::{Output, OutputView, Spend, SpendView}; +use penumbra_shielded_pool::{Note, Output, OutputView, Spend, SpendView}; use penumbra_stake::{Delegate, Undelegate, UndelegateClaim}; use crate::{ActionView, TransactionPerspective}; diff --git a/crates/core/transaction/src/memo.rs b/crates/core/transaction/src/memo.rs index 67913af5cf..83ffe845c8 100644 --- a/crates/core/transaction/src/memo.rs +++ b/crates/core/transaction/src/memo.rs @@ -6,14 +6,15 @@ use std::{ use anyhow::anyhow; use rand_core::OsRng; +use decaf377_ka as ka; use penumbra_asset::balance; -use penumbra_crypto::{ - ka, note, +use penumbra_keys::{keys::OutgoingViewingKey, Address}; +use penumbra_proto::core::transaction::v1alpha1 as pbt; +use penumbra_shielded_pool::{ + note, symmetric::{OvkWrappedKey, PayloadKey, PayloadKind, WrappedMemoKey}, Note, }; -use penumbra_keys::{keys::OutgoingViewingKey, Address}; -use penumbra_proto::core::transaction::v1alpha1 as pbt; pub const MEMO_CIPHERTEXT_LEN_BYTES: usize = 528; diff --git a/crates/core/transaction/src/plan/action/delegator_vote.rs b/crates/core/transaction/src/plan/action/delegator_vote.rs index 184cc2c5ca..5e7c13f204 100644 --- a/crates/core/transaction/src/plan/action/delegator_vote.rs +++ b/crates/core/transaction/src/plan/action/delegator_vote.rs @@ -2,12 +2,13 @@ use ark_ff::UniformRand; use decaf377::{FieldExt, Fq, Fr}; use decaf377_rdsa::{Signature, SpendAuth}; use penumbra_asset::{Balance, Value}; -use penumbra_crypto::{Note, Nullifier}; use penumbra_governance::{DelegatorVoteProof, VotingReceiptToken}; use penumbra_keys::FullViewingKey; use penumbra_num::Amount; use penumbra_proof_params::DELEGATOR_VOTE_PROOF_PROVING_KEY; use penumbra_proto::{core::governance::v1alpha1 as pb, DomainType, TypeUrl}; +use penumbra_sct::Nullifier; +use penumbra_shielded_pool::Note; use penumbra_tct as tct; use rand::{CryptoRng, RngCore}; use serde::{Deserialize, Serialize}; diff --git a/crates/core/transaction/src/plan/build.rs b/crates/core/transaction/src/plan/build.rs index 579d68d624..b4c94400eb 100644 --- a/crates/core/transaction/src/plan/build.rs +++ b/crates/core/transaction/src/plan/build.rs @@ -1,6 +1,9 @@ use anyhow::{Context, Result}; -use penumbra_crypto::{rdsa, symmetric::PayloadKey, Fr, Zero}; +use ark_ff::Zero; +use decaf377::Fr; +use decaf377_rdsa as rdsa; use penumbra_keys::FullViewingKey; +use penumbra_shielded_pool::symmetric::PayloadKey; use rand_core::{CryptoRng, RngCore}; use super::TransactionPlan; diff --git a/crates/core/transaction/src/plan/memo.rs b/crates/core/transaction/src/plan/memo.rs index 88f31d9abc..6700694076 100644 --- a/crates/core/transaction/src/plan/memo.rs +++ b/crates/core/transaction/src/plan/memo.rs @@ -1,7 +1,7 @@ use anyhow::Context; -use penumbra_crypto::symmetric::PayloadKey; use penumbra_keys::Address; use penumbra_proto::{core::transaction::v1alpha1 as pb, DomainType, TypeUrl}; +use penumbra_shielded_pool::symmetric::PayloadKey; use rand::{CryptoRng, RngCore}; diff --git a/crates/core/transaction/src/transaction.rs b/crates/core/transaction/src/transaction.rs index d5a6c7a798..e5fdbe8252 100644 --- a/crates/core/transaction/src/transaction.rs +++ b/crates/core/transaction/src/transaction.rs @@ -6,12 +6,10 @@ use std::{ use anyhow::{Context, Error}; use ark_ff::Zero; use bytes::Bytes; +use decaf377::Fr; use decaf377_fmd::Clue; -use penumbra_crypto::{ - note::StateCommitment, - rdsa::{Binding, Signature, VerificationKey, VerificationKeyBytes}, - Fr, Note, Nullifier, PayloadKey, TransactionContext, -}; +use decaf377_rdsa::{Binding, Signature, VerificationKey, VerificationKeyBytes}; +use penumbra_crypto::TransactionContext; use penumbra_dao::{DaoDeposit, DaoOutput, DaoSpend}; use penumbra_dex::{ lp::action::{PositionClose, PositionOpen}, @@ -21,9 +19,11 @@ use penumbra_fee::Fee; use penumbra_ibc::IbcAction; use penumbra_keys::FullViewingKey; use penumbra_proto::{core::transaction::v1alpha1 as pbt, DomainType, Message, TypeUrl}; -use penumbra_shielded_pool::{Output, Spend}; +use penumbra_sct::Nullifier; +use penumbra_shielded_pool::{Note, Output, PayloadKey, Spend}; use penumbra_stake::{Delegate, Undelegate, UndelegateClaim}; use penumbra_tct as tct; +use penumbra_tct::StateCommitment; use serde::{Deserialize, Serialize}; use crate::{ diff --git a/crates/core/transaction/src/view/action_view/delegator_vote_view.rs b/crates/core/transaction/src/view/action_view/delegator_vote_view.rs index 5d43d290d7..bc73e557ab 100644 --- a/crates/core/transaction/src/view/action_view/delegator_vote_view.rs +++ b/crates/core/transaction/src/view/action_view/delegator_vote_view.rs @@ -1,5 +1,5 @@ -use penumbra_crypto::NoteView; use penumbra_proto::{core::transaction::v1alpha1 as pbt, DomainType, TypeUrl}; +use penumbra_shielded_pool::NoteView; use serde::{Deserialize, Serialize}; use crate::action::DelegatorVote; diff --git a/crates/core/transaction/src/view/transaction_perspective.rs b/crates/core/transaction/src/view/transaction_perspective.rs index 51200c60cd..92a896ba95 100644 --- a/crates/core/transaction/src/view/transaction_perspective.rs +++ b/crates/core/transaction/src/view/transaction_perspective.rs @@ -1,9 +1,10 @@ use penumbra_asset::asset; -use penumbra_crypto::{note, Note, NoteView, Nullifier, PayloadKey}; use penumbra_keys::AddressView; use penumbra_proto::core::transaction::v1alpha1::{ self as pb, NullifierWithNote, PayloadKeyWithCommitment, }; +use penumbra_sct::Nullifier; +use penumbra_shielded_pool::{note, Note, NoteView, PayloadKey}; use std::collections::BTreeMap; diff --git a/crates/core/transaction/src/witness_data.rs b/crates/core/transaction/src/witness_data.rs index d89c66b6cf..50b1c7439d 100644 --- a/crates/core/transaction/src/witness_data.rs +++ b/crates/core/transaction/src/witness_data.rs @@ -1,7 +1,7 @@ use std::collections::BTreeMap; -use penumbra_crypto::note; use penumbra_proto::{core::transaction::v1alpha1 as pb, DomainType, TypeUrl}; +use penumbra_shielded_pool::note; use penumbra_tct as tct; #[derive(Clone, Debug)] diff --git a/crates/crypto/proof-params/Cargo.toml b/crates/crypto/proof-params/Cargo.toml index a529677699..e685c4ad91 100644 --- a/crates/crypto/proof-params/Cargo.toml +++ b/crates/crypto/proof-params/Cargo.toml @@ -41,6 +41,10 @@ penumbra-stake = { path = "../../core/component/stake/" } penumbra-shielded-pool = { path = "../../core/component/shielded-pool/" } penumbra-governance = { path = "../../core/component/governance/" } penumbra-fee = { path = "../../core/component/fee/" } +penumbra-sct = { path = "../../core/component/sct/" } +decaf377-fmd = { path = "../decaf377-fmd/" } +decaf377-ka = { path = "../decaf377-ka/" } +decaf377-rdsa = "0.6" [build-dependencies] regex = {version = "1", optional=true } diff --git a/crates/crypto/proof-params/benches/delegator_vote.rs b/crates/crypto/proof-params/benches/delegator_vote.rs index edc1951d07..c6fba5b1ca 100644 --- a/crates/crypto/proof-params/benches/delegator_vote.rs +++ b/crates/crypto/proof-params/benches/delegator_vote.rs @@ -4,15 +4,14 @@ use ark_ff::UniformRand; use ark_relations::r1cs::{ ConstraintSynthesizer, ConstraintSystem, OptimizationGoal, SynthesisMode, }; -use decaf377::Fr; +use decaf377::{Fq, Fr}; +use decaf377_rdsa::{SpendAuth, VerificationKey}; use penumbra_asset::{balance, Value}; -use penumbra_crypto::{ - rdsa::{SpendAuth, VerificationKey}, - Fq, Note, Nullifier, -}; use penumbra_governance::{DelegatorVoteCircuit, DelegatorVoteProof}; use penumbra_keys::keys::{NullifierKey, SeedPhrase, SpendKey}; use penumbra_proof_params::DELEGATOR_VOTE_PROOF_PROVING_KEY; +use penumbra_sct::Nullifier; +use penumbra_shielded_pool::Note; use penumbra_tct as tct; use criterion::{criterion_group, criterion_main, Criterion}; diff --git a/crates/crypto/proof-params/benches/nullifier_derivation.rs b/crates/crypto/proof-params/benches/nullifier_derivation.rs index 98d2a48e39..24d92786f6 100644 --- a/crates/crypto/proof-params/benches/nullifier_derivation.rs +++ b/crates/crypto/proof-params/benches/nullifier_derivation.rs @@ -5,9 +5,10 @@ use ark_relations::r1cs::{ }; use decaf377::Fq; use penumbra_asset::Value; -use penumbra_crypto::{Note, Nullifier, Rseed}; use penumbra_keys::keys::{NullifierKey, SeedPhrase, SpendKey}; use penumbra_proof_params::NULLIFIER_DERIVATION_PROOF_PROVING_KEY; +use penumbra_sct::Nullifier; +use penumbra_shielded_pool::{Note, Rseed}; use penumbra_shielded_pool::{NullifierDerivationCircuit, NullifierDerivationProof}; use penumbra_tct as tct; diff --git a/crates/crypto/proof-params/benches/output.rs b/crates/crypto/proof-params/benches/output.rs index 95174b92e7..ea1d905c34 100644 --- a/crates/crypto/proof-params/benches/output.rs +++ b/crates/crypto/proof-params/benches/output.rs @@ -4,12 +4,13 @@ use ark_ff::UniformRand; use ark_relations::r1cs::{ ConstraintSynthesizer, ConstraintSystem, OptimizationGoal, SynthesisMode, }; -use decaf377::Fr; +use decaf377::{Fq, Fr}; +use decaf377_fmd as fmd; +use decaf377_ka as ka; use penumbra_asset::{balance, Balance, Value}; -use penumbra_crypto::{fmd, ka, note, Fq, Note, Rseed}; use penumbra_keys::{keys::Diversifier, Address}; use penumbra_proof_params::OUTPUT_PROOF_PROVING_KEY; -use penumbra_shielded_pool::{OutputCircuit, OutputProof}; +use penumbra_shielded_pool::{note, Note, OutputCircuit, OutputProof, Rseed}; use criterion::{criterion_group, criterion_main, Criterion}; use rand_core::OsRng; diff --git a/crates/crypto/proof-params/benches/spend.rs b/crates/crypto/proof-params/benches/spend.rs index 83178bd8d6..6f0281deac 100644 --- a/crates/crypto/proof-params/benches/spend.rs +++ b/crates/crypto/proof-params/benches/spend.rs @@ -4,15 +4,13 @@ use ark_ff::UniformRand; use ark_relations::r1cs::{ ConstraintSynthesizer, ConstraintSystem, OptimizationGoal, SynthesisMode, }; -use decaf377::Fr; +use decaf377::{Fq, Fr}; +use decaf377_rdsa::{SpendAuth, VerificationKey}; use penumbra_asset::{balance, Value}; -use penumbra_crypto::{ - rdsa::{SpendAuth, VerificationKey}, - Fq, Note, Nullifier, -}; use penumbra_keys::keys::{NullifierKey, SeedPhrase, SpendKey}; use penumbra_proof_params::SPEND_PROOF_PROVING_KEY; -use penumbra_shielded_pool::{SpendCircuit, SpendProof}; +use penumbra_sct::Nullifier; +use penumbra_shielded_pool::{Note, SpendCircuit, SpendProof}; use penumbra_tct as tct; use criterion::{criterion_group, criterion_main, Criterion}; diff --git a/crates/crypto/proof-params/benches/swap_claim.rs b/crates/crypto/proof-params/benches/swap_claim.rs index feea6be357..25663b334d 100644 --- a/crates/crypto/proof-params/benches/swap_claim.rs +++ b/crates/crypto/proof-params/benches/swap_claim.rs @@ -4,7 +4,6 @@ use ark_relations::r1cs::{ }; use decaf377::Fq; use penumbra_asset::asset; -use penumbra_crypto::Nullifier; use penumbra_dex::{ swap::SwapPlaintext, swap_claim::{SwapClaimCircuit, SwapClaimProof}, @@ -14,6 +13,7 @@ use penumbra_fee::Fee; use penumbra_keys::keys::{NullifierKey, SeedPhrase, SpendKey}; use penumbra_num::Amount; use penumbra_proof_params::SWAPCLAIM_PROOF_PROVING_KEY; +use penumbra_sct::Nullifier; use penumbra_tct as tct; use criterion::{criterion_group, criterion_main, Criterion}; diff --git a/crates/crypto/proof-params/benches/undelegate_claim.rs b/crates/crypto/proof-params/benches/undelegate_claim.rs index 71c2835d3e..aa327c5efa 100644 --- a/crates/crypto/proof-params/benches/undelegate_claim.rs +++ b/crates/crypto/proof-params/benches/undelegate_claim.rs @@ -3,8 +3,8 @@ use ark_relations::r1cs::{ ConstraintSynthesizer, ConstraintSystem, OptimizationGoal, SynthesisMode, }; use decaf377::{Fq, Fr}; +use decaf377_rdsa as rdsa; use penumbra_asset::{asset, balance}; -use penumbra_crypto::rdsa; use penumbra_num::Amount; use penumbra_proof_params::UNDELEGATECLAIM_PROOF_PROVING_KEY; use penumbra_stake::{ diff --git a/crates/crypto/tct/src/r1cs.rs b/crates/crypto/tct/src/r1cs.rs index 7e4ccbc9d9..1ebc1e2783 100644 --- a/crates/crypto/tct/src/r1cs.rs +++ b/crates/crypto/tct/src/r1cs.rs @@ -5,7 +5,7 @@ use ark_relations::r1cs::{ConstraintSystemRef, SynthesisError}; use decaf377::{r1cs::FqVar, FieldExt, Fq}; -use crate::{internal::hash::DOMAIN_SEPARATOR, Position, Proof}; +use crate::{internal::hash::DOMAIN_SEPARATOR, Position, Proof, StateCommitment}; #[derive(Clone, Debug)] /// Represents the position of a leaf in the TCT represented in R1CS. @@ -285,3 +285,63 @@ impl WhichWayVar { Ok([leftmost, left, right, rightmost]) } } + +/// Represents a state commitment in R1CS. +pub struct StateCommitmentVar { + /// The `FqVar` representing the state commitment. + pub inner: FqVar, +} + +impl StateCommitmentVar { + /// Access the inner `FqVar`. + pub fn inner(&self) -> FqVar { + self.inner.clone() + } +} + +impl AllocVar for StateCommitmentVar { + fn new_variable>( + cs: impl Into>, + f: impl FnOnce() -> Result, + mode: ark_r1cs_std::prelude::AllocationMode, + ) -> Result { + let ns = cs.into(); + let cs = ns.cs(); + match mode { + AllocationMode::Constant => unimplemented!(), + AllocationMode::Input => { + let note_commitment1 = f()?; + let note_commitment: StateCommitment = *note_commitment1.borrow(); + let inner = FqVar::new_input(cs, || Ok(note_commitment.0))?; + + Ok(Self { inner }) + } + AllocationMode::Witness => { + let note_commitment1 = f()?; + let note_commitment: StateCommitment = *note_commitment1.borrow(); + let inner = FqVar::new_witness(cs, || Ok(note_commitment.0))?; + + Ok(Self { inner }) + } + } + } +} + +impl R1CSVar for StateCommitmentVar { + type Value = StateCommitment; + + fn cs(&self) -> ark_relations::r1cs::ConstraintSystemRef { + self.inner.cs() + } + + fn value(&self) -> Result { + let inner = self.inner.value()?; + Ok(StateCommitment(inner)) + } +} + +impl EqGadget for StateCommitmentVar { + fn is_eq(&self, other: &Self) -> Result, SynthesisError> { + self.inner.is_eq(&other.inner) + } +} diff --git a/crates/view/Cargo.toml b/crates/view/Cargo.toml index d53bed732c..4d21df6d42 100644 --- a/crates/view/Cargo.toml +++ b/crates/view/Cargo.toml @@ -39,6 +39,7 @@ penumbra-transaction = { path = "../core/transaction" } ibc-types2 = { git = "https://github.com/penumbra-zone/ibc-types", branch = "main", default-features = false } +decaf377 = {version = "0.4", features = ["r1cs"] } tokio = { version = "1.22", features = ["full"] } tokio-stream = { version = "0.1.8", features = ["sync"] } anyhow = "1" diff --git a/crates/view/src/client.rs b/crates/view/src/client.rs index 1bbffe3fb9..0041eaf662 100644 --- a/crates/view/src/client.rs +++ b/crates/view/src/client.rs @@ -4,7 +4,6 @@ use anyhow::Result; use futures::{FutureExt, Stream, StreamExt, TryStreamExt}; use penumbra_asset::asset::{self, DenomMetadata, Id}; use penumbra_chain::params::{ChainParameters, FmdParameters}; -use penumbra_crypto::{note, Nullifier}; use penumbra_keys::{ keys::{AccountGroupId, AddressIndex}, Address, @@ -13,6 +12,8 @@ use penumbra_num::Amount; use penumbra_proto::view::v1alpha1::{ self as pb, view_protocol_service_client::ViewProtocolServiceClient, WitnessRequest, }; +use penumbra_sct::Nullifier; +use penumbra_shielded_pool::note; use penumbra_stake::IdentityKey; use penumbra_transaction::AuthorizationData; diff --git a/crates/view/src/note_record.rs b/crates/view/src/note_record.rs index 1a4704adae..4b0100c3b8 100644 --- a/crates/view/src/note_record.rs +++ b/crates/view/src/note_record.rs @@ -1,8 +1,9 @@ use penumbra_asset::Value; use penumbra_chain::NoteSource; -use penumbra_crypto::{note, Note, Nullifier, Rseed}; use penumbra_keys::keys::AddressIndex; use penumbra_proto::{view::v1alpha1 as pb, DomainType, TypeUrl}; +use penumbra_sct::Nullifier; +use penumbra_shielded_pool::{note, Note, Rseed}; use penumbra_tct as tct; use r2d2_sqlite::rusqlite::Row; diff --git a/crates/view/src/planner.rs b/crates/view/src/planner.rs index 9388e73e47..6636d864a0 100644 --- a/crates/view/src/planner.rs +++ b/crates/view/src/planner.rs @@ -8,7 +8,6 @@ use anyhow::{anyhow, Result}; use penumbra_asset::{asset::DenomMetadata, Balance, Value}; use penumbra_chain::params::{ChainParameters, FmdParameters}; -use penumbra_crypto::Note; use penumbra_dao::DaoDeposit; use penumbra_dex::{ lp::action::{PositionClose, PositionOpen}, @@ -28,7 +27,7 @@ use penumbra_keys::{ }; use penumbra_num::Amount; use penumbra_proto::view::v1alpha1::{NotesForVotingRequest, NotesRequest}; -use penumbra_shielded_pool::{OutputPlan, SpendPlan}; +use penumbra_shielded_pool::{Note, OutputPlan, SpendPlan}; use penumbra_stake::{rate::RateData, validator}; use penumbra_stake::{IdentityKey, UndelegateClaimPlan}; use penumbra_tct as tct; diff --git a/crates/view/src/storage.rs b/crates/view/src/storage.rs index 489062f1fb..95d14df1ef 100644 --- a/crates/view/src/storage.rs +++ b/crates/view/src/storage.rs @@ -1,10 +1,10 @@ use anyhow::{anyhow, Context}; use camino::Utf8Path; +use decaf377::{FieldExt, Fq}; use once_cell::sync::Lazy; use parking_lot::Mutex; use penumbra_asset::{asset, asset::DenomMetadata, asset::Id, Value}; use penumbra_chain::params::{ChainParameters, FmdParameters}; -use penumbra_crypto::{note, FieldExt, Fq, Note, Nullifier, Rseed}; use penumbra_dex::{ lp::position::{self, Position, State}, TradingPair, @@ -17,6 +17,8 @@ use penumbra_proto::{ }, DomainType, }; +use penumbra_sct::Nullifier; +use penumbra_shielded_pool::{note, Note, Rseed}; use penumbra_stake::{DelegationToken, IdentityKey}; use penumbra_tct as tct; use penumbra_transaction::Transaction; diff --git a/crates/view/src/swap_record.rs b/crates/view/src/swap_record.rs index add31da3ad..7f16a78b54 100644 --- a/crates/view/src/swap_record.rs +++ b/crates/view/src/swap_record.rs @@ -1,7 +1,7 @@ use penumbra_chain::NoteSource; -use penumbra_crypto::Nullifier; use penumbra_dex::{swap::SwapPlaintext, BatchSwapOutputData}; use penumbra_proto::{view::v1alpha1 as pb, DomainType, TypeUrl}; +use penumbra_sct::Nullifier; use penumbra_tct as tct; use r2d2_sqlite::rusqlite::Row; diff --git a/crates/view/src/sync.rs b/crates/view/src/sync.rs index 35280a9a01..ce583394ab 100644 --- a/crates/view/src/sync.rs +++ b/crates/view/src/sync.rs @@ -5,9 +5,10 @@ use penumbra_chain::{ NoteSource, }; use penumbra_compact_block::{CompactBlock, StatePayload}; -use penumbra_crypto::{Note, NotePayload, Nullifier}; use penumbra_dex::swap::{SwapPayload, SwapPlaintext}; use penumbra_keys::FullViewingKey; +use penumbra_sct::Nullifier; +use penumbra_shielded_pool::{Note, NotePayload}; use penumbra_tct as tct; use tracing::Instrument; diff --git a/crates/view/src/worker.rs b/crates/view/src/worker.rs index d61dcf8480..b33c2cc383 100644 --- a/crates/view/src/worker.rs +++ b/crates/view/src/worker.rs @@ -4,7 +4,6 @@ use std::{ }; use penumbra_compact_block::CompactBlock; -use penumbra_crypto::Nullifier; use penumbra_dex::lp::{position, LpNft}; use penumbra_keys::FullViewingKey; use penumbra_proto::client::v1alpha1::specific_query_service_client::SpecificQueryServiceClient; @@ -17,6 +16,7 @@ use penumbra_proto::{ }, DomainType, }; +use penumbra_sct::Nullifier; use penumbra_transaction::Transaction; use proto::client::v1alpha1::DenomMetadataByIdRequest; use sha2::Digest; diff --git a/crates/wasm/Cargo.toml b/crates/wasm/Cargo.toml index 0b3be074a2..8841324b96 100644 --- a/crates/wasm/Cargo.toml +++ b/crates/wasm/Cargo.toml @@ -22,6 +22,7 @@ penumbra-stake = { path = "../core/component/stake", default-features = penumbra-dex = { path = "../core/component/dex", default-features = false, features = ["proving-keys"] } penumbra-chain = { path = "../core/component/chain", default-features = false } penumbra-fee = { path = "../core/component/fee", default-features = false } +penumbra-sct = { path = "../core/component/sct", default-features = false } penumbra-shielded-pool = { path = "../core/component/shielded-pool", default-features = false, features = ["proving-keys"] } penumbra-compact-block = { path = "../core/component/compact-block", default-features = false } diff --git a/crates/wasm/src/note_record.rs b/crates/wasm/src/note_record.rs index d099ea71e4..db78bdef68 100644 --- a/crates/wasm/src/note_record.rs +++ b/crates/wasm/src/note_record.rs @@ -1,7 +1,8 @@ use penumbra_chain::NoteSource; -use penumbra_crypto::{note, Note, Nullifier}; use penumbra_keys::keys::AddressIndex; use penumbra_proto::{view::v1alpha1 as pb, DomainType, TypeUrl}; +use penumbra_sct::Nullifier; +use penumbra_shielded_pool::{note, Note}; use penumbra_tct as tct; use std::convert::{TryFrom, TryInto}; diff --git a/crates/wasm/src/planner.rs b/crates/wasm/src/planner.rs index 6f5eaed39d..2fa257e96c 100644 --- a/crates/wasm/src/planner.rs +++ b/crates/wasm/src/planner.rs @@ -9,12 +9,11 @@ use anyhow::{anyhow, Result}; use crate::note_record::SpendableNoteRecord; use penumbra_asset::{asset::DenomMetadata, Balance, Value}; use penumbra_chain::params::{ChainParameters, FmdParameters}; -use penumbra_crypto::Note; use penumbra_dex::{swap::SwapPlaintext, swap::SwapPlan, swap_claim::SwapClaimPlan, TradingPair}; use penumbra_fee::Fee; use penumbra_keys::{keys::AddressIndex, Address, FullViewingKey}; use penumbra_num::Amount; -use penumbra_shielded_pool::{OutputPlan, SpendPlan}; +use penumbra_shielded_pool::{Note, OutputPlan, SpendPlan}; use penumbra_stake::{IdentityKey, UndelegateClaimPlan}; use penumbra_tct as tct; use penumbra_transaction::{ diff --git a/crates/wasm/src/swap_record.rs b/crates/wasm/src/swap_record.rs index 4a1a9d8e7b..ac06e6551e 100644 --- a/crates/wasm/src/swap_record.rs +++ b/crates/wasm/src/swap_record.rs @@ -1,7 +1,7 @@ use penumbra_chain::NoteSource; -use penumbra_crypto::Nullifier; use penumbra_dex::{swap::SwapPlaintext, BatchSwapOutputData}; use penumbra_proto::{view::v1alpha1 as pb, DomainType, TypeUrl}; +use penumbra_sct::Nullifier; use penumbra_tct as tct; use std::convert::{TryFrom, TryInto}; diff --git a/crates/wasm/src/view_server.rs b/crates/wasm/src/view_server.rs index 3e46406fe8..973d9e6f0b 100644 --- a/crates/wasm/src/view_server.rs +++ b/crates/wasm/src/view_server.rs @@ -3,12 +3,13 @@ use indexed_db_futures::prelude::OpenDbRequest; use indexed_db_futures::{IdbDatabase, IdbQuerySource}; use penumbra_asset::asset::{DenomMetadata, Id}; use penumbra_compact_block::{CompactBlock, StatePayload}; -use penumbra_crypto::{note, Nullifier}; use penumbra_dex::lp::position::Position; use penumbra_dex::lp::LpNft; use penumbra_keys::FullViewingKey; use penumbra_proto::core::transaction::v1alpha1::{TransactionPerspective, TransactionView}; use penumbra_proto::DomainType; +use penumbra_sct::Nullifier; +use penumbra_shielded_pool::note; use penumbra_tct as tct; use penumbra_tct::Witness::*; use penumbra_transaction::Transaction;