make Pod derive from Any (#205)

This commit is contained in:
Daniel Gulotta 2025-04-22 06:06:23 -06:00 committed by GitHub
parent bf6d8aee8b
commit 58d3c6a236
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 29 additions and 56 deletions

View file

@ -188,6 +188,8 @@ impl SignedPodVerifyTarget {
#[cfg(test)] #[cfg(test)]
pub mod tests { pub mod tests {
use std::any::Any;
use plonky2::plonk::{circuit_builder::CircuitBuilder, circuit_data::CircuitConfig}; use plonky2::plonk::{circuit_builder::CircuitBuilder, circuit_data::CircuitConfig};
use super::*; use super::*;
@ -218,7 +220,7 @@ pub mod tests {
let sk = SecretKey::new_rand(); let sk = SecretKey::new_rand();
let mut signer = Signer(sk); let mut signer = Signer(sk);
let pod = pod.sign(&mut signer).unwrap(); let pod = pod.sign(&mut signer).unwrap();
let signed_pod = pod.pod.into_any().downcast::<SignedPod>().unwrap(); let signed_pod = (pod.pod as Box<dyn Any>).downcast::<SignedPod>().unwrap();
// use the pod in the circuit // use the pod in the circuit
let config = CircuitConfig::standard_recursion_config(); let config = CircuitConfig::standard_recursion_config();

View file

@ -293,8 +293,7 @@ impl PodProver for Prover {
.signed_pods .signed_pods
.iter() .iter()
.map(|p| { .map(|p| {
let p = p let p = (*p as &dyn Any)
.as_any()
.downcast_ref::<SignedPod>() .downcast_ref::<SignedPod>()
.expect("type SignedPod"); .expect("type SignedPod");
p.clone() p.clone()
@ -404,13 +403,6 @@ impl Pod for MainPod {
.collect() .collect()
} }
fn into_any(self: Box<Self>) -> Box<dyn Any> {
self
}
fn as_any(&self) -> &dyn Any {
self
}
fn serialized_proof(&self) -> String { fn serialized_proof(&self) -> String {
todo!() todo!()
} }
@ -453,7 +445,7 @@ pub mod tests {
let mut prover = Prover {}; let mut prover = Prover {};
let kyc_pod = kyc_builder.prove(&mut prover, &params)?; let kyc_pod = kyc_builder.prove(&mut prover, &params)?;
let pod = kyc_pod.pod.into_any().downcast::<MainPod>().unwrap(); let pod = (kyc_pod.pod as Box<dyn Any>).downcast::<MainPod>().unwrap();
pod.verify() pod.verify()
} }
@ -488,14 +480,16 @@ pub mod tests {
// Mock // Mock
let mut prover = MockProver {}; let mut prover = MockProver {};
let kyc_pod = kyc_builder.prove(&mut prover, &params).unwrap(); let kyc_pod = kyc_builder.prove(&mut prover, &params).unwrap();
let pod = kyc_pod.pod.into_any().downcast::<MockMainPod>().unwrap(); let pod = (kyc_pod.pod as Box<dyn Any>)
.downcast::<MockMainPod>()
.unwrap();
pod.verify().unwrap(); pod.verify().unwrap();
println!("{:#}", pod); println!("{:#}", pod);
// Real // Real
let mut prover = Prover {}; let mut prover = Prover {};
let kyc_pod = kyc_builder.prove(&mut prover, &params).unwrap(); let kyc_pod = kyc_builder.prove(&mut prover, &params).unwrap();
let pod = kyc_pod.pod.into_any().downcast::<MainPod>().unwrap(); let pod = (kyc_pod.pod as Box<dyn Any>).downcast::<MainPod>().unwrap();
pod.verify().unwrap() pod.verify().unwrap()
} }
} }

View file

@ -2,7 +2,7 @@
// MainPod // MainPod
// //
use std::{any::Any, fmt}; use std::fmt;
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
use base64::{prelude::BASE64_STANDARD, Engine}; use base64::{prelude::BASE64_STANDARD, Engine};
@ -277,13 +277,6 @@ impl Pod for MockMainPod {
.collect() .collect()
} }
fn into_any(self: Box<Self>) -> Box<dyn Any> {
self
}
fn as_any(&self) -> &dyn Any {
self
}
fn serialized_proof(&self) -> String { fn serialized_proof(&self) -> String {
BASE64_STANDARD.encode(serde_json::to_string(self).unwrap()) BASE64_STANDARD.encode(serde_json::to_string(self).unwrap())
} }
@ -291,6 +284,8 @@ impl Pod for MockMainPod {
#[cfg(test)] #[cfg(test)]
pub mod tests { pub mod tests {
use std::any::Any;
use super::*; use super::*;
use crate::{ use crate::{
backends::plonky2::mock::signedpod::MockSigner, backends::plonky2::mock::signedpod::MockSigner,
@ -323,7 +318,9 @@ pub mod tests {
let mut prover = MockProver {}; let mut prover = MockProver {};
let kyc_pod = kyc_builder.prove(&mut prover, &params)?; let kyc_pod = kyc_builder.prove(&mut prover, &params)?;
let pod = kyc_pod.pod.into_any().downcast::<MockMainPod>().unwrap(); let pod = (kyc_pod.pod as Box<dyn Any>)
.downcast::<MockMainPod>()
.unwrap();
println!("{:#}", pod); println!("{:#}", pod);
@ -340,9 +337,7 @@ pub mod tests {
let mut prover = MockProver {}; let mut prover = MockProver {};
let great_boy_pod = great_boy_builder.prove(&mut prover, &params)?; let great_boy_pod = great_boy_builder.prove(&mut prover, &params)?;
let pod = great_boy_pod let pod = (great_boy_pod.pod as Box<dyn Any>)
.pod
.into_any()
.downcast::<MockMainPod>() .downcast::<MockMainPod>()
.unwrap(); .unwrap();
@ -359,7 +354,9 @@ pub mod tests {
let tickets_builder = tickets_pod_full_flow()?; let tickets_builder = tickets_pod_full_flow()?;
let mut prover = MockProver {}; let mut prover = MockProver {};
let proof_pod = tickets_builder.prove(&mut prover, &params)?; let proof_pod = tickets_builder.prove(&mut prover, &params)?;
let pod = proof_pod.pod.into_any().downcast::<MockMainPod>().unwrap(); let pod = (proof_pod.pod as Box<dyn Any>)
.downcast::<MockMainPod>()
.unwrap();
println!("{}", pod); println!("{}", pod);
pod.verify()?; pod.verify()?;

View file

@ -1,4 +1,4 @@
use std::{any::Any, collections::HashMap}; use std::collections::HashMap;
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
use itertools::Itertools; use itertools::Itertools;
@ -118,13 +118,6 @@ impl Pod for MockSignedPod {
.collect() .collect()
} }
fn into_any(self: Box<Self>) -> Box<dyn Any> {
self
}
fn as_any(&self) -> &dyn Any {
self
}
fn serialized_proof(&self) -> String { fn serialized_proof(&self) -> String {
self.signature.to_string() self.signature.to_string()
} }
@ -132,7 +125,7 @@ impl Pod for MockSignedPod {
#[cfg(test)] #[cfg(test)]
pub mod tests { pub mod tests {
use std::iter; use std::{any::Any, iter};
use plonky2::field::types::Field; use plonky2::field::types::Field;
@ -152,7 +145,9 @@ pub mod tests {
let mut signer = MockSigner { pk: "Molly".into() }; let mut signer = MockSigner { pk: "Molly".into() };
let pod = pod.sign(&mut signer).unwrap(); let pod = pod.sign(&mut signer).unwrap();
let pod = pod.pod.into_any().downcast::<MockSignedPod>().unwrap(); let pod = (pod.pod as Box<dyn Any>)
.downcast::<MockSignedPod>()
.unwrap();
pod.verify()?; pod.verify()?;
println!("id: {}", pod.id()); println!("id: {}", pod.id());

View file

@ -1,4 +1,4 @@
use std::{any::Any, collections::HashMap}; use std::collections::HashMap;
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
use itertools::Itertools; use itertools::Itertools;
@ -101,13 +101,6 @@ impl Pod for SignedPod {
.collect() .collect()
} }
fn into_any(self: Box<Self>) -> Box<dyn Any> {
self
}
fn as_any(&self) -> &dyn Any {
self
}
fn serialized_proof(&self) -> String { fn serialized_proof(&self) -> String {
let mut buffer = Vec::new(); let mut buffer = Vec::new();
use plonky2::util::serialization::Write; use plonky2::util::serialization::Write;
@ -118,7 +111,7 @@ impl Pod for SignedPod {
#[cfg(test)] #[cfg(test)]
pub mod tests { pub mod tests {
use std::iter; use std::{any::Any, iter};
use plonky2::field::types::Field; use plonky2::field::types::Field;
@ -140,7 +133,7 @@ pub mod tests {
let sk = SecretKey::new_rand(); let sk = SecretKey::new_rand();
let mut signer = Signer(sk); let mut signer = Signer(sk);
let pod = pod.sign(&mut signer).unwrap(); let pod = pod.sign(&mut signer).unwrap();
let pod = pod.pod.into_any().downcast::<SignedPod>().unwrap(); let pod = (pod.pod as Box<dyn Any>).downcast::<SignedPod>().unwrap();
pod.verify()?; pod.verify()?;
println!("id: {}", pod.id()); println!("id: {}", pod.id());

View file

@ -1,4 +1,5 @@
#![allow(clippy::get_first)] #![allow(clippy::get_first)]
#![feature(trait_upcasting)]
pub mod backends; pub mod backends;
pub mod constants; pub mod constants;

View file

@ -654,7 +654,7 @@ impl Params {
} }
} }
pub trait Pod: fmt::Debug + DynClone { pub trait Pod: fmt::Debug + DynClone + Any {
fn verify(&self) -> Result<()>; fn verify(&self) -> Result<()>;
fn id(&self) -> PodId; fn id(&self) -> PodId;
fn pub_statements(&self) -> Vec<Statement>; fn pub_statements(&self) -> Vec<Statement>;
@ -668,9 +668,6 @@ pub trait Pod: fmt::Debug + DynClone {
}) })
.collect() .collect()
} }
// Used for downcasting
fn into_any(self: Box<Self>) -> Box<dyn Any>;
fn as_any(&self) -> &dyn Any;
// Front-end Pods keep references to middleware Pods. Most of the // Front-end Pods keep references to middleware Pods. Most of the
// middleware data can be derived directly from front-end data, but the // middleware data can be derived directly from front-end data, but the
// "proof" data is only created at the point of proving/signing, and // "proof" data is only created at the point of proving/signing, and
@ -704,12 +701,6 @@ impl Pod for NonePod {
fn pub_statements(&self) -> Vec<Statement> { fn pub_statements(&self) -> Vec<Statement> {
Vec::new() Vec::new()
} }
fn into_any(self: Box<Self>) -> Box<dyn Any> {
self
}
fn as_any(&self) -> &dyn Any {
self
}
fn serialized_proof(&self) -> String { fn serialized_proof(&self) -> String {
"".to_string() "".to_string()
} }