diff --git a/db/src/block_provider.rs b/db/src/block_provider.rs index 73fc8b36..bd3d0140 100644 --- a/db/src/block_provider.rs +++ b/db/src/block_provider.rs @@ -33,8 +33,3 @@ pub trait BlockProvider: BlockHeaderProvider { /// returns all transactions in the block by block reference (number/hash) fn block_transactions(&self, block_ref: BlockRef) -> Vec; } - -pub trait AsBlockHeaderProvider { - /// returns `BlockHeaderProvider` - fn as_block_header_provider(&self) -> &BlockHeaderProvider; -} diff --git a/db/src/lib.rs b/db/src/lib.rs index 6d8ed2cb..eaf73d6a 100644 --- a/db/src/lib.rs +++ b/db/src/lib.rs @@ -67,13 +67,13 @@ impl BlockLocation { pub type SharedStore = std::sync::Arc; pub use best_block::BestBlock; -pub use storage::{Storage, Store}; +pub use storage::{Storage, Store, AsSubstore}; pub use error::{Error, ConsistencyError}; 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 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_header::IndexedBlockHeader; pub use indexed_transaction::IndexedTransaction; diff --git a/db/src/storage.rs b/db/src/storage.rs index d6efc175..377ca495 100644 --- a/db/src/storage.rs +++ b/db/src/storage.rs @@ -15,7 +15,7 @@ use lru_cache::LruCache; use transaction_meta::TransactionMeta; use error::{Error, ConsistencyError, MetaError}; use update_context::UpdateContext; -use block_provider::{BlockProvider, BlockHeaderProvider, AsBlockHeaderProvider}; +use block_provider::{BlockProvider, BlockHeaderProvider}; use transaction_provider::TransactionProvider; use transaction_meta_provider::TransactionMetaProvider; use block_stapler::{BlockStapler, BlockInsertedChain, Reorganization}; @@ -43,7 +43,7 @@ const MAX_FORK_ROUTE_PRESET: usize = 2048; const TRANSACTION_CACHE_SIZE: usize = 524288; /// Blockchain storage interface -pub trait Store : BlockProvider + BlockStapler + TransactionProvider + TransactionMetaProvider + AsBlockHeaderProvider { +pub trait Store: AsSubstore { /// get best block fn best_block(&self) -> Option; @@ -51,6 +51,41 @@ pub trait Store : BlockProvider + BlockStapler + TransactionProvider + Transacti fn best_header(&self) -> Option; } +/// Allows casting Arc 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 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 pub struct Storage { 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 { fn block_number(&self, hash: &H256) -> Option { self.get(COL_BLOCK_NUMBERS, &**hash) diff --git a/db/src/test_storage.rs b/db/src/test_storage.rs index d95af684..b76e08ff 100644 --- a/db/src/test_storage.rs +++ b/db/src/test_storage.rs @@ -2,8 +2,8 @@ use super::{ BlockRef, Store, Error, BestBlock, BlockLocation, BlockInsertedChain, BlockProvider, - BlockStapler, TransactionMetaProvider, TransactionProvider, AsTransactionProvider, - IndexedBlock, BlockHeaderProvider, AsBlockHeaderProvider, + BlockStapler, TransactionMetaProvider, TransactionProvider, + IndexedBlock, BlockHeaderProvider, }; use chain::{self, Block}; 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 { fn block_number(&self, hash: &H256) -> Option { 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 { // just spawns new meta so far, use real store for proper tests fn transaction_meta(&self, hash: &H256) -> Option { diff --git a/db/src/transaction_provider.rs b/db/src/transaction_provider.rs index 2d51269e..f7c60ef8 100644 --- a/db/src/transaction_provider.rs +++ b/db/src/transaction_provider.rs @@ -14,12 +14,6 @@ pub trait TransactionProvider { /// resolves serialized transaction info by transaction hash fn transaction(&self, hash: &H256) -> Option; - -} - -pub trait AsTransactionProvider { - /// returns `TransactionProvider` - fn as_transaction_provider(&self) -> &TransactionProvider; } /// During transaction the only part of old transaction that we need is `TransactionOutput`. diff --git a/miner/src/fee.rs b/miner/src/fee.rs index c2045096..5a5c7e81 100644 --- a/miner/src/fee.rs +++ b/miner/src/fee.rs @@ -19,7 +19,7 @@ pub fn transaction_fee_rate(store: &TransactionProvider, transaction: &Transacti #[cfg(test)] mod tests { use std::sync::Arc; - use db::{TestStorage, AsTransactionProvider}; + use db::{TestStorage, AsSubstore}; use test_data; use super::*;