| 286 | } |
| 287 | |
| 288 | fn header_by_hash(&self, hash: B256) -> Result<Header, Self::Error> { |
| 289 | let encoded_header: Bytes = tokio::task::block_in_place(move || { |
| 290 | Handle::current().block_on(async { |
| 291 | let preimage: Bytes = self |
| 292 | .provider |
| 293 | .client() |
| 294 | .request("debug_getRawHeader", &[hash]) |
| 295 | .await |
| 296 | .map_err(|_| TestTrieNodeProviderError::PreimageNotFound)?; |
| 297 | |
| 298 | self.kv_store |
| 299 | .lock() |
| 300 | .await |
| 301 | .put(hash, preimage.clone()) |
| 302 | .map_err(|_| TestTrieNodeProviderError::KVStore)?; |
| 303 | |
| 304 | Ok(preimage) |
| 305 | }) |
| 306 | })?; |
| 307 | |
| 308 | // Decode the Header. |
| 309 | Header::decode(&mut encoded_header.as_ref()).map_err(TestTrieNodeProviderError::Rlp) |
| 310 | } |
| 311 | } |
| 312 | |
| 313 | /// A simple [`TrieDBProvider`] that reads data from a disk-based key-value store. |