Skip to main content

sp_domains_fraud_proof/
lib.rs

1//! Subspace fraud proof primitives for consensus chain.
2#![cfg_attr(not(feature = "std"), no_std)]
3#![feature(associated_type_defaults)]
4
5#[cfg(feature = "std")]
6pub mod execution_prover;
7pub mod fraud_proof;
8#[cfg(feature = "std")]
9mod host_functions;
10mod runtime_interface;
11pub mod storage_proof;
12#[cfg(test)]
13mod tests;
14pub mod verification;
15pub mod weights;
16
17#[cfg(not(feature = "std"))]
18extern crate alloc;
19
20use crate::storage_proof::FraudProofStorageKeyRequest;
21#[cfg(not(feature = "std"))]
22use alloc::vec::Vec;
23use domain_runtime_primitives::EthereumAccountId;
24use fraud_proof::FraudProof;
25#[cfg(feature = "std")]
26pub use host_functions::{
27    FraudProofExtension, FraudProofHostFunctions, FraudProofHostFunctionsImpl,
28};
29use parity_scale_codec::{Decode, Encode};
30pub use runtime_interface::fraud_proof_runtime_interface;
31#[cfg(feature = "std")]
32pub use runtime_interface::fraud_proof_runtime_interface::HostFunctions;
33use scale_info::TypeInfo;
34use sp_core::H256;
35use sp_domains::{DomainAllowlistUpdates, PermissionedActionAllowedBy};
36use sp_runtime::OpaqueExtrinsic;
37use sp_runtime::traits::{Header as HeaderT, NumberFor};
38use sp_runtime::transaction_validity::{InvalidTransaction, TransactionValidity};
39use subspace_core_primitives::U256;
40use subspace_runtime_primitives::{Balance, Moment};
41
42/// Custom invalid validity code for the extrinsics in pallet-domains.
43// When updating these error codes, check for clashes between:
44// <https://github.com/autonomys/subspace/blob/main/domains/primitives/runtime/src/lib.rs#L85-L88>
45// <https://github.com/autonomys/subspace/blob/main/domains/pallets/messenger/src/lib.rs#L49-L53>
46#[repr(u8)]
47pub enum InvalidTransactionCode {
48    TransactionProof = 101,
49    ExecutionReceipt = 102,
50    Bundle = 103,
51    FraudProof = 104,
52    BundleStorageFeePayment = 105,
53}
54
55impl From<InvalidTransactionCode> for InvalidTransaction {
56    #[inline]
57    fn from(invalid_code: InvalidTransactionCode) -> Self {
58        InvalidTransaction::Custom(invalid_code as u8)
59    }
60}
61
62impl From<InvalidTransactionCode> for TransactionValidity {
63    #[inline]
64    fn from(invalid_code: InvalidTransactionCode) -> Self {
65        InvalidTransaction::Custom(invalid_code as u8).into()
66    }
67}
68
69/// Type that specifies the request of storage keys
70#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
71pub enum StorageKeyRequest {
72    /// Domain's transfers storage key
73    Transfers,
74}
75
76/// Type that maybe holds an encoded set_code extrinsic with upgraded runtime
77#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
78pub enum SetCodeExtrinsic {
79    /// No runtime upgrade.
80    None,
81    /// Holds an encoded set_code extrinsic with an upgraded runtime.
82    EncodedExtrinsic(Vec<u8>),
83}
84
85/// Type that maybe holds an encoded update domain chain allowlist extrinsic
86#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
87pub enum DomainChainAllowlistUpdateExtrinsic {
88    /// No updates
89    None,
90    /// Holds an encoded extrinsic with updates.
91    EncodedExtrinsic(Vec<u8>),
92}
93
94#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
95pub struct DomainInherentExtrinsicData {
96    pub timestamp: Moment,
97    pub maybe_domain_runtime_upgrade: Option<Vec<u8>>,
98    pub consensus_transaction_byte_fee: Balance,
99    pub domain_chain_allowlist: DomainAllowlistUpdates,
100    pub maybe_sudo_runtime_call: Option<Vec<u8>>,
101    pub maybe_evm_domain_contract_creation_allowed_by_call:
102        Option<PermissionedActionAllowedBy<EthereumAccountId>>,
103}
104
105#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
106pub struct DomainInherentExtrinsic {
107    domain_timestamp_extrinsic: Vec<u8>,
108    maybe_domain_chain_allowlist_extrinsic: Option<Vec<u8>>,
109    consensus_chain_byte_fee_extrinsic: Vec<u8>,
110    maybe_domain_set_code_extrinsic: Option<Vec<u8>>,
111    maybe_domain_sudo_call_extrinsic: Option<Vec<u8>>,
112    maybe_evm_domain_contract_creation_allowed_by_call_extrinsic: Option<Vec<u8>>,
113}
114
115#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
116pub enum DomainStorageKeyRequest {
117    BlockFees,
118    Transfers,
119}
120
121#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
122pub enum StatelessDomainRuntimeCall {
123    IsTxInRange {
124        opaque_extrinsic: OpaqueExtrinsic,
125        domain_tx_range: U256,
126        bundle_vrf_hash: U256,
127    },
128    IsInherentExtrinsic(OpaqueExtrinsic),
129    IsDecodableExtrinsic(OpaqueExtrinsic),
130    IsValidDomainSudoCall(Vec<u8>),
131}
132
133sp_api::decl_runtime_apis! {
134    /// API necessary for fraud proof.
135    #[api_version(2)]
136    pub trait FraudProofApi<DomainHeader: HeaderT> {
137        /// Submit the fraud proof via an unsigned extrinsic.
138        fn submit_fraud_proof_unsigned(fraud_proof: FraudProof<NumberFor<Block>, Block::Hash, DomainHeader, H256>);
139
140        /// Return the storage key used in fraud proof
141        fn fraud_proof_storage_key(req: FraudProofStorageKeyRequest<NumberFor<Block>>) -> Vec<u8>;
142    }
143}