sp_subspace_mmr/
runtime_interface.rs1#[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#[runtime_interface]
19pub trait SubspaceMmrRuntimeInterface {
20 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 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#[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 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 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}