use exonum::{
crypto::PublicKey,
helpers::Round,
merkledb::{
access::{Access, AccessExt, RawAccessMut},
ListIndex, MapIndex,
},
messages::Verified,
};
use std::iter;
use crate::messages::{Connect, Message};
const CONSENSUS_MESSAGES_CACHE: &str = "core.consensus_messages_cache";
const CONSENSUS_ROUND: &str = "core.consensus_round";
const PEERS_CACHE: &str = "core.peers_cache";
#[derive(Debug)]
pub(crate) struct NodeSchema<T> {
access: T,
}
impl<T: Access> NodeSchema<T> {
pub fn new(access: T) -> Self {
Self { access }
}
pub fn peers_cache(&self) -> MapIndex<T::Base, PublicKey, Verified<Connect>> {
self.access.get_map(PEERS_CACHE)
}
pub fn consensus_messages_cache(&self) -> ListIndex<T::Base, Message> {
self.access.get_list(CONSENSUS_MESSAGES_CACHE)
}
pub fn consensus_round(&self) -> Round {
self.access
.get_entry(CONSENSUS_ROUND)
.get()
.unwrap_or_else(Round::first)
}
}
impl<T: Access> NodeSchema<T>
where
T::Base: RawAccessMut,
{
pub fn set_consensus_round(&mut self, round: Round) {
self.access.get_entry(CONSENSUS_ROUND).set(round);
}
pub fn save_messages<I>(&mut self, round: Round, iter: I)
where
I: IntoIterator<Item = Message>,
{
self.consensus_messages_cache().extend(iter);
self.set_consensus_round(round);
}
pub fn save_message<M: Into<Message>>(&mut self, round: Round, message: M) {
self.save_messages(round, iter::once(message.into()));
}
pub fn save_peer(&mut self, pubkey: &PublicKey, peer: Verified<Connect>) {
self.peers_cache().put(pubkey, peer);
}
pub fn remove_peer_with_pubkey(&mut self, key: &PublicKey) {
self.peers_cache().remove(key);
}
}