diff --git a/src/circuit/gadget/sinsemilla.rs b/src/circuit/gadget/sinsemilla.rs index 8420ffab..f4173010 100644 --- a/src/circuit/gadget/sinsemilla.rs +++ b/src/circuit/gadget/sinsemilla.rs @@ -32,6 +32,16 @@ pub trait SinsemillaInstructions, Q: C, message: Self::Message, - ) -> Result<(Self::Point, Vec>), Error>; + ) -> Result<(Self::Point, Vec), Error>; /// Extracts the x-coordinate of the output of a Sinsemilla hash. fn extract(point: &Self::Point) -> Self::X; @@ -262,6 +263,7 @@ where } } + #[allow(clippy::type_complexity)] /// $\mathsf{SinsemillaHashToPoint}$ from [§ 5.4.1.9][concretesinsemillahash]. /// /// [concretesinsemillahash]: https://zips.z.cash/protocol/protocol.pdf#concretesinsemillahash @@ -269,11 +271,13 @@ where &self, layouter: impl Layouter, message: Message, - ) -> Result, Error> { + ) -> Result<(ecc::Point, Vec), Error> { assert_eq!(self.sinsemilla_chip, message.chip); - self.sinsemilla_chip - .hash_to_point(layouter, self.Q, message.inner) - .map(|(point, _)| ecc::Point::from_inner(self.ecc_chip.clone(), point)) + let (p, zs) = self + .sinsemilla_chip + .hash_to_point(layouter, self.Q, message.inner)?; + let p = ecc::Point::from_inner(self.ecc_chip.clone(), p); + Ok((p, zs)) } /// $\mathsf{SinsemillaHash}$ from [§ 5.4.1.9][concretesinsemillahash]. @@ -285,8 +289,8 @@ where message: Message, ) -> Result, Error> { assert_eq!(self.sinsemilla_chip, message.chip); - let p = self.hash_to_point(layouter, message); - p.map(|p| p.extract_p()) + let (p, _) = self.hash_to_point(layouter, message)?; + Ok(p.extract_p()) } } @@ -353,6 +357,7 @@ where } } + #[allow(clippy::type_complexity)] /// $\mathsf{SinsemillaCommit}$ from [§ 5.4.8.4][concretesinsemillacommit]. /// /// [concretesinsemillacommit]: https://zips.z.cash/protocol/nu5.pdf#concretesinsemillacommit @@ -361,14 +366,15 @@ where mut layouter: impl Layouter, message: Message, r: Option, - ) -> Result, Error> { + ) -> Result<(ecc::Point, Vec), Error> { assert_eq!(self.M.sinsemilla_chip, message.chip); let (blind, _) = self.R.mul(layouter.namespace(|| "[r] R"), r)?; - self.M - .hash_to_point(layouter.namespace(|| "M"), message)? - .add_incomplete(layouter.namespace(|| "M ⸭ [r] R"), &blind) + let (p, zs) = self.M.hash_to_point(layouter.namespace(|| "M"), message)?; + let commitment = p.add_incomplete(layouter.namespace(|| "M ⸭ [r] R"), &blind)?; + Ok((commitment, zs)) } + #[allow(clippy::type_complexity)] /// $\mathsf{SinsemillaShortCommit}$ from [§ 5.4.8.4][concretesinsemillacommit]. /// /// [concretesinsemillacommit]: https://zips.z.cash/protocol/nu5.pdf#concretesinsemillacommit @@ -377,10 +383,10 @@ where mut layouter: impl Layouter, message: Message, r: Option, - ) -> Result, Error> { + ) -> Result<(ecc::X, Vec), Error> { assert_eq!(self.M.sinsemilla_chip, message.chip); - let p = self.commit(layouter.namespace(|| "commit"), message, r); - p.map(|p| p.extract_p()) + let (p, zs) = self.commit(layouter.namespace(|| "commit"), message, r)?; + Ok((p.extract_p(), zs)) } } @@ -553,7 +559,7 @@ mod tests { }; // Parent - let parent = { + let (parent, _) = { let message = Message::from_pieces(chip1, vec![l, left, right]); merkle_crh.hash_to_point(layouter.namespace(|| "parent"), message)? }; @@ -576,7 +582,7 @@ mod tests { let message: Vec> = (0..500).map(|_| Some(rand::random::())).collect(); - let result = { + let (result, _) = { let message = Message::from_bitstring( chip2, layouter.namespace(|| "witness message"), diff --git a/src/circuit/gadget/sinsemilla/chip.rs b/src/circuit/gadget/sinsemilla/chip.rs index 8cb0436a..62ace816 100644 --- a/src/circuit/gadget/sinsemilla/chip.rs +++ b/src/circuit/gadget/sinsemilla/chip.rs @@ -248,6 +248,8 @@ impl SinsemillaInstructions; type MessagePiece = MessagePiece; + type RunningSum = Vec; + type X = CellValue; type Point = EccPoint; type FixedPoints = OrchardFixedBasesFull; @@ -284,7 +286,7 @@ impl SinsemillaInstructions, Q: pallas::Affine, message: Self::Message, - ) -> Result<(Self::Point, Vec>), Error> { + ) -> Result<(Self::Point, Vec), Error> { layouter.assign_region( || "hash_to_point", |mut region| self.hash_message(&mut region, Q, &message), diff --git a/src/circuit/gadget/sinsemilla/merkle/chip.rs b/src/circuit/gadget/sinsemilla/merkle/chip.rs index 4fc91c6d..0af81895 100644 --- a/src/circuit/gadget/sinsemilla/merkle/chip.rs +++ b/src/circuit/gadget/sinsemilla/merkle/chip.rs @@ -408,6 +408,11 @@ impl SinsemillaInstructions>::MessagePiece; + type RunningSum = >::RunningSum; type X =