use crate::{
helpers::memory::{MemoryMap, TransactionMemory, TransitionMemory},
BlockStorage,
ConfirmedTxType,
TransactionStore,
TransitionStore,
};
use console::{account::Signature, prelude::*};
use ledger_block::{Header, Ratify};
use ledger_coinbase::{CoinbaseSolution, PuzzleCommitment};
#[derive(Clone)]
pub struct BlockMemory<N: Network> {
state_root_map: MemoryMap<u32, N::StateRoot>,
reverse_state_root_map: MemoryMap<N::StateRoot, u32>,
id_map: MemoryMap<u32, N::BlockHash>,
reverse_id_map: MemoryMap<N::BlockHash, u32>,
header_map: MemoryMap<N::BlockHash, Header<N>>,
transactions_map: MemoryMap<N::BlockHash, Vec<N::TransactionID>>,
confirmed_transactions_map: MemoryMap<N::TransactionID, (N::BlockHash, ConfirmedTxType, Vec<u8>)>,
transaction_store: TransactionStore<N, TransactionMemory<N>>,
ratifications_map: MemoryMap<N::BlockHash, Vec<Ratify<N>>>,
coinbase_solution_map: MemoryMap<N::BlockHash, Option<CoinbaseSolution<N>>>,
coinbase_puzzle_commitment_map: MemoryMap<PuzzleCommitment<N>, u32>,
signature_map: MemoryMap<N::BlockHash, Signature<N>>,
}
#[rustfmt::skip]
impl<N: Network> BlockStorage<N> for BlockMemory<N> {
type StateRootMap = MemoryMap<u32, N::StateRoot>;
type ReverseStateRootMap = MemoryMap<N::StateRoot, u32>;
type IDMap = MemoryMap<u32, N::BlockHash>;
type ReverseIDMap = MemoryMap<N::BlockHash, u32>;
type HeaderMap = MemoryMap<N::BlockHash, Header<N>>;
type TransactionsMap = MemoryMap<N::BlockHash, Vec<N::TransactionID>>;
type ConfirmedTransactionsMap = MemoryMap<N::TransactionID, (N::BlockHash, ConfirmedTxType, Vec<u8>)>;
type TransactionStorage = TransactionMemory<N>;
type TransitionStorage = TransitionMemory<N>;
type RatificationsMap = MemoryMap<N::BlockHash, Vec<Ratify<N>>>;
type CoinbaseSolutionMap = MemoryMap<N::BlockHash, Option<CoinbaseSolution<N>>>;
type CoinbasePuzzleCommitmentMap = MemoryMap<PuzzleCommitment<N>, u32>;
type SignatureMap = MemoryMap<N::BlockHash, Signature<N>>;
fn open(dev: Option<u16>) -> Result<Self> {
let transition_store = TransitionStore::<N, TransitionMemory<N>>::open(dev)?;
let transaction_store = TransactionStore::<N, TransactionMemory<N>>::open(transition_store)?;
Ok(Self {
state_root_map: MemoryMap::default(),
reverse_state_root_map: MemoryMap::default(),
id_map: MemoryMap::default(),
reverse_id_map: MemoryMap::default(),
header_map: MemoryMap::default(),
transactions_map: MemoryMap::default(),
confirmed_transactions_map: MemoryMap::default(),
transaction_store,
ratifications_map: MemoryMap::default(),
coinbase_solution_map: MemoryMap::default(),
coinbase_puzzle_commitment_map: MemoryMap::default(),
signature_map: MemoryMap::default(),
})
}
fn state_root_map(&self) -> &Self::StateRootMap {
&self.state_root_map
}
fn reverse_state_root_map(&self) -> &Self::ReverseStateRootMap {
&self.reverse_state_root_map
}
fn id_map(&self) -> &Self::IDMap {
&self.id_map
}
fn reverse_id_map(&self) -> &Self::ReverseIDMap {
&self.reverse_id_map
}
fn header_map(&self) -> &Self::HeaderMap {
&self.header_map
}
fn transactions_map(&self) -> &Self::TransactionsMap {
&self.transactions_map
}
fn confirmed_transactions_map(&self) -> &Self::ConfirmedTransactionsMap {
&self.confirmed_transactions_map
}
fn transaction_store(&self) -> &TransactionStore<N, Self::TransactionStorage> {
&self.transaction_store
}
fn ratifications_map(&self) -> &Self::RatificationsMap {
&self.ratifications_map
}
fn coinbase_solution_map(&self) -> &Self::CoinbaseSolutionMap {
&self.coinbase_solution_map
}
fn coinbase_puzzle_commitment_map(&self) -> &Self::CoinbasePuzzleCommitmentMap {
&self.coinbase_puzzle_commitment_map
}
fn signature_map(&self) -> &Self::SignatureMap {
&self.signature_map
}
}