Skip to content

Commit a51aa65

Browse files
committed
MultiA interpreter
Support for multi_a descriptor. Upcoming integration test PR will add tests for these
1 parent 6cd1fb6 commit a51aa65

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

src/interpreter/mod.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,47 @@ where
844844
None => return Some(Err(Error::UnexpectedStackEnd)),
845845
}
846846
}
847+
Terminal::MultiA(k, ref subs) => {
848+
if node_state.n_evaluated == subs.len() {
849+
if node_state.n_satisfied == k {
850+
self.stack.push(stack::Element::Satisfied);
851+
} else {
852+
self.stack.push(stack::Element::Dissatisfied);
853+
}
854+
} else {
855+
// evaluate each key with as a pk
856+
// note that evaluate_pk will error on non-empty incorrect sigs
857+
// push 1 on satisfied sigs and push 0 on empty sigs
858+
match self
859+
.stack
860+
.evaluate_pk(&mut self.verify_sig, &subs[node_state.n_evaluated])
861+
{
862+
Some(Ok(x)) => {
863+
self.push_evaluation_state(
864+
node_state.node,
865+
node_state.n_evaluated + 1,
866+
node_state.n_satisfied + 1,
867+
);
868+
match self.stack.pop() {
869+
Some(..) => return Some(Ok(x)),
870+
None => return Some(Err(Error::UnexpectedStackEnd)),
871+
}
872+
}
873+
None => {
874+
self.push_evaluation_state(
875+
node_state.node,
876+
node_state.n_evaluated + 1,
877+
node_state.n_satisfied,
878+
);
879+
match self.stack.pop() {
880+
Some(..) => {} // not-satisfied, look for next key
881+
None => return Some(Err(Error::UnexpectedStackEnd)),
882+
}
883+
}
884+
x => return x, //forward errors as is
885+
}
886+
}
887+
}
847888
Terminal::Multi(ref k, ref subs) if node_state.n_evaluated == 0 => {
848889
let len = self.stack.len();
849890
if len < k + 1 {

0 commit comments

Comments
 (0)