mithril_stm/circuits/halo2/
errors.rs1use midnight_proofs::plonk::Error as PlonkError;
2use thiserror::Error;
3
4use crate::StmError;
5
6#[cfg_attr(not(test), allow(dead_code))]
8#[derive(Debug, Error, Clone, PartialEq, Eq)]
9pub enum StmCircuitError {
10 #[error(
12 "Circuit::validate_parameters failed: quorum ({quorum}) must be lower than num_lotteries ({num_lotteries})"
13 )]
14 InvalidCircuitParameters { quorum: u32, num_lotteries: u32 },
15
16 #[error(
18 "Circuit::validate_witness_length failed: expected quorum {expected_quorum}, got {actual}"
19 )]
20 WitnessLengthMismatch { expected_quorum: u32, actual: u32 },
21
22 #[error(
24 "Circuit::validate_lottery_index failed: index ({index}) exceeds max supported ({max_supported})"
25 )]
26 LotteryIndexTooLarge { index: u64, max_supported: u64 },
27
28 #[error(
30 "Circuit::validate_lottery_index failed: index ({index}) must be lower than num_lotteries ({num_lotteries})"
31 )]
32 LotteryIndexOutOfBounds { index: u64, num_lotteries: u32 },
33
34 #[error(
36 "Circuit::validate_merkle_sibling_length failed: expected depth {expected_depth}, got {actual}"
37 )]
38 MerkleSiblingLengthMismatch { expected_depth: u32, actual: u32 },
39
40 #[error(
42 "Circuit::validate_merkle_position_length failed: expected depth {expected_depth}, got {actual}"
43 )]
44 MerklePositionLengthMismatch { expected_depth: u32, actual: u32 },
45
46 #[error("Field modulus parse failed")]
48 FieldModulusParseFailed,
49
50 #[error("Field element conversion failed")]
52 FieldElementConversionFailed,
53
54 #[error("Invalid bit decomposition range ({num_bits}) for field size ({field_bits})")]
56 InvalidBitDecompositionRange { num_bits: u32, field_bits: u32 },
57
58 #[error("Invalid merkle tree depth ({depth})")]
60 InvalidMerkleTreeDepth { depth: u32 },
61
62 #[error("Invalid selected leaf index ({index}) for {num_leaves} leaves")]
64 InvalidSelectedLeafIndex { index: u32, num_leaves: u32 },
65
66 #[error("Empty indices")]
68 EmptyIndices,
69
70 #[error("Witness too short (got {actual}, expected at least 2)")]
72 WitnessTooShort { actual: u32 },
73
74 #[error("No distinct witness entries")]
76 NoDistinctWitnessEntries,
77
78 #[error("Empty signer leaves")]
80 EmptySignerLeaves,
81
82 #[error("Invalid signer leaf index ({index}) for {num_signers} signers")]
84 InvalidSignerFixtureIndex { index: u32, num_signers: u32 },
85
86 #[error("Invalid challenge bytes")]
88 InvalidChallengeBytes,
89
90 #[error("Challenge endianness mismatch")]
92 ChallengeEndiannessMismatch,
93
94 #[error("Invalid merkle root digest length ({actual})")]
96 InvalidMerkleRootDigestLength { actual: u32 },
97
98 #[error("Non-canonical merkle root digest")]
100 NonCanonicalMerkleRootDigest,
101
102 #[error("Merkle path verification failed")]
104 MerklePathVerificationFailed,
105
106 #[error("Failed to create params assets directory")]
108 ParamsAssetsDirCreate,
109
110 #[error("Circuit keys cache lock poisoned ({operation})")]
112 CircuitKeysCacheLockPoisoned { operation: &'static str },
113
114 #[error("Signature generation failed")]
116 SignatureGenerationFailed,
117
118 #[error("Signature verification failed")]
120 SignatureVerificationFailed,
121
122 #[error("Proof verification rejected")]
124 VerificationRejected,
125}
126
127pub(crate) fn to_synthesis_error(error: StmError) -> PlonkError {
129 let error = match error.downcast::<PlonkError>() {
130 Ok(plonk_error) => return plonk_error,
131 Err(error) => error,
132 };
133
134 let error = match error.downcast::<StmCircuitError>() {
135 Ok(stm_error) => return PlonkError::Synthesis(stm_error.to_string()),
136 Err(error) => error,
137 };
138
139 PlonkError::Synthesis(error.to_string())
140}