Allow passing CellValue as input word to Poseidon gadget.

Update circuit description.
This commit is contained in:
therealyingtong 2021-11-04 12:07:27 +01:00
parent dfcea20569
commit de37248749
4 changed files with 55 additions and 67 deletions

View File

@ -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<pallas::Base> 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>,

View File

@ -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<F: FieldExt, S: Spec<F, T, RATE>, const T: usize,
Chip<F>
{
/// Variable representing the word over which the Poseidon permutation operates.
type Word: Copy + fmt::Debug;
type Word: Copy + fmt::Debug + From<CellValue<F>>;
/// 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<F, S, T, RATE>,
@ -149,13 +151,13 @@ impl<
pub fn absorb(
&mut self,
mut layouter: impl Layouter<F>,
value: Word<F, PoseidonChip, S, T, RATE>,
value: CellValue<F>,
) -> 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<F>,
message: [Word<F, PoseidonChip, S, T, RATE>; L],
message: [CellValue<F>; L],
) -> Result<Word<F, PoseidonChip, S, T, RATE>, Error> {
for (i, value) in array::IntoIter::new(message).enumerate() {
self.duplex

View File

@ -431,6 +431,12 @@ impl<F: FieldExt> From<StateWord<F>> for CellValue<F> {
}
}
impl<F: FieldExt> From<CellValue<F>> for StateWord<F> {
fn from(cell_value: CellValue<F>) -> StateWord<F> {
StateWord::new(cell_value.cell(), cell_value.value())
}
}
#[derive(Debug)]
struct Pow5T3State<F: FieldExt>([StateWord<F>; 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(

View File

@ -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),