Commit 7138842d authored by 董子豪's avatar 董子豪

aggregate-window-post-api

parent ac52ba04
......@@ -6,7 +6,7 @@ use filecoin_proofs_v1::with_shape;
use crate::types::VanillaProofBytes;
use crate::{
ChallengeSeed, FallbackPoStSectorProof, MerkleTreeTrait, PoStType, PrivateReplicaInfo,
ProverId, PublicReplicaInfo, RegisteredPoStProof, SectorId, SnarkProof,
ProverId, PublicReplicaInfo, RegisteredPoStProof, SectorId, SnarkProof, AggregateSnarkProof,
};
pub fn generate_winning_post_sector_challenge(
......@@ -494,3 +494,135 @@ fn verify_window_post_inner<Tree: 'static + MerkleTreeTrait>(
Ok(valid_v1)
}
pub fn aggregate_window_post_proofs(
registered_aggregation: RegisteredAggregationProof,
randomnesses: &[ChallengeSeed],
proofs: &[(RegisteredPoStProof, &[u8])],
) -> Result<AggregateSnarkProof> {
ensure!(!replicas.is_empty(), "no replicas supplied");
let registered_post_proof_type_v1 = proofs[0].0;
ensure!(
registered_post_proof_type_v1.typ() == PoStType::Window,
"invalid post type provided"
);
ensure!(
registered_aggregation == RegisteredAggregationProof::SnarkPackV1,
"unusupported aggregation version"
);
with_shape!(
u64::from(registered_post_proof_type_v1.sector_size()),
aggregate_window_post_proofs_inner,
registered_post_proof_type_v1,
randomnesses,
proofs,
1,
)
}
fn aggregate_window_post_proofs_inner<Tree: 'static + MerkleTreeTrait>(
registered_proof_v1: RegisteredPoStProof,
randomnesses: &[ChallengeSeed],
proofs: &[(RegisteredPoStProof, &[u8])],
partitons: usize,
) -> Result<AggregateSnarkProof> {
let mut agg_proofs: Vec<Vec<u8>> = Vec::new();
for (registered_proof, proof) in proofs.iter() {
ensure!(
registered_proof == &registered_proof_v1,
"can only generate the same kind of PoSt"
);
agg_proofs.push(proof);
}
ensure!(!agg_proofs.is_empty(), "missing proofs");
filecoin_proofs_v1::aggregate_window_post_proofs::<Tree>(
&registered_proof_v1.as_v1_config(),
randomnesses,
agg_proofs.as_slice(),
partitons,
)
}
pub fn verify_aggregate_window_post_proofs(
registered_proof_v1: RegisteredPoStProof,
registered_aggregation: RegisteredAggregationProof,
prover_id: ProverId,
aggregate_proof_bytes: AggregateSnarkProof,
randomnesses: &[ChallengeSeed],
replicas: &[BTreeMap<SectorId, PublicReplicaInfo>],
) -> Result<bool> {
ensure!(!replicas.is_empty(), "no replicas supplied");
ensure!(proofs.len() == 1, "only one version of PoSt supported");
let registered_post_proof_type_v1 = proofs[0].0;
ensure!(
registered_post_proof_type_v1.major_version() == 1,
"only V1 supported"
);
ensure!(
registered_aggregation == RegisteredAggregationProof::SnarkPackV1,
"unusupported aggregation version"
);
with_shape!(
u64::from(registered_post_proof_type_v1.sector_size()),
verify_aggregate_window_post_proofs_inner,
registered_post_proof_type_v1,
prover_id,
aggregate_proof_bytes,
randomnesses,
replicas,
)
}
fn verify_aggregate_window_post_proofs_inner<Tree: 'static + MerkleTreeTrait>(
registered_proof_v1: RegisteredPoStProof,
prover_id: ProverId,
aggregate_proof_bytes: AggregateSnarkProof,
randomnesses: &[ChallengeSeed],
replicas: &[BTreeMap<SectorId, PublicReplicaInfo>],
) -> Result<bool> {
let mut replica_infos_v1 = Vec::new();
ensure!(
randomnesses.len() == replicas.len(),
"Randomnesses and Replica don't match"
);
for replica in replicas.iter() {
let mut replica_info_v1 = BTreeMap::new();
for (id, info) in repica.iter(){
let PublicReplicaInfo {
registered_proof,
comm_r,
} = info;
ensure!(
registered_proof == &registered_proof_v1,
"can only aggregate the same kind of PoSt"
);
let info_v1 = filecoin_proofs_v1::PublicReplicaInfo::new(*comm_r)?;
replica_info_v1.insert(*id, info_v1);
}
replica_infos_v1.push(replica_info_v1);
}
let valid_v1 = filecoin_proofs_v1::verify_aggregate_window_post_proofs::<Tree>(
&registered_proof_v1.as_v1_config(),
prover_id,
aggregate_proof_bytes,
randomnesses,
replica_infos_v1.as_slice(),
)?;
// once there are multiple versions, merge them before returning
Ok(valid_v1)
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment