pallet-ibc 2.0.0-pre.2

An IBC implementation on Substrate.
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};

/// Create in-memory storage of proof check backend.
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
}

/// Check storage read proof, generated by `prove_read` call.
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)))
    }
}