casper-node 2.0.3

The Casper blockchain node
Documentation
use async_trait::async_trait;

use casper_types::{FinalitySignature, FinalitySignatureId, FinalitySignatureV2};

use crate::{
    components::gossiper::{GossipItem, GossipTarget, Gossiper, ItemProvider, LargeGossipItem},
    effect::{requests::StorageRequest, EffectBuilder},
};

impl GossipItem for FinalitySignatureV2 {
    type Id = Box<FinalitySignatureId>;

    const ID_IS_COMPLETE_ITEM: bool = false;
    const REQUIRES_GOSSIP_RECEIVED_ANNOUNCEMENT: bool = true;

    fn gossip_id(&self) -> Self::Id {
        Box::new(FinalitySignatureId::new(
            *self.block_hash(),
            self.era_id(),
            self.public_key().clone(),
        ))
    }

    fn gossip_target(&self) -> GossipTarget {
        GossipTarget::Mixed(self.era_id())
    }
}

impl LargeGossipItem for FinalitySignatureV2 {}

#[async_trait]
impl ItemProvider<FinalitySignatureV2>
    for Gossiper<{ FinalitySignatureV2::ID_IS_COMPLETE_ITEM }, FinalitySignatureV2>
{
    async fn is_stored<REv: From<StorageRequest> + Send>(
        effect_builder: EffectBuilder<REv>,
        item_id: Box<FinalitySignatureId>,
    ) -> bool {
        effect_builder.is_finality_signature_stored(item_id).await
    }

    async fn get_from_storage<REv: From<StorageRequest> + Send>(
        effect_builder: EffectBuilder<REv>,
        item_id: Box<FinalitySignatureId>,
    ) -> Option<Box<FinalitySignatureV2>> {
        if let Some(FinalitySignature::V2(sig)) = effect_builder
            .get_finality_signature_from_storage(item_id)
            .await
        {
            Some(Box::new(sig))
        } else {
            None
        }
    }
}