diff --git a/fil-proofs-tooling/src/bin/benchy/prodbench.rs b/fil-proofs-tooling/src/bin/benchy/prodbench.rs index 3ec95ae04..73cd1cc2e 100644 --- a/fil-proofs-tooling/src/bin/benchy/prodbench.rs +++ b/fil-proofs-tooling/src/bin/benchy/prodbench.rs @@ -179,6 +179,7 @@ pub fn run( let mut outputs = ProdbenchOutputs::default(); let sector_size = SectorSize(inputs.sector_size_bytes()); + let arbitrary_porep_id = [123; 32]; assert!(inputs.num_sectors > 0, "Missing num_sectors"); @@ -186,6 +187,7 @@ pub fn run( sector_size, inputs.num_sectors as usize, only_add_piece, + arbitrary_porep_id, ); if only_add_piece || only_replicate { @@ -270,7 +272,6 @@ fn run_measure_circuits(i: &ProdbenchInputs) -> CircuitOutputs { } fn measure_porep_circuit(i: &ProdbenchInputs) -> usize { - use storage_proofs::drgraph::new_seed; use storage_proofs::porep::stacked::{ LayerChallenges, SetupParams, StackedCompound, StackedDrg, }; @@ -282,11 +283,12 @@ fn measure_porep_circuit(i: &ProdbenchInputs) -> usize { let nodes = (i.sector_size_bytes() / 32) as usize; let layer_challenges = LayerChallenges::new(layers, challenge_count); + let arbitrary_porep_id = [222; 32]; let sp = SetupParams { nodes, degree: drg_degree, expansion_degree, - seed: new_seed(), + porep_id: arbitrary_porep_id, layer_challenges, }; @@ -315,10 +317,12 @@ fn generate_params(i: &ProdbenchInputs) { "generating params: porep: (size: {:?}, partitions: {:?})", §or_size, &partitions ); + let dummy_porep_id = [0; 32]; cache_porep_params(PoRepConfig { sector_size, partitions, + porep_id: dummy_porep_id, }); } @@ -326,9 +330,11 @@ fn cache_porep_params(porep_config: PoRepConfig) { use filecoin_proofs::parameters::public_params; use storage_proofs::porep::stacked::{StackedCompound, StackedDrg}; + let dummy_porep_id = [0; 32]; let public_params = public_params( PaddedBytesAmount::from(porep_config), usize::from(PoRepProofPartitions::from(porep_config)), + dummy_porep_id, ) .unwrap(); diff --git a/fil-proofs-tooling/src/bin/benchy/stacked.rs b/fil-proofs-tooling/src/bin/benchy/stacked.rs index d410dac96..60f5d7826 100644 --- a/fil-proofs-tooling/src/bin/benchy/stacked.rs +++ b/fil-proofs-tooling/src/bin/benchy/stacked.rs @@ -120,11 +120,12 @@ where ); let replica_id = H::Domain::random(rng); + let arbitrary_porep_id = [11; 32]; let sp = stacked::SetupParams { nodes, degree: BASE_DEGREE, expansion_degree: EXP_DEGREE, - seed: new_seed(), + porep_id: arbitrary_porep_id, layer_challenges: layer_challenges.clone(), }; @@ -154,11 +155,14 @@ where replica_path.clone(), )?; + let arbitrary_porep_id = [88; 32]; + let pb = stacked::PublicInputs::::Domain> { replica_id, seed, tau: Some(tau), k: Some(0), + porep_id: arbitrary_porep_id, }; // Convert TemporaryAux to TemporaryAuxCache, which instantiates all diff --git a/fil-proofs-tooling/src/bin/benchy/window_post.rs b/fil-proofs-tooling/src/bin/benchy/window_post.rs index d87acd3ec..d63f120c7 100644 --- a/fil-proofs-tooling/src/bin/benchy/window_post.rs +++ b/fil-proofs-tooling/src/bin/benchy/window_post.rs @@ -102,6 +102,8 @@ pub fn run_window_post_bench( let piece_infos = vec![piece_info]; + let arbitrary_porep_id = [99; 32]; + // Replicate the staged sector, write the replica file to `sealed_path`. let porep_config = PoRepConfig { sector_size: SectorSize(sector_size), @@ -112,6 +114,7 @@ pub fn run_window_post_bench( .get(&(sector_size)) .unwrap(), ), + porep_id: arbitrary_porep_id, }; let cache_dir = tempfile::tempdir().unwrap(); let sector_id = SectorId::from(SECTOR_ID); diff --git a/fil-proofs-tooling/src/bin/benchy/winning_post.rs b/fil-proofs-tooling/src/bin/benchy/winning_post.rs index 6f31d0744..beb5b01fd 100644 --- a/fil-proofs-tooling/src/bin/benchy/winning_post.rs +++ b/fil-proofs-tooling/src/bin/benchy/winning_post.rs @@ -53,7 +53,8 @@ pub fn run_fallback_post_bench( "This benchmark only works with WINNING_POST_SECTOR_COUNT == 1" )); } - let (sector_id, replica_output) = create_replica::(sector_size); + let arbitrary_porep_id = [66; 32]; + let (sector_id, replica_output) = create_replica::(sector_size, arbitrary_porep_id); // Store the replica's private and publicly facing info for proving and verifying respectively. let pub_replica_info = vec![(sector_id, replica_output.public_replica_info)]; diff --git a/fil-proofs-tooling/src/bin/gpu-cpu-test/main.rs b/fil-proofs-tooling/src/bin/gpu-cpu-test/main.rs index a32b3035a..d4160268a 100644 --- a/fil-proofs-tooling/src/bin/gpu-cpu-test/main.rs +++ b/fil-proofs-tooling/src/bin/gpu-cpu-test/main.rs @@ -129,9 +129,10 @@ fn threads_mode(parallel: u8, gpu_stealing: bool) { let mut senders = Vec::new(); // All thread handles that get terminated let mut threads: Vec>> = Vec::new(); + let arbitrary_porep_id = [234; 32]; // Create fixtures only once for both threads - let (sector_id, replica_output) = create_replica::(SECTOR_SIZE); + let (sector_id, replica_output) = create_replica::(SECTOR_SIZE, arbitrary_porep_id); let priv_replica_info = (sector_id, replica_output.private_replica_info); // Put each proof into it's own scope (the other one is due to the if statement) diff --git a/fil-proofs-tooling/src/shared.rs b/fil-proofs-tooling/src/shared.rs index 9395a66bf..684c2de56 100644 --- a/fil-proofs-tooling/src/shared.rs +++ b/fil-proofs-tooling/src/shared.rs @@ -64,8 +64,10 @@ pub fn create_piece(piece_bytes: UnpaddedBytesAmount) -> NamedTempFile { /// Create a replica for a single sector pub fn create_replica( sector_size: u64, + porep_id: [u8; 32], ) -> (SectorId, PreCommitReplicaOutput) { - let (_porep_config, result) = create_replicas::(SectorSize(sector_size), 1, false); + let (_porep_config, result) = + create_replicas::(SectorSize(sector_size), 1, false, porep_id); // Extract the sector ID and replica output out of the result result .unwrap() @@ -79,6 +81,7 @@ pub fn create_replicas( sector_size: SectorSize, qty_sectors: usize, only_add: bool, + porep_id: [u8; 32], ) -> ( PoRepConfig, Option<( @@ -99,6 +102,7 @@ pub fn create_replicas( .get(&u64::from(sector_size)) .expect("unknown sector size"), ), + porep_id, }; let mut out: Vec<(SectorId, PreCommitReplicaOutput)> = Default::default(); diff --git a/filecoin-proofs/Cargo.toml b/filecoin-proofs/Cargo.toml index 54cc1c9d7..6b6121754 100644 --- a/filecoin-proofs/Cargo.toml +++ b/filecoin-proofs/Cargo.toml @@ -44,6 +44,7 @@ merkletree = "0.20.0" bincode = "1.1.2" anyhow = "1.0.23" rand_xorshift = "0.2.0" +sha2 = { version = "0.8.3", package = "sha2ni" } typenum = "1.11.2" bitintr = "0.3.0" gperftools = { version = "0.2", optional = true } diff --git a/filecoin-proofs/src/api/mod.rs b/filecoin-proofs/src/api/mod.rs index 16a6a03e0..a55b509cf 100644 --- a/filecoin-proofs/src/api/mod.rs +++ b/filecoin-proofs/src/api/mod.rs @@ -131,8 +131,13 @@ where let comm_d = as_safe_commitment::<::Domain, _>(&comm_d, "comm_d")?; - let replica_id = - generate_replica_id::(&prover_id, sector_id.into(), &ticket, comm_d); + let replica_id = generate_replica_id::( + &prover_id, + sector_id.into(), + &ticket, + comm_d, + &porep_config.porep_id, + ); let mut data = Vec::new(); sealed_sector.read_to_end(&mut data)?; @@ -152,6 +157,7 @@ where let pp = public_params( PaddedBytesAmount::from(porep_config), usize::from(PoRepProofPartitions::from(porep_config)), + porep_config.porep_id, )?; let offset_padded: PaddedBytesAmount = UnpaddedBytesAmount::from(offset).into(); @@ -559,6 +565,7 @@ mod tests { let out = bytes_into_fr(¬_convertible_to_fr_bytes); assert!(out.is_err(), "tripwire"); + let arbitrary_porep_id = [87; 32]; { let result = verify_seal::( PoRepConfig { @@ -570,6 +577,7 @@ mod tests { .get(&SECTOR_SIZE_2_KIB) .unwrap(), ), + porep_id: arbitrary_porep_id, }, not_convertible_to_fr_bytes, convertible_to_fr_bytes, @@ -604,6 +612,7 @@ mod tests { .get(&SECTOR_SIZE_2_KIB) .unwrap(), ), + porep_id: arbitrary_porep_id, }, convertible_to_fr_bytes, not_convertible_to_fr_bytes, diff --git a/filecoin-proofs/src/api/seal.rs b/filecoin-proofs/src/api/seal.rs index 514b09588..3eb4c640c 100644 --- a/filecoin-proofs/src/api/seal.rs +++ b/filecoin-proofs/src/api/seal.rs @@ -92,6 +92,7 @@ where vanilla_params: setup_params( PaddedBytesAmount::from(porep_config), usize::from(PoRepProofPartitions::from(porep_config)), + porep_config.porep_id, )?, partitions: Some(usize::from(PoRepProofPartitions::from(porep_config))), priority: false, @@ -149,8 +150,13 @@ where "pieces and comm_d do not match" ); - let replica_id = - generate_replica_id::(&prover_id, sector_id.into(), &ticket, comm_d); + let replica_id = generate_replica_id::( + &prover_id, + sector_id.into(), + &ticket, + comm_d, + &porep_config.porep_id, + ); let labels = StackedDrg::::replicate_phase1( &compound_public_params.vanilla_params, @@ -234,6 +240,7 @@ where vanilla_params: setup_params( PaddedBytesAmount::from(porep_config), usize::from(PoRepProofPartitions::from(porep_config)), + porep_config.porep_id, )?, partitions: Some(usize::from(PoRepProofPartitions::from(porep_config))), priority: false, @@ -327,11 +334,17 @@ pub fn seal_commit_phase1, Tree: 'static + MerkleTreeTrait>( let comm_r_safe = as_safe_commitment(&comm_r, "comm_r")?; let comm_d_safe = DefaultPieceDomain::try_from_bytes(&comm_d)?; - let replica_id = - generate_replica_id::(&prover_id, sector_id.into(), &ticket, comm_d_safe); + let replica_id = generate_replica_id::( + &prover_id, + sector_id.into(), + &ticket, + comm_d_safe, + &porep_config.porep_id, + ); let public_inputs = stacked::PublicInputs { replica_id, + porep_id: porep_config.porep_id, tau: Some(stacked::Tau { comm_d: comm_d_safe, comm_r: comm_r_safe, @@ -349,6 +362,7 @@ pub fn seal_commit_phase1, Tree: 'static + MerkleTreeTrait>( vanilla_params: setup_params( PaddedBytesAmount::from(porep_config), usize::from(PoRepProofPartitions::from(porep_config)), + porep_config.porep_id, )?, partitions: Some(usize::from(PoRepProofPartitions::from(porep_config))), priority: false, @@ -411,6 +425,7 @@ pub fn seal_commit_phase2( let public_inputs = stacked::PublicInputs { replica_id, + porep_id: porep_config.porep_id, tau: Some(stacked::Tau { comm_d: comm_d_safe, comm_r: comm_r_safe, @@ -430,6 +445,7 @@ pub fn seal_commit_phase2( vanilla_params: setup_params( PaddedBytesAmount::from(porep_config), usize::from(PoRepProofPartitions::from(porep_config)), + porep_config.porep_id, )?, partitions: Some(usize::from(PoRepProofPartitions::from(porep_config))), priority: false, @@ -517,13 +533,19 @@ pub fn verify_seal( let comm_r: ::Domain = as_safe_commitment(&comm_r_in, "comm_r")?; let comm_d: DefaultPieceDomain = as_safe_commitment(&comm_d_in, "comm_d")?; - let replica_id = - generate_replica_id::(&prover_id, sector_id.into(), &ticket, comm_d); + let replica_id = generate_replica_id::( + &prover_id, + sector_id.into(), + &ticket, + comm_d, + &porep_config.porep_id, + ); let compound_setup_params = compound_proof::SetupParams { vanilla_params: setup_params( PaddedBytesAmount::from(porep_config), usize::from(PoRepProofPartitions::from(porep_config)), + porep_config.porep_id, )?, partitions: Some(usize::from(PoRepProofPartitions::from(porep_config))), priority: false, @@ -537,6 +559,7 @@ pub fn verify_seal( let public_inputs = stacked::PublicInputs::<::Domain, DefaultPieceDomain> { replica_id, + porep_id: porep_config.porep_id, tau: Some(Tau { comm_r, comm_d }), seed, k: None, @@ -628,6 +651,7 @@ pub fn verify_batch_seal( vanilla_params: setup_params( PaddedBytesAmount::from(porep_config), usize::from(PoRepProofPartitions::from(porep_config)), + porep_config.porep_id, )?, partitions: Some(usize::from(PoRepProofPartitions::from(porep_config))), priority: false, @@ -650,6 +674,7 @@ pub fn verify_batch_seal( sector_ids[i].into(), &tickets[i], comm_d, + &porep_config.porep_id, ); public_inputs.push(stacked::PublicInputs::< @@ -657,6 +682,7 @@ pub fn verify_batch_seal( DefaultPieceDomain, > { replica_id, + porep_id: porep_config.porep_id, tau: Some(Tau { comm_r, comm_d }), seed: seeds[i], k: None, diff --git a/filecoin-proofs/src/bin/paramcache.rs b/filecoin-proofs/src/bin/paramcache.rs index 05678bc37..65f6f414c 100644 --- a/filecoin-proofs/src/bin/paramcache.rs +++ b/filecoin-proofs/src/bin/paramcache.rs @@ -36,6 +36,7 @@ fn cache_porep_params(porep_config: PoRepConfig let public_params = public_params( PaddedBytesAmount::from(porep_config), usize::from(PoRepProofPartitions::from(porep_config)), + porep_config.porep_id, ) .unwrap(); @@ -216,6 +217,7 @@ fn generate_params_porep(sector_size: u64) { .get(§or_size) .expect("missing sector size"), ), + porep_id: [0; 32], } ); } diff --git a/filecoin-proofs/src/bin/phase2.rs b/filecoin-proofs/src/bin/phase2.rs index d7633563f..b72aec474 100644 --- a/filecoin-proofs/src/bin/phase2.rs +++ b/filecoin-proofs/src/bin/phase2.rs @@ -178,12 +178,14 @@ fn blank_porep_poseidon_circuit( let porep_config = PoRepConfig { sector_size: SectorSize(sector_size), partitions: PoRepProofPartitions(n_partitions), + porep_id: [0; 32], }; let setup_params = compound_proof::SetupParams { vanilla_params: setup_params( PaddedBytesAmount::from(porep_config), usize::from(PoRepProofPartitions::from(porep_config)), + porep_config.porep_id, ) .unwrap(), partitions: Some(usize::from(PoRepProofPartitions::from(porep_config))), diff --git a/filecoin-proofs/src/caches.rs b/filecoin-proofs/src/caches.rs index de871cfee..4abf854b9 100644 --- a/filecoin-proofs/src/caches.rs +++ b/filecoin-proofs/src/caches.rs @@ -81,6 +81,7 @@ pub fn get_stacked_params( let public_params = public_params::( PaddedBytesAmount::from(porep_config), usize::from(PoRepProofPartitions::from(porep_config)), + porep_config.porep_id, )?; let parameters_generator = || { @@ -151,6 +152,7 @@ pub fn get_stacked_verifying_key( let public_params = public_params( PaddedBytesAmount::from(porep_config), usize::from(PoRepProofPartitions::from(porep_config)), + porep_config.porep_id, )?; let vk_generator = || { diff --git a/filecoin-proofs/src/parameters.rs b/filecoin-proofs/src/parameters.rs index 97dba947e..0946741be 100644 --- a/filecoin-proofs/src/parameters.rs +++ b/filecoin-proofs/src/parameters.rs @@ -6,11 +6,6 @@ use storage_proofs::proof::ProofScheme; use crate::constants::*; use crate::types::{MerkleTreeTrait, PaddedBytesAmount, PoStConfig}; -const DRG_SEED: [u8; 28] = [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, -]; // Arbitrary, need a theory for how to vary this over time. - type WinningPostSetupParams = fallback::SetupParams; pub type WinningPostPublicParams = fallback::PublicParams; @@ -20,8 +15,13 @@ pub type WindowPostPublicParams = fallback::PublicParams; pub fn public_params( sector_bytes: PaddedBytesAmount, partitions: usize, + porep_id: [u8; 32], ) -> Result> { - StackedDrg::::setup(&setup_params(sector_bytes, partitions)?) + StackedDrg::::setup(&setup_params( + sector_bytes, + partitions, + porep_id, + )?) } pub fn winning_post_public_params( @@ -71,6 +71,7 @@ pub fn window_post_setup_params(post_config: &PoStConfig) -> WindowPostSetupPara pub fn setup_params( sector_bytes: PaddedBytesAmount, partitions: usize, + porep_id: [u8; 32], ) -> Result { let layer_challenges = select_challenges( partitions, @@ -101,7 +102,7 @@ pub fn setup_params( nodes, degree, expansion_degree, - seed: DRG_SEED, + porep_id, layer_challenges, }) } diff --git a/filecoin-proofs/src/pieces.rs b/filecoin-proofs/src/pieces.rs index b86278b1c..59e05b991 100644 --- a/filecoin-proofs/src/pieces.rs +++ b/filecoin-proofs/src/pieces.rs @@ -356,7 +356,7 @@ mod tests { use paired::bls12_381::Fr; use rand::{Rng, RngCore, SeedableRng}; use rand_xorshift::XorShiftRng; - use storage_proofs::drgraph::{new_seed, Graph}; + use storage_proofs::drgraph::Graph; use storage_proofs::merkle::create_base_merkle_tree; use storage_proofs::porep::stacked::StackedBucketGraph; @@ -698,11 +698,12 @@ mod tests { sector_size: SectorSize, ) -> Result<([u8; 32], Vec)> { let rng = &mut XorShiftRng::from_seed(crate::TEST_SEED); + let porep_id = [32; 32]; let graph = StackedBucketGraph::::new_stacked( u64::from(sector_size) as usize / NODE_SIZE, DRG_DEGREE, EXP_DEGREE, - new_seed(), + porep_id, )?; let mut staged_sector = Vec::with_capacity(u64::from(sector_size) as usize); diff --git a/filecoin-proofs/src/types/porep_config.rs b/filecoin-proofs/src/types/porep_config.rs index 53b3fc3e1..7cb82d889 100644 --- a/filecoin-proofs/src/types/porep_config.rs +++ b/filecoin-proofs/src/types/porep_config.rs @@ -11,6 +11,7 @@ use crate::types::*; pub struct PoRepConfig { pub sector_size: SectorSize, pub partitions: PoRepProofPartitions, + pub porep_id: [u8; 32], } impl From for PaddedBytesAmount { @@ -47,6 +48,7 @@ impl PoRepConfig { let params = crate::parameters::public_params::( self.sector_size.into(), self.partitions.into(), + self.porep_id, )?; Ok( diff --git a/filecoin-proofs/src/types/sector_class.rs b/filecoin-proofs/src/types/sector_class.rs index 95a002506..42ed93b9d 100644 --- a/filecoin-proofs/src/types/sector_class.rs +++ b/filecoin-proofs/src/types/sector_class.rs @@ -4,6 +4,7 @@ use crate::types::*; pub struct SectorClass { pub sector_size: SectorSize, pub partitions: PoRepProofPartitions, + pub porep_id: [u8; 32], } impl From for PoRepConfig { @@ -11,10 +12,12 @@ impl From for PoRepConfig { let SectorClass { sector_size, partitions, + porep_id, } = x; PoRepConfig { sector_size, partitions, + porep_id, } } } diff --git a/filecoin-proofs/tests/api.rs b/filecoin-proofs/tests/api.rs index af883fc98..79231600a 100644 --- a/filecoin-proofs/tests/api.rs +++ b/filecoin-proofs/tests/api.rs @@ -349,7 +349,7 @@ fn create_seal( )?; let piece_infos = vec![piece_info]; - + let arbitrary_porep_id = [28; 32]; let sealed_sector_file = NamedTempFile::new()?; let mut unseal_file = NamedTempFile::new()?; let config = PoRepConfig { @@ -357,6 +357,7 @@ fn create_seal( partitions: PoRepProofPartitions( *POREP_PARTITIONS.read().unwrap().get(§or_size).unwrap(), ), + porep_id: arbitrary_porep_id, }; let cache_dir = tempfile::tempdir().unwrap(); diff --git a/storage-proofs/core/benches/drgraph.rs b/storage-proofs/core/benches/drgraph.rs index 8347a785a..7746ad198 100644 --- a/storage-proofs/core/benches/drgraph.rs +++ b/storage-proofs/core/benches/drgraph.rs @@ -11,7 +11,7 @@ fn drgraph(c: &mut Criterion) { "bucket/m=6", |b, n| { let graph = - BucketGraph::::new(*n, BASE_DEGREE, 0, new_seed()).unwrap(); + BucketGraph::::new(*n, BASE_DEGREE, 0, [32; 32]).unwrap(); b.iter(|| { let mut parents = vec![0; 6]; diff --git a/storage-proofs/core/src/crypto/mod.rs b/storage-proofs/core/src/crypto/mod.rs index 45a3ab8e0..87cd38f33 100644 --- a/storage-proofs/core/src/crypto/mod.rs +++ b/storage-proofs/core/src/crypto/mod.rs @@ -1,5 +1,22 @@ +use sha2::{Digest, Sha256}; pub mod aes; pub mod feistel; pub mod pedersen; pub mod sloth; pub mod xor; + +pub struct DomainSeparationTag(&'static str); + +pub const DRSAMPLE_DST: DomainSeparationTag = DomainSeparationTag("Filecoin_DRSample"); +pub const FEISTEL_DST: DomainSeparationTag = DomainSeparationTag("Filecoin_Feistel"); + +pub fn derive_porep_domain_seed( + domain_separation_tag: DomainSeparationTag, + porep_id: [u8; 32], +) -> [u8; 32] { + Sha256::new() + .chain(domain_separation_tag.0) + .chain(porep_id) + .result() + .into() +} diff --git a/storage-proofs/core/src/drgraph.rs b/storage-proofs/core/src/drgraph.rs index 8bc058c3a..e4770db73 100644 --- a/storage-proofs/core/src/drgraph.rs +++ b/storage-proofs/core/src/drgraph.rs @@ -7,6 +7,7 @@ use rand::{rngs::OsRng, Rng, SeedableRng}; use rand_chacha::ChaCha8Rng; use sha2::{Digest, Sha256}; +use crate::crypto::{derive_porep_domain_seed, DRSAMPLE_DST}; use crate::error::*; use crate::fr32::bytes_into_fr_repr_safe; use crate::hasher::{Hasher, PoseidonArity}; @@ -54,7 +55,7 @@ pub trait Graph: ::std::fmt::Debug + Clone + PartialEq + Eq { nodes: usize, base_degree: usize, expansion_degree: usize, - seed: [u8; 28], + porep_id: [u8; 32], ) -> Result; fn seed(&self) -> [u8; 28]; @@ -203,7 +204,7 @@ impl Graph for BucketGraph { nodes: usize, base_degree: usize, expansion_degree: usize, - seed: [u8; 28], + porep_id: [u8; 32], ) -> Result { ensure!(expansion_degree == 0, "Expension degree must be zero."); @@ -216,10 +217,14 @@ impl Graph for BucketGraph { "The number of metagraph nodes must be precisely castable to `f64`" ); + let mut drg_seed = [0; 28]; + let raw_seed = derive_porep_domain_seed(DRSAMPLE_DST, porep_id); + drg_seed.copy_from_slice(&raw_seed[..28]); + Ok(BucketGraph { nodes, base_degree, - seed, + seed: drg_seed, _h: PhantomData, }) } @@ -237,7 +242,6 @@ mod tests { use memmap::MmapOptions; use merkletree::store::StoreConfig; - use crate::drgraph::new_seed; use crate::hasher::{ Blake2sHasher, PedersenHasher, PoseidonArity, PoseidonHasher, Sha256Hasher, }; @@ -257,9 +261,10 @@ mod tests { fn graph_bucket() { let degree = BASE_DEGREE; + let porep_id = [123; 32]; for size in vec![4, 16, 256, 2048] { - let g = BucketGraph::::new(size, degree, 0, new_seed()).unwrap(); + let g = BucketGraph::::new(size, degree, 0, porep_id).unwrap(); assert_eq!(g.size(), size, "wrong nodes count"); @@ -309,7 +314,8 @@ mod tests { fn gen_proof(config: Option) { let leafs = 64; - let g = BucketGraph::::new(leafs, BASE_DEGREE, 0, new_seed()).unwrap(); + let porep_id = [1; 32]; + let g = BucketGraph::::new(leafs, BASE_DEGREE, 0, porep_id).unwrap(); let data = vec![2u8; NODE_SIZE * leafs]; let mmapped = &mmap_from(&data); diff --git a/storage-proofs/core/src/por.rs b/storage-proofs/core/src/por.rs index bcf58a62c..43804dc09 100644 --- a/storage-proofs/core/src/por.rs +++ b/storage-proofs/core/src/por.rs @@ -156,7 +156,7 @@ mod tests { use rand::SeedableRng; use rand_xorshift::XorShiftRng; - use crate::drgraph::{new_seed, BucketGraph, Graph, BASE_DEGREE}; + use crate::drgraph::{BucketGraph, Graph, BASE_DEGREE}; use crate::fr32::fr_into_bytes; use crate::hasher::{Blake2sHasher, PedersenHasher, PoseidonHasher, Sha256Hasher}; use crate::merkle::{create_base_merkle_tree, DiskStore, MerkleProofTrait, MerkleTreeWrapper}; @@ -174,8 +174,8 @@ mod tests { let data: Vec = (0..leaves) .flat_map(|_| fr_into_bytes(&Fr::random(rng))) .collect(); - - let graph = BucketGraph::::new(leaves, BASE_DEGREE, 0, new_seed()).unwrap(); + let porep_id = [3; 32]; + let graph = BucketGraph::::new(leaves, BASE_DEGREE, 0, porep_id).unwrap(); let tree = create_base_merkle_tree::(None, graph.size(), data.as_slice()).unwrap(); let pub_inputs = PublicInputs { @@ -265,7 +265,9 @@ mod tests { .flat_map(|_| fr_into_bytes(&Fr::random(rng))) .collect(); - let graph = BucketGraph::::new(leaves, BASE_DEGREE, 0, new_seed()).unwrap(); + let porep_id = [99; 32]; + + let graph = BucketGraph::::new(leaves, BASE_DEGREE, 0, porep_id).unwrap(); let tree = create_base_merkle_tree::(None, graph.size(), data.as_slice()).unwrap(); let pub_inputs = PublicInputs { @@ -350,7 +352,8 @@ mod tests { .flat_map(|_| fr_into_bytes(&Fr::random(rng))) .collect(); - let graph = BucketGraph::::new(leaves, BASE_DEGREE, 0, new_seed()).unwrap(); + let porep_id = [32; 32]; + let graph = BucketGraph::::new(leaves, BASE_DEGREE, 0, porep_id).unwrap(); let tree = create_base_merkle_tree::(None, graph.size(), data.as_slice()).unwrap(); let pub_inputs = PublicInputs { diff --git a/storage-proofs/porep/benches/encode.rs b/storage-proofs/porep/benches/encode.rs index 24fd5f4a3..20e4dd701 100644 --- a/storage-proofs/porep/benches/encode.rs +++ b/storage-proofs/porep/benches/encode.rs @@ -23,7 +23,7 @@ fn pregenerate_data(degree: usize) -> Pregenerated { .collect(); let replica_id: H::Domain = H::Domain::random(&mut rng); - let graph = StackedBucketGraph::::new_stacked(size, 6, 8, new_seed()).unwrap(); + let graph = StackedBucketGraph::::new_stacked(size, 6, 8, [32; 32]).unwrap(); Pregenerated { data, diff --git a/storage-proofs/porep/benches/parents.rs b/storage-proofs/porep/benches/parents.rs index 9bb8a4b25..4dff9a4e9 100644 --- a/storage-proofs/porep/benches/parents.rs +++ b/storage-proofs/porep/benches/parents.rs @@ -38,7 +38,7 @@ fn stop_profile() {} fn pregenerate_graph(size: usize) -> StackedBucketGraph { let seed = [1u8; 28]; - StackedBucketGraph::::new_stacked(size, BASE_DEGREE, EXP_DEGREE, seed).unwrap() + StackedBucketGraph::::new_stacked(size, BASE_DEGREE, EXP_DEGREE, [32; 32]).unwrap() } fn parents_loop>(graph: &G, parents: &mut [u32]) { diff --git a/storage-proofs/porep/src/drg/circuit.rs b/storage-proofs/porep/src/drg/circuit.rs index 864a5aa8f..b58c8a633 100644 --- a/storage-proofs/porep/src/drg/circuit.rs +++ b/storage-proofs/porep/src/drg/circuit.rs @@ -314,7 +314,7 @@ mod tests { use storage_proofs_core::{ cache_key::CacheKey, compound_proof, - drgraph::{graph_height, new_seed, BucketGraph, BASE_DEGREE}, + drgraph::{graph_height, BucketGraph, BASE_DEGREE}, fr32::{bytes_into_fr, fr_into_bytes}, gadgets::TestConstraintSystem, hasher::PedersenHasher, @@ -368,7 +368,7 @@ mod tests { nodes, degree, expansion_degree: 0, - seed: new_seed(), + porep_id: [32; 32], }, private: false, challenges_count: 1, diff --git a/storage-proofs/porep/src/drg/compound.rs b/storage-proofs/porep/src/drg/compound.rs index 58ff665d1..fce0a0d71 100644 --- a/storage-proofs/porep/src/drg/compound.rs +++ b/storage-proofs/porep/src/drg/compound.rs @@ -289,7 +289,7 @@ mod tests { use storage_proofs_core::{ cache_key::CacheKey, compound_proof, - drgraph::{new_seed, BucketGraph, BASE_DEGREE}, + drgraph::{BucketGraph, BASE_DEGREE}, fr32::fr_into_bytes, gadgets::{MetricCS, TestConstraintSystem}, hasher::{Hasher, PedersenHasher, PoseidonHasher}, @@ -342,16 +342,13 @@ mod tests { let replica_path = cache_dir.path().join("replica-path"); let mut mmapped_data = setup_replica(&data, &replica_path); - // Only generate seed once. It would be bad if we used different seeds in the same test. - let seed = new_seed(); - let setup_params = compound_proof::SetupParams { vanilla_params: drg::SetupParams { drg: drg::DrgParams { nodes, degree, expansion_degree: 0, - seed, + porep_id: [32; 32], }, private: false, challenges_count: 2, @@ -396,7 +393,7 @@ mod tests { nodes, degree, expansion_degree: 0, - seed, + porep_id: [32; 32], }, private: false, challenges_count: 2, diff --git a/storage-proofs/porep/src/drg/vanilla.rs b/storage-proofs/porep/src/drg/vanilla.rs index 1b97297b0..075ab8160 100644 --- a/storage-proofs/porep/src/drg/vanilla.rs +++ b/storage-proofs/porep/src/drg/vanilla.rs @@ -80,8 +80,7 @@ pub struct DrgParams { pub expansion_degree: usize, - // Random seed - pub seed: [u8; 28], + pub porep_id: [u8; 32], } #[derive(Debug, Clone)] @@ -250,7 +249,7 @@ where sp.drg.nodes, sp.drg.degree, sp.drg.expansion_degree, - sp.drg.seed, + sp.drg.porep_id, )?; Ok(PublicParams::new(graph, sp.private, sp.challenges_count)) @@ -652,7 +651,7 @@ mod tests { nodes, degree: BASE_DEGREE, expansion_degree: 0, - seed: new_seed(), + porep_id: [32; 32], }, private: false, challenges_count: 1, @@ -731,7 +730,7 @@ mod tests { nodes: data.len() / 32, degree: BASE_DEGREE, expansion_degree: 0, - seed: new_seed(), + porep_id: [32; 32], }, private: false, challenges_count: 1, @@ -797,7 +796,6 @@ mod tests { let rng = &mut XorShiftRng::from_seed(crate::TEST_SEED); let degree = BASE_DEGREE; let expansion_degree = 0; - let seed = new_seed(); let replica_id: ::Domain = ::Domain::random(rng); @@ -825,7 +823,7 @@ mod tests { nodes, degree, expansion_degree, - seed, + porep_id: [32; 32], }, private: false, challenges_count: 2, diff --git a/storage-proofs/porep/src/stacked/circuit/create_label.rs b/storage-proofs/porep/src/stacked/circuit/create_label.rs index 12bb70726..431710d62 100644 --- a/storage-proofs/porep/src/stacked/circuit/create_label.rs +++ b/storage-proofs/porep/src/stacked/circuit/create_label.rs @@ -74,7 +74,7 @@ mod tests { use rand::SeedableRng; use rand_xorshift::XorShiftRng; use storage_proofs_core::{ - drgraph::{new_seed, Graph, BASE_DEGREE}, + drgraph::{Graph, BASE_DEGREE}, fr32::{bytes_into_fr, fr_into_bytes}, gadgets::TestConstraintSystem, hasher::Sha256Hasher, @@ -92,12 +92,13 @@ mod tests { let rng = &mut XorShiftRng::from_seed(crate::TEST_SEED); let size = 64; + let porep_id = [32; 32]; let graph = StackedBucketGraph::::new_stacked( size, BASE_DEGREE, EXP_DEGREE, - new_seed(), + porep_id, ) .unwrap(); diff --git a/storage-proofs/porep/src/stacked/circuit/proof.rs b/storage-proofs/porep/src/stacked/circuit/proof.rs index e4251dfcd..d2a9a451e 100644 --- a/storage-proofs/porep/src/stacked/circuit/proof.rs +++ b/storage-proofs/porep/src/stacked/circuit/proof.rs @@ -349,7 +349,7 @@ mod tests { use storage_proofs_core::{ cache_key::CacheKey, compound_proof, - drgraph::{new_seed, BASE_DEGREE}, + drgraph::BASE_DEGREE, fr32::fr_into_bytes, gadgets::{MetricCS, TestConstraintSystem}, hasher::{Hasher, PedersenHasher, PoseidonHasher, Sha256Hasher}, @@ -423,7 +423,7 @@ mod tests { nodes, degree, expansion_degree, - seed: new_seed(), + porep_id: [32; 32], layer_challenges: layer_challenges.clone(), }; @@ -443,10 +443,11 @@ mod tests { assert_ne!(data, copied, "replication did not change data"); let seed = rng.gen(); - + let arbitrary_porep_id = [44; 32]; let pub_inputs = PublicInputs::<::Domain, ::Domain> { replica_id: replica_id.into(), + porep_id: arbitrary_porep_id, seed, tau: Some(tau.into()), k: None, @@ -594,7 +595,7 @@ mod tests { nodes, degree, expansion_degree, - seed: new_seed(), + porep_id: [32; 32], layer_challenges: layer_challenges.clone(), }, partitions: Some(partition_count), @@ -632,10 +633,11 @@ mod tests { assert_ne!(data, copied, "replication did not change data"); let seed = rng.gen(); - + let arbitrary_porep_id = [55; 32]; let public_inputs = PublicInputs::<::Domain, ::Domain> { replica_id: replica_id.into(), + porep_id: arbitrary_porep_id, seed, tau: Some(tau), k: None, diff --git a/storage-proofs/porep/src/stacked/vanilla/graph.rs b/storage-proofs/porep/src/stacked/vanilla/graph.rs index 780d4f069..06296291c 100644 --- a/storage-proofs/porep/src/stacked/vanilla/graph.rs +++ b/storage-proofs/porep/src/stacked/vanilla/graph.rs @@ -1,3 +1,4 @@ +use std::convert::TryInto; use std::marker::PhantomData; #[cfg(target_arch = "x86")] @@ -11,7 +12,11 @@ use once_cell::sync::OnceCell; use rayon::prelude::*; use sha2raw::Sha256; use storage_proofs_core::{ - crypto::feistel::{self, FeistelPrecomputed}, + crypto::{ + derive_porep_domain_seed, + feistel::{self, FeistelPrecomputed}, + FEISTEL_DST, + }, drgraph::BASE_DEGREE, drgraph::{BucketGraph, Graph}, error::Result, @@ -114,6 +119,7 @@ where { expansion_degree: usize, base_graph: G, + feistel_keys: [feistel::Index; 4], feistel_precomputed: FeistelPrecomputed, id: String, cache: Option<&'static ParentCache>, @@ -167,7 +173,7 @@ where nodes: usize, base_degree: usize, expansion_degree: usize, - seed: [u8; 28], + porep_id: [u8; 32], ) -> Result { assert_eq!(base_degree, BASE_DEGREE); assert_eq!(expansion_degree, EXP_DEGREE); @@ -177,10 +183,17 @@ where let base_graph = match base_graph { Some(graph) => graph, - None => G::new(nodes, base_degree, 0, seed)?, + None => G::new(nodes, base_degree, 0, porep_id)?, }; let bg_id = base_graph.identifier(); + let mut feistel_keys = [0u64; 4]; + let raw_seed = derive_porep_domain_seed(FEISTEL_DST, porep_id); + feistel_keys[0] = u64::from_le_bytes(raw_seed[0..8].try_into().unwrap()); + feistel_keys[1] = u64::from_le_bytes(raw_seed[8..16].try_into().unwrap()); + feistel_keys[2] = u64::from_le_bytes(raw_seed[16..24].try_into().unwrap()); + feistel_keys[3] = u64::from_le_bytes(raw_seed[24..32].try_into().unwrap()); + let mut res = StackedGraph { base_graph, id: format!( @@ -189,6 +202,7 @@ where ), expansion_degree, cache: None, + feistel_keys, feistel_precomputed: feistel::precompute((expansion_degree * nodes) as feistel::Index), _h: PhantomData, }; @@ -369,9 +383,9 @@ where nodes: usize, base_degree: usize, expansion_degree: usize, - seed: [u8; 28], + porep_id: [u8; 32], ) -> Result { - Self::new_stacked(nodes, base_degree, expansion_degree, seed) + Self::new_stacked(nodes, base_degree, expansion_degree, porep_id) } fn create_key( @@ -443,9 +457,9 @@ where nodes: usize, base_degree: usize, expansion_degree: usize, - seed: [u8; 28], + porep_id: [u8; 32], ) -> Result { - Self::new(None, nodes, base_degree, expansion_degree, seed) + Self::new(None, nodes, base_degree, expansion_degree, porep_id) } pub fn base_graph(&self) -> &G { diff --git a/storage-proofs/porep/src/stacked/vanilla/params.rs b/storage-proofs/porep/src/stacked/vanilla/params.rs index 7667a8c4b..a511eb313 100644 --- a/storage-proofs/porep/src/stacked/vanilla/params.rs +++ b/storage-proofs/porep/src/stacked/vanilla/params.rs @@ -36,9 +36,7 @@ pub struct SetupParams { pub expansion_degree: usize, - // Random seed - pub seed: [u8; 28], - + pub porep_id: [u8; 32], pub layer_challenges: LayerChallenges, } @@ -109,6 +107,7 @@ where pub struct PublicInputs { pub replica_id: T, pub seed: [u8; 32], + pub porep_id: [u8; 32], pub tau: Option>, /// Partition index pub k: Option, @@ -725,6 +724,7 @@ pub fn generate_replica_id>( sector_id: u64, ticket: &[u8; 32], comm_d: T, + porep_seed: &[u8; 32], ) -> H::Domain { use sha2::{Digest, Sha256}; @@ -733,6 +733,7 @@ pub fn generate_replica_id>( .chain(§or_id.to_be_bytes()[..]) .chain(ticket) .chain(AsRef::<[u8]>::as_ref(&comm_d)) + .chain(porep_seed) .result(); bytes_into_fr_repr_safe(hash.as_ref()).into() diff --git a/storage-proofs/porep/src/stacked/vanilla/proof.rs b/storage-proofs/porep/src/stacked/vanilla/proof.rs index 165c6fc70..e2e8073aa 100644 --- a/storage-proofs/porep/src/stacked/vanilla/proof.rs +++ b/storage-proofs/porep/src/stacked/vanilla/proof.rs @@ -891,7 +891,7 @@ mod tests { use rand::{Rng, SeedableRng}; use rand_xorshift::XorShiftRng; use storage_proofs_core::{ - drgraph::{new_seed, BASE_DEGREE}, + drgraph::BASE_DEGREE, fr32::fr_into_bytes, hasher::{Blake2sHasher, PedersenHasher, PoseidonHasher, Sha256Hasher}, merkle::MerkleTreeTrait, @@ -1011,7 +1011,7 @@ mod tests { nodes, degree: BASE_DEGREE, expansion_degree: EXP_DEGREE, - seed: new_seed(), + porep_id: [32; 32], layer_challenges: challenges.clone(), }; @@ -1188,7 +1188,7 @@ mod tests { nodes, degree, expansion_degree, - seed: new_seed(), + porep_id: [32; 32], layer_challenges: challenges.clone(), }; @@ -1208,10 +1208,11 @@ mod tests { assert_ne!(data, copied, "replication did not change data"); let seed = rng.gen(); - + let arbitrary_porep_id = [92; 32]; let pub_inputs = PublicInputs::<::Domain, ::Domain> { replica_id, + porep_id: arbitrary_porep_id, seed, tau: Some(tau), k: None, @@ -1268,7 +1269,7 @@ mod tests { nodes, degree, expansion_degree, - seed: new_seed(), + porep_id: [32; 32], layer_challenges: layer_challenges.clone(), }; diff --git a/storage-proofs/porep/src/stacked/vanilla/proof_scheme.rs b/storage-proofs/porep/src/stacked/vanilla/proof_scheme.rs index b14f8e05b..6409009bc 100644 --- a/storage-proofs/porep/src/stacked/vanilla/proof_scheme.rs +++ b/storage-proofs/porep/src/stacked/vanilla/proof_scheme.rs @@ -31,7 +31,7 @@ impl<'a, 'c, Tree: 'static + MerkleTreeTrait, G: 'static + Hasher> ProofScheme<' sp.nodes, sp.degree, sp.expansion_degree, - sp.seed, + sp.porep_id, )?; Ok(PublicParams::new(graph, sp.layer_challenges.clone())) @@ -142,6 +142,7 @@ impl<'a, 'c, Tree: 'static + MerkleTreeTrait, G: 'static + Hasher> ProofScheme<' self::PublicInputs { replica_id: pub_in.replica_id, seed: pub_in.seed, + porep_id: pub_in.porep_id, tau: pub_in.tau, k, }