use crate::{
error::Error,
host::{IsmpHost, StateMachine},
messaging::{Proof, StateCommitmentHeight},
prelude::Vec,
};
use alloc::{boxed::Box, collections::BTreeMap};
use codec::{Decode, DecodeWithMemTracking, Encode};
use core::time::Duration;
use primitive_types::H256;
pub type ConsensusStateId = [u8; 4];
pub type ConsensusClientId = [u8; 4];
#[derive(
Debug,
Clone,
Copy,
Encode,
Decode,
DecodeWithMemTracking,
scale_info::TypeInfo,
PartialEq,
Hash,
Eq,
Default,
serde::Deserialize,
serde::Serialize,
)]
pub struct StateCommitment {
pub timestamp: u64,
pub overlay_root: Option<H256>,
pub state_root: H256,
}
impl StateCommitment {
pub fn timestamp(&self) -> Duration {
Duration::from_secs(self.timestamp)
}
}
#[derive(Debug, Clone, Copy, Encode, Decode, scale_info::TypeInfo, PartialEq, Hash, Eq)]
#[cfg_attr(feature = "std", derive(serde::Deserialize, serde::Serialize))]
pub struct IntermediateState {
pub height: StateMachineHeight,
pub commitment: StateCommitment,
}
#[derive(
Debug,
Clone,
Copy,
Encode,
Decode,
DecodeWithMemTracking,
scale_info::TypeInfo,
PartialEq,
Eq,
Hash,
Ord,
PartialOrd,
serde::Deserialize,
serde::Serialize,
)]
pub struct StateMachineId {
#[serde(with = "serde_hex_utils::as_string")]
pub state_id: StateMachine,
#[serde(with = "serde_hex_utils::as_utf8_string")]
pub consensus_state_id: ConsensusStateId,
}
#[derive(
Debug,
Clone,
Copy,
Encode,
Decode,
DecodeWithMemTracking,
scale_info::TypeInfo,
PartialEq,
Eq,
Hash,
Ord,
PartialOrd,
serde::Deserialize,
serde::Serialize,
)]
pub struct StateMachineHeight {
pub id: StateMachineId,
pub height: u64,
}
pub type VerifiedCommitments = BTreeMap<StateMachineId, Vec<StateCommitmentHeight>>;
pub trait ConsensusClient {
fn verify_consensus(
&self,
host: &dyn IsmpHost,
consensus_state_id: ConsensusStateId,
trusted_consensus_state: Vec<u8>,
proof: Vec<u8>,
) -> Result<(Vec<u8>, VerifiedCommitments), Error>;
fn verify_fraud_proof(
&self,
host: &dyn IsmpHost,
trusted_consensus_state: Vec<u8>,
proof_1: Vec<u8>,
proof_2: Vec<u8>,
) -> Result<(), Error>;
fn consensus_client_id(&self) -> ConsensusClientId;
fn state_machine(&self, id: StateMachine) -> Result<Box<dyn StateMachineClient>, Error>;
}
pub trait StateMachineClient {
fn verify_membership(
&self,
host: &dyn IsmpHost,
commitments: Vec<H256>,
root: StateCommitment,
proof: &Proof,
) -> Result<(), Error>;
fn commitment_state_trie_key(&self, commitments: Vec<H256>) -> Vec<Vec<u8>>;
fn receipts_state_trie_key(&self, commitments: Vec<H256>) -> Vec<Vec<u8>>;
fn verify_non_membership(
&self,
host: &dyn IsmpHost,
commitments: Vec<H256>,
root: StateCommitment,
proof: &Proof,
) -> Result<(), Error>;
fn verify_state_proof(
&self,
host: &dyn IsmpHost,
keys: Vec<Vec<u8>>,
root: H256,
proof: &Proof,
) -> Result<BTreeMap<Vec<u8>, Option<Vec<u8>>>, Error>;
}