consolidate [balance/storage]_at and _at_id functionality
This commit is contained in:
@@ -349,7 +349,12 @@ impl<V> Client<V> where V: Verifier {
|
||||
/// Attempt to get a copy of a specific block's state.
|
||||
///
|
||||
/// This can fail (but may not) if the DB prunes state.
|
||||
pub fn state_at_id(&self, id: BlockID) -> Option<State> {
|
||||
pub fn state_at(&self, id: BlockID) -> Option<State> {
|
||||
// fast path for latest state.
|
||||
if let BlockID::Latest = id.clone() {
|
||||
return Some(self.state())
|
||||
}
|
||||
|
||||
self.block_header(id).map(|header| {
|
||||
let db = self.state_db.lock().unwrap().boxed_clone();
|
||||
State::from_existing(db, HeaderView::new(&header).state_root(), self.engine.account_start_nonce())
|
||||
@@ -563,26 +568,12 @@ impl<V> BlockChainClient for Client<V> where V: Verifier {
|
||||
self.state().code(address)
|
||||
}
|
||||
|
||||
fn balance(&self, address: &Address) -> U256 {
|
||||
self.state().balance(address)
|
||||
fn balance(&self, address: &Address, id: BlockID) -> Option<U256> {
|
||||
self.state_at(id).map(|s| s.balance(address))
|
||||
}
|
||||
|
||||
fn balance_at_id(&self, address: &Address, id: BlockID) -> Option<U256> {
|
||||
match id {
|
||||
BlockID::Latest => Some(self.balance(address)),
|
||||
id => self.state_at_id(id).map(|s| s.balance(address)),
|
||||
}
|
||||
}
|
||||
|
||||
fn storage_at(&self, address: &Address, position: &H256) -> H256 {
|
||||
self.state().storage_at(address, position)
|
||||
}
|
||||
|
||||
fn storage_at_id(&self, address: &Address, position: &H256, id: BlockID) -> Option<H256> {
|
||||
match id {
|
||||
BlockID::Latest => Some(self.storage_at(address, position)),
|
||||
id => self.state_at_id(id).map(|s| s.storage_at(address, position)),
|
||||
}
|
||||
fn storage_at(&self, address: &Address, position: &H256, id: BlockID) -> Option<H256> {
|
||||
self.state_at(id).map(|s| s.storage_at(address, position))
|
||||
}
|
||||
|
||||
fn transaction(&self, id: TransactionID) -> Option<LocalizedTransaction> {
|
||||
|
||||
@@ -74,33 +74,15 @@ pub trait BlockChainClient : Sync + Send {
|
||||
/// Get address code.
|
||||
fn code(&self, address: &Address) -> Option<Bytes>;
|
||||
|
||||
/// Get address balance at latest state.
|
||||
fn balance(&self, address: &Address) -> U256;
|
||||
|
||||
/// Account balance at a specific block ID.
|
||||
/// Get address balance at the given block's state.
|
||||
///
|
||||
/// Must not fail if `id` is `BlockID::Latest`.
|
||||
/// Will fail if the block is not valid or the block's root hash has been
|
||||
/// pruned from the DB.
|
||||
fn balance_at_id(&self, address: &Address, id: BlockID) -> Option<U256> {
|
||||
if let BlockID::Latest = id {
|
||||
Some(self.balance(address))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
/// Returns None if and only if the block's root hash has been pruned from the DB.
|
||||
fn balance(&self, address: &Address, id: BlockID) -> Option<U256>;
|
||||
|
||||
/// Get value of the storage at given position from the latest state.
|
||||
fn storage_at(&self, address: &Address, position: &H256) -> H256;
|
||||
|
||||
/// Get value of the storage at given position form the latest state.
|
||||
fn storage_at_id(&self, address: &Address, position: &H256, id: BlockID) -> Option<H256> {
|
||||
if let BlockID::Latest = id {
|
||||
Some(self.storage_at(address, position))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
/// Get value of the storage at given position at the given block.
|
||||
///
|
||||
/// Returns None if and only if the block's root hash has been pruned from the DB.
|
||||
fn storage_at(&self, address: &Address, position: &H256, id: BlockID) -> Option<H256>;
|
||||
|
||||
/// Get transaction with given hash.
|
||||
fn transaction(&self, id: TransactionID) -> Option<LocalizedTransaction>;
|
||||
|
||||
@@ -253,12 +253,20 @@ impl BlockChainClient for TestBlockChainClient {
|
||||
self.code.read().unwrap().get(address).cloned()
|
||||
}
|
||||
|
||||
fn balance(&self, address: &Address) -> U256 {
|
||||
self.balances.read().unwrap().get(address).cloned().unwrap_or_else(U256::zero)
|
||||
fn balance(&self, address: &Address, id: BlockID) -> Option<U256> {
|
||||
if let BlockID::Latest = id {
|
||||
Some(self.balances.read().unwrap().get(address).cloned().unwrap_or_else(U256::zero))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
fn storage_at(&self, address: &Address, position: &H256) -> H256 {
|
||||
self.storage.read().unwrap().get(&(address.clone(), position.clone())).cloned().unwrap_or_else(H256::new)
|
||||
fn storage_at(&self, address: &Address, position: &H256, id: BlockID) -> Option<H256> {
|
||||
if let BlockID::Latest = id {
|
||||
Some(self.storage.read().unwrap().get(&(address.clone(), position.clone())).cloned().unwrap_or_else(H256::new))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
fn transaction(&self, _id: TransactionID) -> Option<LocalizedTransaction> {
|
||||
|
||||
Reference in New Issue
Block a user