AsSubstore trait
This commit is contained in:
parent
cfc90b79aa
commit
087c314fd1
|
@ -33,8 +33,3 @@ pub trait BlockProvider: BlockHeaderProvider {
|
||||||
/// returns all transactions in the block by block reference (number/hash)
|
/// returns all transactions in the block by block reference (number/hash)
|
||||||
fn block_transactions(&self, block_ref: BlockRef) -> Vec<chain::Transaction>;
|
fn block_transactions(&self, block_ref: BlockRef) -> Vec<chain::Transaction>;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait AsBlockHeaderProvider {
|
|
||||||
/// returns `BlockHeaderProvider`
|
|
||||||
fn as_block_header_provider(&self) -> &BlockHeaderProvider;
|
|
||||||
}
|
|
||||||
|
|
|
@ -67,13 +67,13 @@ impl BlockLocation {
|
||||||
pub type SharedStore = std::sync::Arc<Store + Send + Sync>;
|
pub type SharedStore = std::sync::Arc<Store + Send + Sync>;
|
||||||
|
|
||||||
pub use best_block::BestBlock;
|
pub use best_block::BestBlock;
|
||||||
pub use storage::{Storage, Store};
|
pub use storage::{Storage, Store, AsSubstore};
|
||||||
pub use error::{Error, ConsistencyError};
|
pub use error::{Error, ConsistencyError};
|
||||||
pub use kvdb::Database;
|
pub use kvdb::Database;
|
||||||
pub use transaction_provider::{TransactionProvider, AsTransactionProvider, PreviousTransactionOutputProvider};
|
pub use transaction_provider::{TransactionProvider, PreviousTransactionOutputProvider};
|
||||||
pub use transaction_meta_provider::TransactionMetaProvider;
|
pub use transaction_meta_provider::TransactionMetaProvider;
|
||||||
pub use block_stapler::{BlockStapler, BlockInsertedChain};
|
pub use block_stapler::{BlockStapler, BlockInsertedChain};
|
||||||
pub use block_provider::{BlockProvider, BlockHeaderProvider, AsBlockHeaderProvider};
|
pub use block_provider::{BlockProvider, BlockHeaderProvider};
|
||||||
pub use indexed_block::IndexedBlock;
|
pub use indexed_block::IndexedBlock;
|
||||||
pub use indexed_header::IndexedBlockHeader;
|
pub use indexed_header::IndexedBlockHeader;
|
||||||
pub use indexed_transaction::IndexedTransaction;
|
pub use indexed_transaction::IndexedTransaction;
|
||||||
|
|
|
@ -15,7 +15,7 @@ use lru_cache::LruCache;
|
||||||
use transaction_meta::TransactionMeta;
|
use transaction_meta::TransactionMeta;
|
||||||
use error::{Error, ConsistencyError, MetaError};
|
use error::{Error, ConsistencyError, MetaError};
|
||||||
use update_context::UpdateContext;
|
use update_context::UpdateContext;
|
||||||
use block_provider::{BlockProvider, BlockHeaderProvider, AsBlockHeaderProvider};
|
use block_provider::{BlockProvider, BlockHeaderProvider};
|
||||||
use transaction_provider::TransactionProvider;
|
use transaction_provider::TransactionProvider;
|
||||||
use transaction_meta_provider::TransactionMetaProvider;
|
use transaction_meta_provider::TransactionMetaProvider;
|
||||||
use block_stapler::{BlockStapler, BlockInsertedChain, Reorganization};
|
use block_stapler::{BlockStapler, BlockInsertedChain, Reorganization};
|
||||||
|
@ -43,7 +43,7 @@ const MAX_FORK_ROUTE_PRESET: usize = 2048;
|
||||||
const TRANSACTION_CACHE_SIZE: usize = 524288;
|
const TRANSACTION_CACHE_SIZE: usize = 524288;
|
||||||
|
|
||||||
/// Blockchain storage interface
|
/// Blockchain storage interface
|
||||||
pub trait Store : BlockProvider + BlockStapler + TransactionProvider + TransactionMetaProvider + AsBlockHeaderProvider {
|
pub trait Store: AsSubstore {
|
||||||
/// get best block
|
/// get best block
|
||||||
fn best_block(&self) -> Option<BestBlock>;
|
fn best_block(&self) -> Option<BestBlock>;
|
||||||
|
|
||||||
|
@ -51,6 +51,41 @@ pub trait Store : BlockProvider + BlockStapler + TransactionProvider + Transacti
|
||||||
fn best_header(&self) -> Option<chain::BlockHeader>;
|
fn best_header(&self) -> Option<chain::BlockHeader>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Allows casting Arc<Store> to reference to any substore type
|
||||||
|
pub trait AsSubstore: BlockProvider + BlockStapler + TransactionProvider + TransactionMetaProvider {
|
||||||
|
fn as_block_provider(&self) -> &BlockProvider;
|
||||||
|
|
||||||
|
fn as_block_header_provider(&self) -> &BlockHeaderProvider;
|
||||||
|
|
||||||
|
fn as_block_stapler(&self) -> &BlockStapler;
|
||||||
|
|
||||||
|
fn as_transaction_provider(&self) -> &TransactionProvider;
|
||||||
|
|
||||||
|
fn as_transaction_meta_provider(&self) -> &TransactionMetaProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> AsSubstore for T where T: BlockProvider + BlockStapler + TransactionProvider + TransactionMetaProvider {
|
||||||
|
fn as_block_provider(&self) -> &BlockProvider {
|
||||||
|
&*self
|
||||||
|
}
|
||||||
|
|
||||||
|
fn as_block_header_provider(&self) -> &BlockHeaderProvider {
|
||||||
|
&*self
|
||||||
|
}
|
||||||
|
|
||||||
|
fn as_block_stapler(&self) -> &BlockStapler {
|
||||||
|
&*self
|
||||||
|
}
|
||||||
|
|
||||||
|
fn as_transaction_provider(&self) -> &TransactionProvider {
|
||||||
|
&*self
|
||||||
|
}
|
||||||
|
|
||||||
|
fn as_transaction_meta_provider(&self) -> &TransactionMetaProvider {
|
||||||
|
&*self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Blockchain storage with rocksdb database
|
/// Blockchain storage with rocksdb database
|
||||||
pub struct Storage {
|
pub struct Storage {
|
||||||
database: Database,
|
database: Database,
|
||||||
|
@ -432,12 +467,6 @@ impl BlockHeaderProvider for Storage {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AsBlockHeaderProvider for Storage {
|
|
||||||
fn as_block_header_provider(&self) -> &BlockHeaderProvider {
|
|
||||||
&*self
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl BlockProvider for Storage {
|
impl BlockProvider for Storage {
|
||||||
fn block_number(&self, hash: &H256) -> Option<u32> {
|
fn block_number(&self, hash: &H256) -> Option<u32> {
|
||||||
self.get(COL_BLOCK_NUMBERS, &**hash)
|
self.get(COL_BLOCK_NUMBERS, &**hash)
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
BlockRef, Store, Error, BestBlock, BlockLocation, BlockInsertedChain, BlockProvider,
|
BlockRef, Store, Error, BestBlock, BlockLocation, BlockInsertedChain, BlockProvider,
|
||||||
BlockStapler, TransactionMetaProvider, TransactionProvider, AsTransactionProvider,
|
BlockStapler, TransactionMetaProvider, TransactionProvider,
|
||||||
IndexedBlock, BlockHeaderProvider, AsBlockHeaderProvider,
|
IndexedBlock, BlockHeaderProvider,
|
||||||
};
|
};
|
||||||
use chain::{self, Block};
|
use chain::{self, Block};
|
||||||
use primitives::hash::H256;
|
use primitives::hash::H256;
|
||||||
|
@ -84,12 +84,6 @@ impl BlockHeaderProvider for TestStorage {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AsBlockHeaderProvider for TestStorage {
|
|
||||||
fn as_block_header_provider(&self) -> &BlockHeaderProvider {
|
|
||||||
&*self
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl BlockProvider for TestStorage {
|
impl BlockProvider for TestStorage {
|
||||||
fn block_number(&self, hash: &H256) -> Option<u32> {
|
fn block_number(&self, hash: &H256) -> Option<u32> {
|
||||||
let data = self.data.read();
|
let data = self.data.read();
|
||||||
|
@ -192,12 +186,6 @@ impl TransactionProvider for TestStorage {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AsTransactionProvider for TestStorage {
|
|
||||||
fn as_transaction_provider(&self) -> &TransactionProvider {
|
|
||||||
&*self
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TransactionMetaProvider for TestStorage {
|
impl TransactionMetaProvider for TestStorage {
|
||||||
// just spawns new meta so far, use real store for proper tests
|
// just spawns new meta so far, use real store for proper tests
|
||||||
fn transaction_meta(&self, hash: &H256) -> Option<TransactionMeta> {
|
fn transaction_meta(&self, hash: &H256) -> Option<TransactionMeta> {
|
||||||
|
|
|
@ -14,12 +14,6 @@ pub trait TransactionProvider {
|
||||||
|
|
||||||
/// resolves serialized transaction info by transaction hash
|
/// resolves serialized transaction info by transaction hash
|
||||||
fn transaction(&self, hash: &H256) -> Option<chain::Transaction>;
|
fn transaction(&self, hash: &H256) -> Option<chain::Transaction>;
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait AsTransactionProvider {
|
|
||||||
/// returns `TransactionProvider`
|
|
||||||
fn as_transaction_provider(&self) -> &TransactionProvider;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// During transaction the only part of old transaction that we need is `TransactionOutput`.
|
/// During transaction the only part of old transaction that we need is `TransactionOutput`.
|
||||||
|
|
|
@ -19,7 +19,7 @@ pub fn transaction_fee_rate(store: &TransactionProvider, transaction: &Transacti
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use db::{TestStorage, AsTransactionProvider};
|
use db::{TestStorage, AsSubstore};
|
||||||
use test_data;
|
use test_data;
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue