diff --git a/src/circuit.rs b/src/circuit.rs index de2f819e..d011293c 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -40,10 +40,7 @@ use gadget::{ chip::{EccChip, EccConfig}, FixedPoint, FixedPointBaseField, FixedPointShort, NonIdentityPoint, Point, }, - poseidon::{ - Hash as PoseidonHash, Pow5T3Chip as PoseidonChip, Pow5T3Config as PoseidonConfig, - StateWord, Word, - }, + poseidon::{Hash as PoseidonHash, Pow5T3Chip as PoseidonChip, Pow5T3Config as PoseidonConfig}, sinsemilla::{ chip::{SinsemillaChip, SinsemillaConfig, SinsemillaHashDomains}, commit_ivk::CommitIvkConfig, @@ -485,30 +482,8 @@ impl plonk::Circuit for Circuit { let nf_old = { // hash_old = poseidon_hash(nk, rho_old) let hash_old = { - let message = [nk, rho_old]; - - let poseidon_message = layouter.assign_region( - || "load message", - |mut region| { - let mut message_word = |i: usize| { - let value = message[i].value(); - let var = region.assign_advice( - || format!("load message_{}", i), - config.poseidon_config.state[i], - 0, - || value.ok_or(plonk::Error::SynthesisError), - )?; - region.constrain_equal(var, message[i].cell())?; - Ok(Word::<_, _, poseidon::P128Pow5T3, 3, 2>::from_inner( - StateWord::new(var, value), - )) - }; - - Ok([message_word(0)?, message_word(1)?]) - }, - )?; - - let poseidon_hasher = PoseidonHash::init( + let poseidon_message = [nk, rho_old]; + let poseidon_hasher = PoseidonHash::<_, _, poseidon::P128Pow5T3, _, 3, 2>::init( config.poseidon_chip(), layouter.namespace(|| "Poseidon init"), ConstantLength::<2>, diff --git a/src/circuit/gadget/poseidon.rs b/src/circuit/gadget/poseidon.rs index 8e6cd7c0..aa62013c 100644 --- a/src/circuit/gadget/poseidon.rs +++ b/src/circuit/gadget/poseidon.rs @@ -12,6 +12,7 @@ use halo2::{ mod pow5t3; pub use pow5t3::{Pow5T3Chip, Pow5T3Config, StateWord}; +use crate::circuit::gadget::utilities::CellValue; use crate::primitives::poseidon::{ConstantLength, Domain, Spec, Sponge, SpongeState, State}; /// The set of circuit instructions required to use the Poseidon permutation. @@ -19,7 +20,7 @@ pub trait PoseidonInstructions, const T: usize, Chip { /// Variable representing the word over which the Poseidon permutation operates. - type Word: Copy + fmt::Debug; + type Word: Copy + fmt::Debug + From>; /// Applies the Poseidon permutation to the given state. fn permute( @@ -60,6 +61,7 @@ pub trait PoseidonDuplexInstructions< } /// A word over which the Poseidon permutation operates. +#[derive(Debug)] pub struct Word< F: FieldExt, PoseidonChip: PoseidonInstructions, @@ -149,13 +151,13 @@ impl< pub fn absorb( &mut self, mut layouter: impl Layouter, - value: Word, + value: CellValue, ) -> Result<(), Error> { match self.sponge { Sponge::Absorbing(ref mut input) => { for entry in input.iter_mut() { if entry.is_none() { - *entry = Some(value.inner); + *entry = Some(value.into()); return Ok(()); } } @@ -168,11 +170,11 @@ impl< &mut self.state, input, )?; - self.sponge = Sponge::absorb(value.inner); + self.sponge = Sponge::absorb(value.into()); } Sponge::Squeezing(_) => { // Drop the remaining output elements - self.sponge = Sponge::absorb(value.inner); + self.sponge = Sponge::absorb(value.into()); } } @@ -250,7 +252,7 @@ impl< pub fn hash( mut self, mut layouter: impl Layouter, - message: [Word; L], + message: [CellValue; L], ) -> Result, Error> { for (i, value) in array::IntoIter::new(message).enumerate() { self.duplex diff --git a/src/circuit/gadget/poseidon/pow5t3.rs b/src/circuit/gadget/poseidon/pow5t3.rs index e07504a3..8050919e 100644 --- a/src/circuit/gadget/poseidon/pow5t3.rs +++ b/src/circuit/gadget/poseidon/pow5t3.rs @@ -431,6 +431,12 @@ impl From> for CellValue { } } +impl From> for StateWord { + fn from(cell_value: CellValue) -> StateWord { + StateWord::new(cell_value.cell(), cell_value.value()) + } +} + #[derive(Debug)] struct Pow5T3State([StateWord; WIDTH]); @@ -626,7 +632,10 @@ mod tests { use super::{PoseidonInstructions, Pow5T3Chip, Pow5T3Config, StateWord, WIDTH}; use crate::{ - circuit::gadget::poseidon::{Hash, Word}, + circuit::gadget::{ + poseidon::Hash, + utilities::{CellValue, Var}, + }, primitives::poseidon::{self, ConstantLength, P128Pow5T3 as OrchardNullifier, Spec}, }; @@ -783,22 +792,24 @@ mod tests { |mut region| { let mut message_word = |i: usize| { let value = self.message.map(|message_vals| message_vals[i]); - let var = region.assign_advice( + let cell = region.assign_advice( || format!("load message_{}", i), config.state[i], 0, || value.ok_or(Error::SynthesisError), )?; - Ok(Word::<_, _, OrchardNullifier, WIDTH, 2> { - inner: StateWord { var, value }, - }) + Ok(CellValue::new(cell, value)) }; Ok([message_word(0)?, message_word(1)?]) }, )?; - let hasher = Hash::init(chip, layouter.namespace(|| "init"), ConstantLength::<2>)?; + let hasher = Hash::<_, _, OrchardNullifier, _, WIDTH, 2>::init( + chip, + layouter.namespace(|| "init"), + ConstantLength::<2>, + )?; let output = hasher.hash(layouter.namespace(|| "hash"), message)?; layouter.assign_region( diff --git a/src/circuit_description b/src/circuit_description index 509f45df..552652ad 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -28325,15 +28325,15 @@ PinnedVerificationKey { (0x05f5862cad2888855bc3c1843a9eff57b11b592d9eb0e13354256661387f5231, 0x32236b14df85bf5f532a930232cb23a5c56ef7d67aaeed8bcb8fc10ea132cbd6), (0x3e727e8554679f98120355d39d958dbd8755d5a7f8b42ea87f258064c4b3eb57, 0x0c0d5c23f3ee62ac1b2d986dd3033bbcab260d590e1393de3a14a4b31ae091bb), (0x3748680dd6a91c5dec668b30fb6bf9a450aeb884b81cbc344914f265760e7131, 0x18530eaa5c58b61bd3fc38220ea484c0922524a815a8f752be955c229f9c4164), - (0x0ba01714529dc85dd2460cdbf014b71e7638d18a35eacf06868020c27c28232d, 0x2dcbb2c3191f582b6882cc9c5e6cac1a0361d0534f8f4c814e33a272b8e8da8d), - (0x0f8fb02c096c0957230639133087e8ae516d04d1678ace6ab0495a8e8576c0db, 0x2842b28258744140b09e0d27559d84e1d8f1d55350b0af37237879d14f8eb2a1), - (0x36f2f0410d5ab00d5296bf101cbd91008551d4afe2b5ac45fc437aa157c731aa, 0x19e8c688f0c92a3db3e74b66075d2e0771d5c744e77090c487ffca245a7f7f96), - (0x09ce7fd65bf8af2b554230465003160d3d0b7bfc495f6d33f5f0704cb57d6320, 0x38d3478df8841a4f7a74a3c1fe7788e6e1cbb1076d5f7358be729fa2572c9530), - (0x2abaec8c54bde721f7f2aea685764c80b0b935447c00173ff34209ac8d96b633, 0x36957cf784345bfbdb97f0fad0b74d3e5d683fcc80ee407d6a6bedfe097c0011), - (0x3f1845e758196892c66d920980dc29cc2e1844fa03575668bf84349071094207, 0x1873355bc49aeed1faee56e6d21907a5277fcd0283a3f51fface877e1c59f046), - (0x04e5834f610cf806911a2e9c14519132a49ac55f40095c3156e3b20d09a2f250, 0x2ea666b99d148e1090b42fd2f67fd34c7e94ca505447c1431485eca09ed1fe0b), - (0x35de09079a5b05d25f756479ea044c654c97043bc4a79b34f860faa9b049337a, 0x06c4cc500093cfdc9bd284f3c44a2a8856cfc8ce70786dd65787397292e4fe53), - (0x235b63a940346f07c5a669831067ba59acb3b9936db7d66c4a4cf6746af5f97e, 0x0d838f859fb1386034263d43ace744961a310f548f7274586f133aa4ddc779a9), + (0x18cd12d5f4e12bd7247a8fd7cc93ded7a8a9b60935b319b2db578a8fceef9559, 0x16b15af4fcfb9ed75533e7a4c1966cae5621f10dc1dfbba39a491ec37c911b5e), + (0x37e70146801841d95832259e4d8f39aeee8a364ea5007f82aa84a0e387231315, 0x20ef65833381c985722a95e65125a1123cab3357741168a5ed7e92e972dbd30d), + (0x12e3af8e507a2ca30e544568cf319701ecbc29dc5919f0198d541938edecc8f3, 0x3fb1bb2804faaa4c215e93694d5d1e6f87874cb8c34cb9206ff958de14e44275), + (0x334d99f316343f01c8eb67e327c76f743f8de7f957c893c6f30ccd87e5d1af3a, 0x1da64caf127c8eb513653791147a85ed1edcca12935c95b7d615a9377c9406d8), + (0x1430dca15080286939046d3cb9fb7ace4ed1da2fbe7a362e8f3575489bc6e3e1, 0x1ef5f4aff2902f3bc8acb2cc884a2d44334f910a68b2701f1c37943652b46d8f), + (0x02ebdeac7e91b3d15e4b7c0533e42678672ec384d51e51e22342be7edeeb8074, 0x03638952e0489de03ff03236433f5d2617cb4ddd0a72637ed31095deca85a2a6), + (0x31179b7f5b01ad2a55cf9a66f57b696e9b9cb4919cca426d469b270827f3018b, 0x2b231a9a71b674cc546ba9b36916a13411648903cfdcb808926fc47ee745586c), + (0x0673497660cec8a8c391cfb16f5ffdcb710f9e9e194a1a85935cf4bc45b01359, 0x15ce8801c51811f0256a43f762e497fe38c88866c09bb256289d93e0393dc225), + (0x098d2a0cfedae91fe29e21a01b5e43045b9cc8d9a334f1aee3e075f36a16e323, 0x0be47cc41643c9e6d95012428d5b46ae5a44e765392e05152a0181e30689d8b6), (0x02adb7cbc9ebbbd87d7d6a41fc40cb4cf57585c6243aa204f757c9026ef20fd3, 0x327fc06fee179c6a57ed95336f9fb7854420d80dd191251a40935664ff6c8067), (0x2d00d4ec8aa5e4b3d035131f559e4a97f896e8dbc39badb92b58a8d46b5e91df, 0x37046fb32ed8eb4ba0b4da8e1c9b56cd3832fa2ed4788f7faf4fee1f76a94c32), (0x212f5afd70e787e2fd951e0ddc5430d1fa78f988c30740384d18cf9ff276b43b, 0x20c5a150e200caddf9a35a993668fc4742be5d924d1086f05c74ef6a78b5feb2), @@ -28342,30 +28342,30 @@ PinnedVerificationKey { (0x13d0bd76da4ace22c0e90b098d6073551322b8c734bf37eeca67fbf19687f550, 0x3d996cc9da5a31cefb453390b906eabbcc75797bc6a6b9c9e3af2fe7b6b8beed), (0x04cad7405b492a30db0a710c842cecc97d02059acf4c02aa79626dce68ac4837, 0x3d6d7b6698b258e61ebe0b25d9cbcd4a016cb0a2ae8d92752532d98cfb27720d), (0x0974ad1a3c0eb4c8d2c59cd820a82b7f28ea2f7a245008d403815131ff30879e, 0x00bb593cdf920cef4965f788d65eba3c3aa07d9718dfb62e3e385849a0d692a8), - (0x3806a39c587dc730cc767713a1ed65cb3171b2b731553d39b84d0896ed46bad9, 0x2b187668497f037b5a72aeeca3b642efc01f536ec6c368c5eef2fe9d54c6cfbb), - (0x171ba8f97a0e12f975056bfb652b5667bc6e2759c4d4fb4de17064ecb60beeaf, 0x055bd6ea2501053cb07723245da65bd46a5bccd52d12073d76ce92e46ab29686), + (0x129898b6bcca9f9ff44f5dc76cb26bc229fa8b14ff47d9153680b0ba5c5efbf6, 0x1be1a12569bd9d26ac6225d404a52099198520eebec3ae1ef5de8a18d74b6116), + (0x3f30174d44efaca9cb31c8b6b6f4f4aaeedba6a974ea72f16ea9259099054bdc, 0x1f0de3c85053cd0d1f07c5edeb276c03c9c8614e78736626d7024eb6987c24ed), (0x1e355d783cffccafc120f462461fb312773442762383ac444009653f3d8d4be6, 0x3c60e17b18492aa2c41798b409d2bcc1857ca57ee9d2fb0001584cedc8e141d6), (0x32059fe4e96eb002f24f6e6090014f7b3baf23946cc31a11341543a5a184903c, 0x3793fd512a65c7aa7c17a42e855eb8be26aa644165a9bc963c368baf0e5cce9d), (0x0a6fe1cc1ce659681079768ca8ff94d82c7d51ef39cd99b738b144de3a3027f6, 0x30cfc2f4e0ec95f623199970d8b762647ad2d7c3591a20781ee8187702babe5f), - (0x29085e497c6097147a72a256459a7237a9bc8cb8e66b56a60f4839468f50ab7b, 0x3a8f21bdd0be7b7d0f641745f5008eedf16f02f04df65691045ef7b21d91443c), - (0x1fcae59b79411349d85836f3dfcba5ab523c2aa1426f62ddf80b7f85e41dfce5, 0x3d0eeb91ef1e68f59a6aead5c4e536f7d6a78721666002d0a92b0b923def40c7), - (0x161c09589b8e0e1d1712b98a4b5cea260d48365ab3f2bba6faec85a2b1966fe6, 0x29e201d0935308e8b1b04ef13c0b9b6891948f69da260bc5c8b12b62aa21155d), - (0x0e6d6b798948be5e9577257fcac9226c659ba7d6040b3b5d0c2df7bf541f18b7, 0x169ba3030178091cce287c13af9b83b376988cc95bc0aa51ea387be0e74964dd), + (0x00d87a2c430f1db50a63f18f8cf8807f4f70d3acb940d4130ba6811f8ba2d479, 0x13d5742320e1b2cecda6073b7f2bf5816b9067453deeaa829f356a65ef5621b2), + (0x3118979ade023f3977d034f86eed6506d7e0586ead81f80bc5ca01a7660ee0c9, 0x30f6731193d5c786cf61b05523c05e2664a066c2d39a685588f02883057320ad), + (0x0df51bd411d5f95da66fcc57f5e4d8dbcca3d82b08ceb61e9ff1befa074e08d3, 0x11c9092b6d02c46f173b0108854499ca4922afaf58e0734e77a6088715e84b64), + (0x24289014ede2672df8e8e32eb4e0d71709846041319fb85b1328cdb3b8764565, 0x0833de9c0b76ae816df0e41ae33daece27c63a41f2ba9abbbc7c08724211b50c), ], permutation: VerifyingKey { commitments: [ - (0x0fbd38d3edc5a2548fee21b4aaab8548eb717b2866c3e7905def92ab41123bd3, 0x1f6d299f0181a6cae84d84c093e68e459271fabef938368eb71c928f351e275d), - (0x29f078d82ad78281cabc78f49c808c4f86b22bd4029b3c03c14e2d5d105eeff0, 0x28f20d695afaed04cda27e52460e71c7ddac016f56fba5730c780bb79304b26e), - (0x3b499a325a876c16aaa0a7621b772c600fd310ef3b690a247fbd4cb270a9a127, 0x1c080b1d2561f1283dab49893a96084b421c501f3b52f28a4afb86a90dcad65e), - (0x255ee788dfb0159fd0b0f5f09d1c69e4ec67337a48a75636f52e8bf6efe8994c, 0x09093cdab6ef83ac64bde2b2252a91944801c8d3e0877c526e592f3d6aca168d), - (0x1f86b1c66c980456a5f80fad06bb3ba739590e53951e2ca40aef5157cb637639, 0x20b35b7cd45a239671f7ccf917411f4f703630b4dc9d41192b44f0d84eac59c0), - (0x046fee5aff0ed40810369bbc1d76f9832fc38ae5ea6d5804e5908e162cbb44ae, 0x07ece7ed5973a1c46b3302ea4cca43b9a7f55f2f5d75cab755860ad65928de17), - (0x02f0c3fbef4a3d9ca3a5a8367285040bc7e2e3837adf0decc601f5ca52986667, 0x1b287e8f1d2812e2051d31e0b8f5b44ad8a42c28b3f23b39f9dab54040197c10), - (0x0a25c502dd5fbc50d0b9bc0c4b73ebdb68212cb3d8919d304366a95cca9273cf, 0x10d56a7902ae750304bb5b397a442e7bb20de731ef393bd5a4bde4b821676f43), - (0x2ce5cc97761c46326b70b86b5c7f5a2b6835ecfc5b19735bc6d69be9d53236c4, 0x182442dbc817aa8926dc78761be286048ac57fd15d5c9e72210013dd77d68a79), - (0x0babcc3c20e0909cfd33f33b2afd5ef7928e935655614a7783a41d54783b8641, 0x1203a94185e9c222b2965adf896f2c7093f151f73f141cb0b6275a9428d56046), - (0x24836d91a72ea59da98dbecda06b12fdfe73bf870cba478b5da6e5a0214c6d42, 0x1d3848af33d96a5fce26243cf19c147260ab903a275bf9a03ff3db91f6a22971), - (0x319f25dcc4b43eaf7767eb2330cb1f31d8790418bd073cb0c03d6c0dcfbdf3c8, 0x1de3e74aee1b1d661c73d0a86c5bf718a76d55ab446973fd2a8038bced640a3e), + (0x2ad778f0e75a3dcad7c0cc2215e554f3d6fe41eabd612c487ea2708d59fb2e7e, 0x0561e9268230b53ec9cac0fd7654b3edaa3851f624c62bdae39519ae17526c06), + (0x358a21858e7f0da213959badd192b12e7bd40f6b18f5617a7fbad1f142b53c41, 0x1cc665c7a95332ea3ecb79bc35c4d672837809470691ad6a96f2eca081ca9c98), + (0x28d6468db328f1d201b3b7ca36f3affddee9dd0043d8868e34f1839742ac3190, 0x2f38eba3a82748cc28e46c1e20b7d343fdac7ef726ed6de89f6484c6070204f1), + (0x21f27b52cd9a76e1dbbf572fbfc0262007015777b68bda954f3c9db60ebb27f9, 0x0dbbf8f04e8476544a853e54093689d59935de9194eef24a0ee04d6faef9423f), + (0x0253a69e81add6bc1c2fe14bd90dab3e3c2603747dd3760c9dd1e341d96a79ed, 0x15cbe812a45a46512cc8ed493250f75a9dcaaee4be0d3bdaee8b43d74c50481f), + (0x19eb8760e7d0e6ae6d28d65627d958661cdde4e58a0aeb55a6b7017bcf723002, 0x064575794bf9bfdbc50e94b8afbbd2851ae4e12ff2809777d28fe71c235727d9), + (0x0e5c408b5224841cb4f75aec5cdb7bc95c150bbe858dbde8dbac9f72e5392462, 0x01030c69ac5fc7dd63e4e0bb1718d26f51b79dccc81e0b172e98c26e59145414), + (0x12437cb05ecff24131b52b5a55f6f143d8437c28c9d7c31eb06cfa093972a64b, 0x06e1a5e39566b4ce097a6c7dace6dcb827e54dac7d64fa79d994fb1557717614), + (0x34636ff9de412da15f41a8a006abbe8f43a5cffc94e6c3deb02f98af4fb2b8c7, 0x0270f0c3fa8cc7338f20fbcd5ec4e62799e051e0c5938d9e8c41581de8da6165), + (0x218e047b1c0a3b92c59539b3f6d9c23d34ebeeb65ca0be98f5e0e9642bdf1085, 0x20c1117f40b375688a94ff5c5c0b70004e43c7c7cd492fe8055fea081ea5ca78), + (0x2478c8226d4ede1c203fa7455b5fe28f99d5a0cb8ccdb5be4b54d5edcce974c4, 0x1ce69b76f05daeae57cd3d452370439237da89f2ddc84f7b2e35703acbf99655), + (0x08383138ecc6f2fb5459043c7666ae3df7802f1f02392af44db6ba25cd7d2c56, 0x20957d7a3f00a8589f627c5f5e471f45a84fbcbdcde00dfc97b9a97f3f723202), (0x21d210b41675a1eae44cbd0f3fd27d69e30716c71873f6089cee61acacd403ab, 0x2275e97c7e84f68bfaa528a9d8be4e059f7abefd80d03fbfca774e8414a9b7c1), (0x0f9e7de28e0f650d99d99d95c0fcd39c9dac9db5aa1973319f66922d6eb9f7d5, 0x1ba644ecc18ad711ddd33af7f695f6834e9f35c93d47a6a5273dabbe800fc7e6), (0x0aab3ab73afac76277cd94a891de15e42ceb09f3a9865dab5c814bebfbb4453f, 0x27119fec3736d99abeeef1ad7b857db7e754e0c158780ed3dd0cdd4dc2453e10),