mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 19:17:58 +00:00
Use header cache when creating state. (#5868)
* Use header cache for state_at * Fixed warnings * Update client/db/src/lib.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>
This commit is contained in:
@@ -1590,10 +1590,16 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
|
||||
_ => {}
|
||||
}
|
||||
|
||||
match self.blockchain.header(block) {
|
||||
Ok(Some(ref hdr)) => {
|
||||
let hash = hdr.hash();
|
||||
if !self.have_state_at(&hash, *hdr.number()) {
|
||||
let hash = match block {
|
||||
BlockId::Hash(h) => h,
|
||||
BlockId::Number(n) => self.blockchain.hash(n)?.ok_or_else(||
|
||||
sp_blockchain::Error::UnknownBlock(format!("Unknown block number {}", n))
|
||||
)?,
|
||||
};
|
||||
|
||||
match self.blockchain.header_metadata(hash) {
|
||||
Ok(ref hdr) => {
|
||||
if !self.have_state_at(&hash, hdr.number) {
|
||||
return Err(
|
||||
sp_blockchain::Error::UnknownBlock(
|
||||
format!("State already discarded for {:?}", block)
|
||||
@@ -1601,8 +1607,8 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
|
||||
)
|
||||
}
|
||||
if let Ok(()) = self.storage.state_db.pin(&hash) {
|
||||
let root = hdr.state_root();
|
||||
let db_state = DbState::<Block>::new(self.storage.clone(), *root);
|
||||
let root = hdr.state_root;
|
||||
let db_state = DbState::<Block>::new(self.storage.clone(), root);
|
||||
let state = RefTrackingState::new(
|
||||
db_state,
|
||||
self.storage.clone(),
|
||||
@@ -1627,22 +1633,17 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
|
||||
)
|
||||
}
|
||||
},
|
||||
Ok(None) => Err(
|
||||
sp_blockchain::Error::UnknownBlock(
|
||||
format!("Unknown state for block {:?}", block)
|
||||
)
|
||||
),
|
||||
Err(e) => Err(e),
|
||||
}
|
||||
}
|
||||
|
||||
fn have_state_at(&self, hash: &Block::Hash, number: NumberFor<Block>) -> bool {
|
||||
if self.is_archive {
|
||||
match self.blockchain.header(BlockId::Hash(hash.clone())) {
|
||||
Ok(Some(header)) => {
|
||||
match self.blockchain.header_metadata(hash.clone()) {
|
||||
Ok(header) => {
|
||||
sp_state_machine::Storage::get(
|
||||
self.storage.as_ref(),
|
||||
&header.state_root(),
|
||||
&header.state_root,
|
||||
(&[], None),
|
||||
).unwrap_or(None).is_some()
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user