From e1775d8578364db773681614983dd2cce7c62d94 Mon Sep 17 00:00:00 2001 From: arnaucube Date: Tue, 24 Jun 2025 17:41:46 +0200 Subject: [PATCH] add eq & partial_eq for RecursivePod, Pod traits and VDSet struct (for usage from introduction-pods) (#309) * add eq & partial_eq for VDSet (for usage from introduction-pods) * add eq & partial_eq impls for Pod & RecursivePod traits --- src/backends/plonky2/basetypes.rs | 9 ++++++ src/backends/plonky2/emptypod.rs | 14 +++++++++- src/backends/plonky2/mainpod/mod.rs | 13 ++++++++- src/backends/plonky2/mainpod/statement.rs | 2 ++ src/backends/plonky2/mock/emptypod.rs | 15 +++++++++- src/backends/plonky2/mock/mainpod.rs | 28 ++++++++++++++++++- src/backends/plonky2/mock/signedpod.rs | 15 ++++++++-- src/backends/plonky2/primitives/ec/schnorr.rs | 2 +- src/backends/plonky2/signedpod.rs | 15 ++++++++-- src/middleware/mod.rs | 17 +++++++++++ 10 files changed, 121 insertions(+), 9 deletions(-) diff --git a/src/backends/plonky2/basetypes.rs b/src/backends/plonky2/basetypes.rs index 3a09cff..d4c8f9b 100644 --- a/src/backends/plonky2/basetypes.rs +++ b/src/backends/plonky2/basetypes.rs @@ -77,6 +77,15 @@ pub struct VDSet { vds_hashes: Vec, } +impl PartialEq for VDSet { + fn eq(&self, other: &Self) -> bool { + self.root == other.root + && self.tree_depth == other.tree_depth + && self.vds_hashes == other.vds_hashes + } +} +impl Eq for VDSet {} + impl VDSet { fn new_from_vds_hashes(tree_depth: usize, mut vds_hashes: Vec) -> Result { // before using the hash values, sort them, so that each set of diff --git a/src/backends/plonky2/emptypod.rs b/src/backends/plonky2/emptypod.rs index 81bd11d..ce454a1 100644 --- a/src/backends/plonky2/emptypod.rs +++ b/src/backends/plonky2/emptypod.rs @@ -1,4 +1,5 @@ use std::{ + any::Any, collections::HashMap, sync::{LazyLock, Mutex}, }; @@ -73,7 +74,7 @@ impl EmptyPodVerifyTarget { } } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct EmptyPod { params: Params, id: PodId, @@ -192,6 +193,17 @@ impl Pod for EmptyPod { }) .expect("serialization to json") } + + fn as_any(&self) -> &dyn Any { + self + } + fn equals(&self, other: &dyn Pod) -> bool { + if let Some(other) = other.as_any().downcast_ref::() { + self == other + } else { + false + } + } } impl RecursivePod for EmptyPod { diff --git a/src/backends/plonky2/mainpod/mod.rs b/src/backends/plonky2/mainpod/mod.rs index a31a11f..457b397 100644 --- a/src/backends/plonky2/mainpod/mod.rs +++ b/src/backends/plonky2/mainpod/mod.rs @@ -561,7 +561,7 @@ impl PodProver for Prover { } } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct MainPod { params: Params, id: PodId, @@ -676,6 +676,17 @@ impl Pod for MainPod { }) .expect("serialization to json") } + + fn as_any(&self) -> &dyn Any { + self + } + fn equals(&self, other: &dyn Pod) -> bool { + if let Some(other) = other.as_any().downcast_ref::() { + self == other + } else { + false + } + } } impl RecursivePod for MainPod { diff --git a/src/backends/plonky2/mainpod/statement.rs b/src/backends/plonky2/mainpod/statement.rs index 60c7c76..54b4faa 100644 --- a/src/backends/plonky2/mainpod/statement.rs +++ b/src/backends/plonky2/mainpod/statement.rs @@ -10,6 +10,8 @@ use crate::{ #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Statement(pub Predicate, pub Vec); +impl Eq for Statement {} + impl Statement { pub fn is_none(&self) -> bool { self.0 == Predicate::Native(NativePredicate::None) diff --git a/src/backends/plonky2/mock/emptypod.rs b/src/backends/plonky2/mock/emptypod.rs index 0b72c68..0525147 100644 --- a/src/backends/plonky2/mock/emptypod.rs +++ b/src/backends/plonky2/mock/emptypod.rs @@ -1,3 +1,5 @@ +use std::any::Any; + use itertools::Itertools; use crate::{ @@ -12,7 +14,7 @@ use crate::{ }, }; -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct MockEmptyPod { params: Params, id: PodId, @@ -67,6 +69,17 @@ impl Pod for MockEmptyPod { fn serialize_data(&self) -> serde_json::Value { serde_json::Value::Null } + + fn as_any(&self) -> &dyn Any { + self + } + fn equals(&self, other: &dyn Pod) -> bool { + if let Some(other) = other.as_any().downcast_ref::() { + self == other + } else { + false + } + } } impl RecursivePod for MockEmptyPod { diff --git a/src/backends/plonky2/mock/mainpod.rs b/src/backends/plonky2/mock/mainpod.rs index 016d298..2b5389b 100644 --- a/src/backends/plonky2/mock/mainpod.rs +++ b/src/backends/plonky2/mock/mainpod.rs @@ -2,7 +2,7 @@ // MainPod // -use std::{fmt, iter}; +use std::{any::Any, fmt, iter}; use itertools::Itertools; use serde::{Deserialize, Serialize}; @@ -56,6 +56,21 @@ pub struct MockMainPod { merkle_proofs_containers: Vec, } +impl PartialEq for MockMainPod { + fn eq(&self, other: &Self) -> bool { + self.params == other.params + && self.id == other.id + && self.vd_set == other.vd_set + && self.input_signed_pods == other.input_signed_pods + && self.input_recursive_pods == other.input_recursive_pods + && self.statements == other.statements + && self.operations == other.operations + && self.public_statements == other.public_statements + && self.merkle_proofs_containers == other.merkle_proofs_containers + } +} +impl Eq for MockMainPod {} + impl fmt::Display for MockMainPod { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { writeln!(f, "MockMainPod ({}):", self.id)?; @@ -365,6 +380,17 @@ impl Pod for MockMainPod { }) .expect("serialization to json") } + + fn as_any(&self) -> &dyn Any { + self + } + fn equals(&self, other: &dyn Pod) -> bool { + if let Some(other) = other.as_any().downcast_ref::() { + self == other + } else { + false + } + } } impl RecursivePod for MockMainPod { diff --git a/src/backends/plonky2/mock/signedpod.rs b/src/backends/plonky2/mock/signedpod.rs index c42f6e0..26dcd63 100644 --- a/src/backends/plonky2/mock/signedpod.rs +++ b/src/backends/plonky2/mock/signedpod.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use std::{any::Any, collections::HashMap}; use itertools::Itertools; use serde::{Deserialize, Serialize}; @@ -45,7 +45,7 @@ impl PodSigner for MockSigner { } } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct MockSignedPod { id: PodId, signature: String, @@ -158,6 +158,17 @@ impl Pod for MockSignedPod { }) .expect("serialization to json") } + + fn as_any(&self) -> &dyn Any { + self + } + fn equals(&self, other: &dyn Pod) -> bool { + if let Some(other) = other.as_any().downcast_ref::() { + self == other + } else { + false + } + } } #[cfg(test)] diff --git a/src/backends/plonky2/primitives/ec/schnorr.rs b/src/backends/plonky2/primitives/ec/schnorr.rs index 1e76802..054eca6 100644 --- a/src/backends/plonky2/primitives/ec/schnorr.rs +++ b/src/backends/plonky2/primitives/ec/schnorr.rs @@ -35,7 +35,7 @@ use crate::{ }; /// Schnorr signature over ecGFp5. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Signature { pub s: BigUint, pub e: BigUint, diff --git a/src/backends/plonky2/signedpod.rs b/src/backends/plonky2/signedpod.rs index 024705f..0f59e33 100644 --- a/src/backends/plonky2/signedpod.rs +++ b/src/backends/plonky2/signedpod.rs @@ -1,4 +1,4 @@ -use std::{collections::HashMap, sync::LazyLock}; +use std::{any::Any, collections::HashMap, sync::LazyLock}; use itertools::Itertools; use num_bigint::{BigUint, RandBigInt}; @@ -67,7 +67,7 @@ impl PodSigner for Signer { } } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct SignedPod { pub id: PodId, pub signature: Signature, @@ -204,6 +204,17 @@ impl Pod for SignedPod { }) .expect("serialization to json") } + + fn as_any(&self) -> &dyn Any { + self + } + fn equals(&self, other: &dyn Pod) -> bool { + if let Some(other) = other.as_any().downcast_ref::() { + self == other + } else { + false + } + } } #[cfg(test)] diff --git a/src/middleware/mod.rs b/src/middleware/mod.rs index 048c028..2e1537e 100644 --- a/src/middleware/mod.rs +++ b/src/middleware/mod.rs @@ -805,7 +805,17 @@ pub trait Pod: fmt::Debug + DynClone + Any { }) .collect() } + + fn as_any(&self) -> &dyn Any; + fn equals(&self, other: &dyn Pod) -> bool; } +impl PartialEq for Box { + fn eq(&self, other: &Self) -> bool { + self.equals(&**other) + } +} + +impl Eq for Box {} // impl Clone for Box dyn_clone::clone_trait_object!(Pod); @@ -828,6 +838,13 @@ pub trait RecursivePod: Pod { where Self: Sized; } +impl PartialEq for Box { + fn eq(&self, other: &Self) -> bool { + self.equals(&**other) + } +} + +impl Eq for Box {} // impl Clone for Box dyn_clone::clone_trait_object!(RecursivePod);