hyli-model 0.15.0

Hyli datamodel
Documentation
use blst::min_pk::Signature as BlstSignature;
use serde::{Deserialize, Serialize};
use std::fmt::{self, Display};

use crate::{staking::*, *};

#[derive(
    Serialize,
    Deserialize,
    Clone,
    borsh::BorshSerialize,
    borsh::BorshDeserialize,
    PartialEq,
    Eq,
    Hash,
    Ord,
    PartialOrd,
)]
pub struct Signed<T: borsh::BorshSerialize, V: borsh::BorshSerialize> {
    pub msg: T,
    pub signature: V,
}

#[derive(
    Serialize,
    Deserialize,
    Clone,
    borsh::BorshSerialize,
    borsh::BorshDeserialize,
    Default,
    PartialEq,
    Eq,
    Hash,
    Ord,
    PartialOrd,
)]
pub struct Signature(pub Vec<u8>);

#[derive(
    Debug,
    Serialize,
    Deserialize,
    Clone,
    borsh::BorshSerialize,
    borsh::BorshDeserialize,
    PartialEq,
    Eq,
    Hash,
    Ord,
    PartialOrd,
)]
pub struct ValidatorSignature {
    pub signature: Signature,
    pub validator: ValidatorPublicKey,
}
pub type SignedByValidator<T> = Signed<T, ValidatorSignature>;

#[derive(
    Debug,
    Default,
    Serialize,
    Deserialize,
    Clone,
    borsh::BorshSerialize,
    borsh::BorshDeserialize,
    PartialEq,
    Eq,
    Hash,
    Ord,
    PartialOrd,
)]
pub struct AggregateSignature {
    pub signature: Signature,
    pub validators: Vec<ValidatorPublicKey>,
}

impl From<BlstSignature> for Signature {
    fn from(sig: BlstSignature) -> Self {
        Signature(sig.compress().as_slice().to_vec())
    }
}

impl fmt::Debug for Signature {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_tuple("Signature")
            .field(&hex::encode(&self.0))
            .finish()
    }
}

impl fmt::Display for Signature {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(
            f,
            "{}",
            &hex::encode(self.0.get(..HASH_DISPLAY_SIZE).unwrap_or(&self.0))
        )
    }
}

impl<T: Display + borsh::BorshSerialize> Display for SignedByValidator<T> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        _ = write!(f, " --> from validator {}", self.signature.validator);
        write!(f, "")
    }
}

impl<T: std::fmt::Debug + borsh::BorshSerialize> std::fmt::Debug for SignedByValidator<T> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_struct("Signed")
            .field("msg", &self.msg)
            .field("validator", &format!("{}", self.signature.validator))
            .field("sig", &{
                format!("{}...", {
                    let mut hash = hex::encode(&self.signature.signature.0);
                    hash.truncate(4);
                    hash
                })
            })
            .finish()
    }
}