sp_subspace_mmr/
runtime_interface.rs

1#[cfg(not(feature = "std"))]
2extern crate alloc;
3
4#[cfg(feature = "std")]
5use crate::host_functions::SubspaceMmrExtension;
6#[cfg(not(feature = "std"))]
7use alloc::vec::Vec;
8use parity_scale_codec::{Decode, Encode};
9use scale_info::TypeInfo;
10use sp_core::H256;
11#[cfg(feature = "std")]
12use sp_externalities::ExternalitiesExt;
13use sp_mmr_primitives::EncodableOpaqueLeaf;
14use sp_runtime_interface::runtime_interface;
15use subspace_core_primitives::BlockNumber;
16
17/// MMR related runtime interface
18#[runtime_interface]
19pub trait SubspaceMmrRuntimeInterface {
20    /// Returns the MMR leaf.
21    fn get_mmr_leaf_data(&mut self, consensus_block_hash: H256) -> Option<LeafData> {
22        self.extension::<SubspaceMmrExtension>()
23            .expect("No `SubspaceMmrExtension` associated for the current context!")
24            .get_mmr_leaf_data(consensus_block_hash)
25    }
26
27    /// Returns the consensus block hash for a given block number.
28    fn consensus_block_hash(&mut self, block_number: BlockNumber) -> Option<H256> {
29        self.extension::<SubspaceMmrExtension>()
30            .expect("No `SubspaceMmrExtension` associated for the current context!")
31            .consensus_block_hash(block_number)
32    }
33}
34
35/// Leaf data sent back from host function.
36#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone, Default)]
37pub struct LeafData {
38    pub state_root: H256,
39    pub extrinsics_root: H256,
40}
41
42#[runtime_interface]
43pub trait DomainMmrRuntimeInterface {
44    /// Verifies the given MMR proof using the leaves provided
45    fn verify_mmr_proof(
46        &mut self,
47        leaves: Vec<EncodableOpaqueLeaf>,
48        encoded_proof: Vec<u8>,
49    ) -> bool {
50        self.extension::<SubspaceMmrExtension>()
51            .expect("No `SubspaceMmrExtension` associated for the current context!")
52            .verify_mmr_proof(leaves, encoded_proof)
53    }
54
55    // Return if the given consensus block is finalized
56    fn is_consensus_block_finalized(&mut self, block_number: BlockNumber) -> bool {
57        self.extension::<SubspaceMmrExtension>()
58            .expect("No `SubspaceMmrExtension` associated for the current context!")
59            .is_consensus_block_finalized(block_number)
60    }
61}