Skip to content

Commit 39c40f4

Browse files
committed
Remove length restriction on SigmaBoolean conjecture items
1 parent 2ce848f commit 39c40f4

File tree

12 files changed

+227
-144
lines changed

12 files changed

+227
-144
lines changed

ergo-lib/src/wallet/multi_sig.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ use crate::ergotree_interpreter::sigma_protocol::unproven_tree::NodePosition;
1616
use crate::ergotree_interpreter::sigma_protocol::FirstProverMessage;
1717
use crate::ergotree_ir::sigma_protocol::sigma_boolean::SigmaBoolean;
1818
use crate::ergotree_ir::sigma_protocol::sigma_boolean::SigmaConjecture;
19-
use crate::ergotree_ir::sigma_protocol::sigma_boolean::SigmaConjectureItems;
2019
use crate::ergotree_ir::sigma_protocol::sigma_boolean::SigmaProofOfKnowledgeTree;
2120
use crate::wallet::signing::{make_context, TransactionContext, TxSigningError};
2221
use alloc::vec::Vec;
@@ -40,7 +39,7 @@ pub fn bag_for_multi_sig(
4039
if let SigmaBoolean::TrivialProp(_) = sigma_tree {
4140
return Ok(HintsBag::empty());
4241
}
43-
let ut = compute_commitments(parse_sig_compute_challenges(sigma_tree, proof.to_owned())?);
42+
let ut = compute_commitments(parse_sig_compute_challenges(sigma_tree, proof.to_owned())?)?;
4443
// Traversing node of sigma tree
4544
fn traverse_node(
4645
tree: UncheckedTree,
@@ -51,8 +50,7 @@ pub fn bag_for_multi_sig(
5150
) -> Result<(), SigParsingError> {
5251
match tree {
5352
UncheckedTree::UncheckedConjecture(unchecked_conjecture) => {
54-
let items: SigmaConjectureItems<UncheckedTree> =
55-
unchecked_conjecture.children_ust();
53+
let items = unchecked_conjecture.children_ust();
5654
items
5755
.iter()
5856
.enumerate()

ergotree-interpreter/src/sigma_protocol/proof_tree.rs

Lines changed: 65 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
33
extern crate derive_more;
44

5+
use alloc::vec::Vec;
56
use core::fmt::Debug;
67

78
use derive_more::From;
89
use derive_more::TryInto;
910
use ergotree_ir::sigma_protocol::sigma_boolean::SigmaBoolean;
10-
use ergotree_ir::sigma_protocol::sigma_boolean::SigmaConjectureItems;
1111

1212
use crate::sigma_protocol::unproven_tree::CandUnproven;
1313
use crate::sigma_protocol::unproven_tree::UnprovenConjecture;
@@ -136,7 +136,7 @@ pub(crate) enum ConjectureType {
136136

137137
pub(crate) trait ProofTreeConjecture {
138138
fn conjecture_type(&self) -> ConjectureType;
139-
fn children(&self) -> SigmaConjectureItems<ProofTree>;
139+
fn children(&self) -> Vec<ProofTree>;
140140
}
141141

142142
pub(crate) enum ProofTreeKind<'a> {
@@ -150,16 +150,20 @@ pub(crate) fn rewrite_bu<F>(tree: ProofTree, f: &F) -> Result<ProofTree, ProverE
150150
where
151151
F: Fn(&ProofTree) -> Result<Option<ProofTree>, ProverError>,
152152
{
153-
let cast_to_ust = |children: SigmaConjectureItems<ProofTree>| {
154-
children.try_mapped(|c| {
155-
if let ProofTree::UncheckedTree(ust) = c {
156-
Ok(ust)
157-
} else {
158-
Err(ProverError::Unexpected(
159-
"rewrite: expected UncheckedSigmaTree got UnprovenTree",
160-
))
161-
}
162-
})
153+
let cast_to_ust = |children: &[ProofTree]| {
154+
children
155+
.iter()
156+
.cloned()
157+
.map(|c| {
158+
if let ProofTree::UncheckedTree(ust) = c {
159+
Ok(ust)
160+
} else {
161+
Err(ProverError::Unexpected(
162+
"rewrite: expected UncheckedSigmaTree got UnprovenTree",
163+
))
164+
}
165+
})
166+
.collect::<Result<Vec<_>, _>>()
163167
};
164168

165169
let tree_with_updated_children = match &tree {
@@ -206,9 +210,12 @@ where
206210
challenge,
207211
children,
208212
} => {
209-
let rewritten_children =
210-
children.clone().try_mapped(|c| rewrite_bu(c.into(), f))?;
211-
let casted_children = cast_to_ust(rewritten_children)?;
213+
let rewritten_children = children
214+
.iter()
215+
.cloned()
216+
.map(|c| rewrite_bu(c.into(), f))
217+
.collect::<Result<Vec<_>, _>>()?;
218+
let casted_children = cast_to_ust(&rewritten_children)?;
212219
UncheckedConjecture::CandUnchecked {
213220
children: casted_children,
214221
challenge: challenge.clone(),
@@ -219,9 +226,12 @@ where
219226
challenge,
220227
children,
221228
} => {
222-
let rewritten_children =
223-
children.clone().try_mapped(|c| rewrite_bu(c.into(), f))?;
224-
let casted_children = cast_to_ust(rewritten_children)?;
229+
let rewritten_children = children
230+
.iter()
231+
.cloned()
232+
.map(|c| rewrite_bu(c.into(), f))
233+
.collect::<Result<Vec<_>, _>>()?;
234+
let casted_children = cast_to_ust(&rewritten_children)?;
225235
UncheckedConjecture::CorUnchecked {
226236
children: casted_children,
227237
challenge: challenge.clone(),
@@ -234,11 +244,14 @@ where
234244
k,
235245
polynomial: polynomial_opt,
236246
} => {
237-
let rewritten_children =
238-
children.clone().try_mapped(|c| rewrite_bu(c.into(), f))?;
239-
let casted_children = cast_to_ust(rewritten_children)?;
247+
let rewritten_children = children
248+
.iter()
249+
.cloned()
250+
.map(|c| rewrite_bu(c.into(), f))
251+
.collect::<Result<Vec<_>, _>>()?;
252+
let casted_children = cast_to_ust(&rewritten_children)?;
240253
UncheckedConjecture::CthresholdUnchecked {
241-
children: casted_children,
254+
children: casted_children.try_into()?,
242255
challenge: challenge.clone(),
243256
k: *k,
244257
polynomial: polynomial_opt.clone(),
@@ -257,16 +270,20 @@ pub(crate) fn rewrite_td<F>(tree: ProofTree, f: &F) -> Result<ProofTree, ProverE
257270
where
258271
F: Fn(&ProofTree) -> Result<Option<ProofTree>, ProverError>,
259272
{
260-
let cast_to_ust = |children: SigmaConjectureItems<ProofTree>| {
261-
children.try_mapped(|c| {
262-
if let ProofTree::UncheckedTree(ust) = c {
263-
Ok(ust)
264-
} else {
265-
Err(ProverError::Unexpected(
266-
"rewrite: expected UncheckedSigmaTree got UnprovenTree",
267-
))
268-
}
269-
})
273+
let cast_to_ust = |children: &[ProofTree]| {
274+
children
275+
.iter()
276+
.cloned()
277+
.map(|c| {
278+
if let ProofTree::UncheckedTree(ust) = c {
279+
Ok(ust)
280+
} else {
281+
Err(ProverError::Unexpected(
282+
"rewrite: expected UncheckedSigmaTree got UnprovenTree",
283+
))
284+
}
285+
})
286+
.collect::<Result<Vec<_>, _>>()
270287
};
271288

272289
let rewritten_tree = f(&tree)?.unwrap_or(tree);
@@ -314,9 +331,12 @@ where
314331
challenge,
315332
children,
316333
} => {
317-
let rewritten_children =
318-
children.clone().try_mapped(|c| rewrite_td(c.into(), f))?;
319-
let casted_children = cast_to_ust(rewritten_children)?;
334+
let rewritten_children = children
335+
.iter()
336+
.cloned()
337+
.map(|c| rewrite_td(c.into(), f))
338+
.collect::<Result<Vec<_>, _>>()?;
339+
let casted_children = cast_to_ust(&rewritten_children)?;
320340
UncheckedConjecture::CandUnchecked {
321341
children: casted_children,
322342
challenge: challenge.clone(),
@@ -327,9 +347,12 @@ where
327347
challenge,
328348
children,
329349
} => {
330-
let rewritten_children =
331-
children.clone().try_mapped(|c| rewrite_td(c.into(), f))?;
332-
let casted_children = cast_to_ust(rewritten_children)?;
350+
let rewritten_children = children
351+
.iter()
352+
.cloned()
353+
.map(|c| rewrite_td(c.into(), f))
354+
.collect::<Result<Vec<_>, _>>()?;
355+
let casted_children = cast_to_ust(&rewritten_children)?;
333356
UncheckedConjecture::CorUnchecked {
334357
children: casted_children,
335358
challenge: challenge.clone(),
@@ -343,10 +366,11 @@ where
343366
polynomial: polynomial_opt,
344367
} => {
345368
let rewritten_children =
346-
children.clone().try_mapped(|c| rewrite_td(c.into(), f))?;
347-
let casted_children = cast_to_ust(rewritten_children)?;
369+
children.try_mapped_ref(|c| rewrite_td(c.clone().into(), f))?;
370+
let casted_children = cast_to_ust(rewritten_children.as_slice())?;
348371
UncheckedConjecture::CthresholdUnchecked {
349-
children: casted_children,
372+
#[allow(clippy::unwrap_used)] // casted_children.len() == children.len(), so conversion can't to BoundedVec can't fail
373+
children: casted_children.try_into().unwrap(),
350374
challenge: challenge.clone(),
351375
k: *k,
352376
polynomial: polynomial_opt.clone(),

0 commit comments

Comments
 (0)