casper_storage/
data_access_layer.rs

1use crate::global_state::{
2    error::Error as GlobalStateError,
3    state::{CommitProvider, StateProvider},
4};
5use casper_types::{execution::Effects, Digest};
6
7use crate::tracking_copy::TrackingCopy;
8
9mod addressable_entity;
10/// Auction provider.
11pub mod auction;
12/// Balance provider.
13pub mod balance;
14mod balance_hold;
15mod balance_identifier_purse;
16/// Bids provider.
17pub mod bids;
18mod block_global;
19/// Block rewards provider.
20pub mod block_rewards;
21mod contract;
22mod entry_points;
23/// Era validators provider.
24pub mod era_validators;
25mod execution_results_checksum;
26mod fee;
27mod flush;
28/// Forced undelegate provider.
29pub mod forced_undelegate;
30mod genesis;
31/// Handle fee provider.
32pub mod handle_fee;
33mod handle_refund;
34mod key_prefix;
35/// Message topics.
36pub mod message_topics;
37/// Mint provider.
38pub mod mint;
39/// Prefixed values provider.
40pub mod prefixed_values;
41mod protocol_upgrade;
42/// Prune provider.
43pub mod prune;
44/// Query provider.
45pub mod query;
46mod round_seigniorage;
47mod seigniorage_recipients;
48/// Step provider.
49pub mod step;
50mod system_entity_registry;
51/// Tagged values provider.
52pub mod tagged_values;
53mod total_supply;
54mod trie;
55
56pub use addressable_entity::{AddressableEntityRequest, AddressableEntityResult};
57pub use auction::{AuctionMethod, BiddingRequest, BiddingResult};
58pub use balance::{
59    BalanceHolds, BalanceHoldsWithProof, BalanceIdentifier, BalanceRequest, BalanceResult,
60    GasHoldBalanceHandling, ProofHandling, ProofsResult,
61};
62pub use balance_hold::{
63    BalanceHoldError, BalanceHoldKind, BalanceHoldMode, BalanceHoldRequest, BalanceHoldResult,
64    InsufficientBalanceHandling,
65};
66pub use balance_identifier_purse::{BalanceIdentifierPurseRequest, BalanceIdentifierPurseResult};
67pub use bids::{BidsRequest, BidsResult};
68pub use block_global::{BlockGlobalKind, BlockGlobalRequest, BlockGlobalResult};
69pub use block_rewards::{BlockRewardsError, BlockRewardsRequest, BlockRewardsResult};
70pub use contract::{ContractRequest, ContractResult};
71pub use entry_points::{
72    EntryPointExistsRequest, EntryPointExistsResult, EntryPointRequest, EntryPointResult,
73};
74pub use era_validators::{EraValidatorsRequest, EraValidatorsResult};
75pub use execution_results_checksum::{
76    ExecutionResultsChecksumRequest, ExecutionResultsChecksumResult,
77    EXECUTION_RESULTS_CHECKSUM_NAME,
78};
79pub use fee::{FeeError, FeeRequest, FeeResult};
80pub use flush::{FlushRequest, FlushResult};
81pub use genesis::{GenesisRequest, GenesisResult};
82pub use handle_fee::{HandleFeeMode, HandleFeeRequest, HandleFeeResult};
83pub use handle_refund::{HandleRefundMode, HandleRefundRequest, HandleRefundResult};
84pub use key_prefix::KeyPrefix;
85pub use message_topics::{MessageTopicsRequest, MessageTopicsResult};
86pub use mint::{TransferRequest, TransferResult};
87pub use protocol_upgrade::{ProtocolUpgradeRequest, ProtocolUpgradeResult};
88pub use prune::{PruneRequest, PruneResult};
89pub use query::{QueryRequest, QueryResult};
90pub use round_seigniorage::{RoundSeigniorageRateRequest, RoundSeigniorageRateResult};
91pub use seigniorage_recipients::{SeigniorageRecipientsRequest, SeigniorageRecipientsResult};
92pub use step::{EvictItem, RewardItem, SlashItem, StepError, StepRequest, StepResult};
93pub use system_entity_registry::{
94    SystemEntityRegistryPayload, SystemEntityRegistryRequest, SystemEntityRegistryResult,
95    SystemEntityRegistrySelector,
96};
97pub use total_supply::{TotalSupplyRequest, TotalSupplyResult};
98pub use trie::{PutTrieRequest, PutTrieResult, TrieElement, TrieRequest, TrieResult};
99
100/// Anchor struct for block store functionality.
101#[derive(Default, Copy, Clone)]
102pub struct BlockStore(());
103
104impl BlockStore {
105    /// Ctor.
106    pub fn new() -> Self {
107        BlockStore(())
108    }
109}
110
111/// Data access layer.
112#[derive(Copy, Clone)]
113pub struct DataAccessLayer<S> {
114    /// Block store instance.
115    pub block_store: BlockStore,
116    /// Memoized state.
117    pub state: S,
118    /// Max query depth.
119    pub max_query_depth: u64,
120    /// Enable the addressable entity capability.
121    pub enable_addressable_entity: bool,
122}
123
124impl<S> DataAccessLayer<S> {
125    /// Returns reference to current state of the data access layer.
126    pub fn state(&self) -> &S {
127        &self.state
128    }
129}
130
131impl<S> CommitProvider for DataAccessLayer<S>
132where
133    S: CommitProvider,
134{
135    fn commit_effects(
136        &self,
137        state_hash: Digest,
138        effects: Effects,
139    ) -> Result<Digest, GlobalStateError> {
140        self.state.commit_effects(state_hash, effects)
141    }
142
143    fn commit_values(
144        &self,
145        state_hash: Digest,
146        values_to_write: Vec<(casper_types::Key, casper_types::StoredValue)>,
147        keys_to_prune: std::collections::BTreeSet<casper_types::Key>,
148    ) -> Result<Digest, GlobalStateError> {
149        self.state
150            .commit_values(state_hash, values_to_write, keys_to_prune)
151    }
152}
153
154impl<S> StateProvider for DataAccessLayer<S>
155where
156    S: StateProvider,
157{
158    type Reader = S::Reader;
159
160    fn flush(&self, request: FlushRequest) -> FlushResult {
161        self.state.flush(request)
162    }
163
164    fn empty_root(&self) -> Digest {
165        self.state.empty_root()
166    }
167
168    fn tracking_copy(
169        &self,
170        hash: Digest,
171    ) -> Result<Option<TrackingCopy<S::Reader>>, GlobalStateError> {
172        match self.state.checkout(hash)? {
173            Some(reader) => Ok(Some(TrackingCopy::new(
174                reader,
175                self.max_query_depth,
176                self.enable_addressable_entity,
177            ))),
178            None => Ok(None),
179        }
180    }
181
182    fn checkout(&self, state_hash: Digest) -> Result<Option<Self::Reader>, GlobalStateError> {
183        self.state.checkout(state_hash)
184    }
185
186    fn trie(&self, request: TrieRequest) -> TrieResult {
187        self.state.trie(request)
188    }
189
190    fn put_trie(&self, request: PutTrieRequest) -> PutTrieResult {
191        self.state.put_trie(request)
192    }
193
194    fn missing_children(&self, trie_raw: &[u8]) -> Result<Vec<Digest>, GlobalStateError> {
195        self.state.missing_children(trie_raw)
196    }
197
198    fn enable_entity(&self) -> bool {
199        self.state.enable_entity()
200    }
201}