use codec::Codec;
use hash_db::{HashDB, Hasher, EMPTY_PREFIX};
use sp_std::prelude::*;
use sp_trie::{read_trie_value, trie_types::Layout, MemoryDB, StorageProof, TrieError};
fn create_proof_check_backend_storage<H>(proof: StorageProof) -> MemoryDB<H>
where
H: Hasher,
{
let mut db = MemoryDB::default();
for item in proof.iter_nodes() {
db.insert(EMPTY_PREFIX, &item);
}
db
}
pub fn read_proof_check<H>(
root: H::Out,
proof: StorageProof,
key: &[u8],
) -> Result<Option<Vec<u8>>, Box<TrieError<Layout<H>>>>
where
H: Hasher,
H::Out: Ord + Codec,
{
let db = create_proof_check_backend_storage::<H>(proof);
if db.contains(&root, EMPTY_PREFIX) {
read_trie_value::<Layout<H>, _>(&db, &root, key)
} else {
Err(Box::new(TrieError::<Layout<H>>::InvalidStateRoot(root)))
}
}