sp_domains_fraud_proof/
lib.rs

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