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