#[cfg(feature = "serde_serialization")]
use crate::serialization::{digest_deserialize, digest_serialize};
use crate::{node_label::NodeLabel, storage::types::AkdValue, Direction, Node, ARITY};
use winter_crypto::Hasher;
#[derive(Debug, PartialEq, Eq)]
#[cfg_attr(
feature = "serde_serialization",
derive(serde::Deserialize, serde::Serialize)
)]
#[cfg_attr(feature = "serde_serialization", serde(bound = ""))]
pub struct LayerProof<H: Hasher> {
pub label: NodeLabel,
pub siblings: [Node<H>; ARITY - 1],
pub direction: Direction,
}
impl<H: Hasher> Clone for LayerProof<H> {
fn clone(&self) -> Self {
Self {
label: self.label,
siblings: self.siblings,
direction: self.direction,
}
}
}
#[derive(Debug, PartialEq, Eq)]
#[cfg_attr(
feature = "serde_serialization",
derive(serde::Deserialize, serde::Serialize)
)]
#[cfg_attr(feature = "serde_serialization", serde(bound = ""))]
pub struct MembershipProof<H: Hasher> {
pub label: NodeLabel,
#[cfg_attr(
feature = "serde_serialization",
serde(serialize_with = "digest_serialize")
)]
#[cfg_attr(
feature = "serde_serialization",
serde(deserialize_with = "digest_deserialize")
)]
pub hash_val: H::Digest,
pub layer_proofs: Vec<LayerProof<H>>,
}
impl<H: Hasher> Clone for MembershipProof<H> {
fn clone(&self) -> Self {
Self {
label: self.label,
hash_val: self.hash_val,
layer_proofs: self.layer_proofs.clone(),
}
}
}
#[derive(Debug, PartialEq, Eq)]
#[cfg_attr(
feature = "serde_serialization",
derive(serde::Deserialize, serde::Serialize)
)]
#[cfg_attr(feature = "serde_serialization", serde(bound = ""))]
pub struct NonMembershipProof<H: Hasher> {
pub label: NodeLabel,
pub longest_prefix: NodeLabel,
pub longest_prefix_children: [Node<H>; ARITY],
pub longest_prefix_membership_proof: MembershipProof<H>,
}
impl<H: Hasher> Clone for NonMembershipProof<H> {
fn clone(&self) -> Self {
Self {
label: self.label,
longest_prefix: self.longest_prefix,
longest_prefix_children: self.longest_prefix_children,
longest_prefix_membership_proof: self.longest_prefix_membership_proof.clone(),
}
}
}
#[derive(Debug, PartialEq, Eq)]
#[cfg_attr(
feature = "serde_serialization",
derive(serde::Deserialize, serde::Serialize)
)]
#[cfg_attr(feature = "serde_serialization", serde(bound = ""))]
pub struct AppendOnlyProof<H: Hasher> {
pub proofs: Vec<SingleAppendOnlyProof<H>>,
pub epochs: Vec<u64>,
}
#[derive(Debug, PartialEq, Eq)]
#[cfg_attr(
feature = "serde_serialization",
derive(serde::Deserialize, serde::Serialize)
)]
#[cfg_attr(feature = "serde_serialization", serde(bound = ""))]
pub struct SingleAppendOnlyProof<H: Hasher> {
pub inserted: Vec<Node<H>>,
pub unchanged_nodes: Vec<Node<H>>,
}
impl<H: Hasher> Clone for SingleAppendOnlyProof<H> {
fn clone(&self) -> Self {
Self {
inserted: self.inserted.clone(),
unchanged_nodes: self.unchanged_nodes.clone(),
}
}
}
#[derive(Debug, PartialEq, Eq)]
#[cfg_attr(
feature = "serde_serialization",
derive(serde::Deserialize, serde::Serialize)
)]
#[cfg_attr(feature = "serde_serialization", serde(bound = ""))]
pub struct LookupProof<H: Hasher> {
pub epoch: u64,
pub plaintext_value: AkdValue,
pub version: u64,
pub existence_vrf_proof: Vec<u8>,
pub existence_proof: MembershipProof<H>,
pub marker_vrf_proof: Vec<u8>,
pub marker_proof: MembershipProof<H>,
pub freshness_vrf_proof: Vec<u8>,
pub freshness_proof: NonMembershipProof<H>,
pub commitment_proof: Vec<u8>,
}
impl<H: Hasher> Clone for LookupProof<H> {
fn clone(&self) -> Self {
Self {
epoch: self.epoch,
plaintext_value: self.plaintext_value.clone(),
version: self.version,
existence_proof: self.existence_proof.clone(),
marker_proof: self.marker_proof.clone(),
freshness_proof: self.freshness_proof.clone(),
existence_vrf_proof: self.existence_vrf_proof.clone(),
marker_vrf_proof: self.marker_vrf_proof.clone(),
freshness_vrf_proof: self.freshness_vrf_proof.clone(),
commitment_proof: self.commitment_proof.clone(),
}
}
}
#[derive(Debug, PartialEq, Eq)]
#[cfg_attr(
feature = "serde_serialization",
derive(serde::Deserialize, serde::Serialize)
)]
#[cfg_attr(feature = "serde_serialization", serde(bound = ""))]
pub struct HistoryProof<H: Hasher> {
pub update_proofs: Vec<UpdateProof<H>>,
pub next_few_vrf_proofs: Vec<Vec<u8>>,
pub non_existence_of_next_few: Vec<NonMembershipProof<H>>,
pub future_marker_vrf_proofs: Vec<Vec<u8>>,
pub non_existence_of_future_markers: Vec<NonMembershipProof<H>>,
}
impl<H: Hasher> Clone for HistoryProof<H> {
fn clone(&self) -> Self {
Self {
update_proofs: self.update_proofs.clone(),
next_few_vrf_proofs: self.next_few_vrf_proofs.clone(),
non_existence_of_next_few: self.non_existence_of_next_few.clone(),
future_marker_vrf_proofs: self.future_marker_vrf_proofs.clone(),
non_existence_of_future_markers: self.non_existence_of_future_markers.clone(),
}
}
}
#[derive(Debug, PartialEq, Eq)]
#[cfg_attr(
feature = "serde_serialization",
derive(serde::Deserialize, serde::Serialize)
)]
#[cfg_attr(feature = "serde_serialization", serde(bound = ""))]
pub struct UpdateProof<H: Hasher> {
pub epoch: u64,
pub version: u64,
pub plaintext_value: AkdValue,
pub existence_vrf_proof: Vec<u8>,
pub existence_at_ep: MembershipProof<H>,
pub previous_version_vrf_proof: Option<Vec<u8>>,
pub previous_version_stale_at_ep: Option<MembershipProof<H>>,
pub commitment_proof: Vec<u8>,
}
impl<H: Hasher> Clone for UpdateProof<H> {
fn clone(&self) -> Self {
Self {
epoch: self.epoch,
version: self.version,
plaintext_value: self.plaintext_value.clone(),
existence_vrf_proof: self.existence_vrf_proof.clone(),
existence_at_ep: self.existence_at_ep.clone(),
previous_version_vrf_proof: self.previous_version_vrf_proof.clone(),
previous_version_stale_at_ep: self.previous_version_stale_at_ep.clone(),
commitment_proof: self.commitment_proof.clone(),
}
}
}
#[derive(Debug, PartialEq, Eq)]
#[cfg_attr(
feature = "serde_serialization",
derive(serde::Deserialize, serde::Serialize)
)]
#[cfg_attr(feature = "serde_serialization", serde(bound = ""))]
pub struct VerifyResult {
pub epoch: u64,
pub version: u64,
pub value: AkdValue,
}