diff --git a/acvm-repo/bn254_blackbox_solver/src/embedded_curve_ops.rs b/acvm-repo/bn254_blackbox_solver/src/embedded_curve_ops.rs index 1070a3a9bc1..a956cfeb1dd 100644 --- a/acvm-repo/bn254_blackbox_solver/src/embedded_curve_ops.rs +++ b/acvm-repo/bn254_blackbox_solver/src/embedded_curve_ops.rs @@ -1,4 +1,3 @@ -// TODO(https://github.com/noir-lang/noir/issues/4932): rename this file to something more generic use ark_ec::AffineRepr; use ark_ff::MontConfig; use num_bigint::BigUint; @@ -9,6 +8,19 @@ use acir::BlackBoxFunc; use crate::BlackBoxResolutionError; +/// Converts a field element to u128, returning an error if it doesn't fit. +fn field_to_u128_limb( + limb: &FieldElement, + func: BlackBoxFunc, +) -> Result { + limb.try_into_u128().ok_or_else(|| { + BlackBoxResolutionError::Failed( + func, + format!("Limb {} is not less than 2^128", limb.to_hex()), + ) + }) +} + /// Performs multi scalar multiplication of points with scalars. pub fn multi_scalar_mul( points: &[FieldElement], @@ -33,19 +45,11 @@ pub fn multi_scalar_mul( create_point(points[i], points[i + 1], points[i + 2] == FieldElement::from(1_u128)) .map_err(|e| BlackBoxResolutionError::Failed(BlackBoxFunc::MultiScalarMul, e))?; - let scalar_low: u128 = scalars_lo[i / 3].try_into_u128().ok_or_else(|| { - BlackBoxResolutionError::Failed( - BlackBoxFunc::MultiScalarMul, - format!("Limb {} is not less than 2^128", scalars_lo[i].to_hex()), - ) - })?; + let scalar_low: u128 = + field_to_u128_limb(&scalars_lo[i / 3], BlackBoxFunc::MultiScalarMul)?; - let scalar_high: u128 = scalars_hi[i / 3].try_into_u128().ok_or_else(|| { - BlackBoxResolutionError::Failed( - BlackBoxFunc::MultiScalarMul, - format!("Limb {} is not less than 2^128", scalars_hi[i].to_hex()), - ) - })?; + let scalar_high: u128 = + field_to_u128_limb(&scalars_hi[i / 3], BlackBoxFunc::MultiScalarMul)?; let mut bytes = scalar_high.to_be_bytes().to_vec(); bytes.extend_from_slice(&scalar_low.to_be_bytes()); diff --git a/acvm-repo/bn254_blackbox_solver/src/lib.rs b/acvm-repo/bn254_blackbox_solver/src/lib.rs index 6a06b521422..d7cd6048b8a 100644 --- a/acvm-repo/bn254_blackbox_solver/src/lib.rs +++ b/acvm-repo/bn254_blackbox_solver/src/lib.rs @@ -5,13 +5,12 @@ use acvm_blackbox_solver::{BlackBoxFunctionSolver, BlackBoxResolutionError}; mod embedded_curve_ops; mod generator; mod poseidon2; +mod poseidon2_constants; pub use embedded_curve_ops::{embedded_curve_add, multi_scalar_mul}; pub use generator::generators::derive_generators; -pub use poseidon2::{ - POSEIDON2_CONFIG, Poseidon2Config, Poseidon2Sponge, field_from_hex, poseidon_hash, - poseidon2_permutation, -}; +pub use poseidon2::{Poseidon2Sponge, poseidon_hash, poseidon2_permutation}; +pub use poseidon2_constants::{POSEIDON2_CONFIG, Poseidon2Config, field_from_hex}; // Temporary hack, this ensure that we always use a bn254 field here // without polluting the feature flags of the `acir_field` crate. diff --git a/acvm-repo/bn254_blackbox_solver/src/poseidon2.rs b/acvm-repo/bn254_blackbox_solver/src/poseidon2.rs index fceb6aa3fb5..6a8778e0654 100644 --- a/acvm-repo/bn254_blackbox_solver/src/poseidon2.rs +++ b/acvm-repo/bn254_blackbox_solver/src/poseidon2.rs @@ -1,8 +1,8 @@ use acir::AcirField; use acvm_blackbox_solver::BlackBoxResolutionError; -use lazy_static::lazy_static; use crate::FieldElement; +use crate::poseidon2_constants::{POSEIDON2_CONFIG, Poseidon2Config}; pub fn poseidon2_permutation( inputs: &[FieldElement], @@ -15,420 +15,6 @@ pub(crate) struct Poseidon2<'a> { config: &'a Poseidon2Config, } -pub struct Poseidon2Config { - pub t: u32, - pub rounds_f: u32, - pub rounds_p: u32, - pub internal_matrix_diagonal: [FieldElement; 4], - pub round_constant: [[FieldElement; 4]; 64], -} - -pub fn field_from_hex(hex: &str) -> FieldElement { - FieldElement::from_be_bytes_reduce(&hex::decode(hex).expect("Should be passed only valid hex")) -} - -lazy_static! { - pub static ref INTERNAL_MATRIX_DIAGONAL: [FieldElement; 4] = [ - field_from_hex("10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e7"), - field_from_hex("0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b"), - field_from_hex("00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac15"), - field_from_hex("222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b"), - ]; - pub static ref ROUND_CONSTANT: [[FieldElement; 4]; 64] = [ - [ - field_from_hex("19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e5"), - field_from_hex("265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d6"), - field_from_hex("199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa"), - field_from_hex("157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8"), - ], - [ - field_from_hex("2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac94902"), - field_from_hex("0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e"), - field_from_hex("251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b996"), - field_from_hex("13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e"), - ], - [ - field_from_hex("0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd4738"), - field_from_hex("011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca06"), - field_from_hex("0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f367549"), - field_from_hex("04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b"), - ], - [ - field_from_hex("0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e8"), - field_from_hex("259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f"), - field_from_hex("28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a1"), - field_from_hex("0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447"), - ], - [ - field_from_hex("0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf811"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee75"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c5"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d0"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e5574"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d85"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e08"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd59"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b87"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd83517926"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("062100eb485db06269655cf186a68532985275428450359adc99cec6960711b8"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e0"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce5"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad9"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d729"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("0094975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d65"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde187"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f3"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b0"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("00b7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b64"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb173"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad16"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed705"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea9"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f16"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d0"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e5"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d83505"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a5319025"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a6800355"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), - ], - [ - field_from_hex("1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d38"), - field_from_hex("0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e5"), - field_from_hex("1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c"), - field_from_hex("25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f"), - ], - [ - field_from_hex("0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a"), - field_from_hex("13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a96"), - field_from_hex("2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce"), - field_from_hex("21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959"), - ], - [ - field_from_hex("05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b"), - field_from_hex("0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a4"), - field_from_hex("0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf"), - field_from_hex("09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f1455"), - ], - [ - field_from_hex("0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd4335"), - field_from_hex("2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b"), - field_from_hex("1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df"), - field_from_hex("176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404"), - ], - ]; - pub static ref POSEIDON2_CONFIG: Poseidon2Config = Poseidon2Config { - t: 4, - rounds_f: 8, - rounds_p: 56, - internal_matrix_diagonal: *INTERNAL_MATRIX_DIAGONAL, - round_constant: *ROUND_CONSTANT, - }; -} - impl Poseidon2<'_> { pub(crate) fn new() -> Self { Poseidon2 { config: &POSEIDON2_CONFIG } @@ -535,6 +121,7 @@ impl Poseidon2<'_> { pub fn poseidon_hash(inputs: &[FieldElement]) -> Result { let two_pow_64 = 18446744073709551616_u128.into(); let iv = FieldElement::from(inputs.len()) * two_pow_64; + // A rate of 3, with a width of 4, gives 1 field element of capacity, i.e ~128 bits of security let mut sponge = Poseidon2Sponge::new(iv, 3); for input in inputs.iter() { sponge.absorb(*input)?; @@ -604,7 +191,8 @@ impl<'a> Poseidon2Sponge<'a> { mod test { use acir::AcirField; - use super::{FieldElement, field_from_hex, poseidon2_permutation}; + use super::{FieldElement, poseidon2_permutation}; + use crate::poseidon2_constants::field_from_hex; #[test] fn smoke_test() { diff --git a/acvm-repo/bn254_blackbox_solver/src/poseidon2_constants.rs b/acvm-repo/bn254_blackbox_solver/src/poseidon2_constants.rs new file mode 100644 index 00000000000..432cb2cb64f --- /dev/null +++ b/acvm-repo/bn254_blackbox_solver/src/poseidon2_constants.rs @@ -0,0 +1,448 @@ +/// Poseidon2 constants for BN254 field +/// +/// This module contains the precomputed constants used in the Poseidon2 hash function +/// for the BN254 curve. +use acir::AcirField; +use lazy_static::lazy_static; + +use crate::FieldElement; + +/// Configuration parameters for Poseidon2 permutation +pub struct Poseidon2Config { + /// State width (or state size, number of field elements in the permutation state). + pub t: u32, + + /// Number of full rounds (also called R_F). + /// In full rounds, the S-box is applied to all state elements. + pub rounds_f: u32, + + /// Number of partial rounds (also called R_P). + /// In partial rounds, the S-box is applied only to the first state element. + pub rounds_p: u32, + + /// Internal matrix diagonal values used in the linear layer of partial rounds. + pub internal_matrix_diagonal: [FieldElement; 4], + + /// Round constants added to the state in each round. + pub round_constant: [[FieldElement; 4]; 64], +} + +/// Helper function to convert hex strings to field elements +pub fn field_from_hex(hex: &str) -> FieldElement { + FieldElement::from_be_bytes_reduce(&hex::decode(hex).expect("Should be passed only valid hex")) +} + +lazy_static! { + + /// The complete Poseidon2 configuration for BN254. + /// This includes all parameters and constants needed for the permutation. + pub static ref POSEIDON2_CONFIG: Poseidon2Config = Poseidon2Config { + // The value of 4 is optimized for a PLONK proving system width of 4, + // to align with the number of witness columns available in the constraint system. + t: 4, + rounds_f: 8, + rounds_p: 56, + internal_matrix_diagonal: *INTERNAL_MATRIX_DIAGONAL, + round_constant: *ROUND_CONSTANT, + }; + + /// Internal matrix diagonal for Poseidon2 permutation. + /// These values are used in the internal rounds for linear layer mixing. + pub static ref INTERNAL_MATRIX_DIAGONAL: [FieldElement; 4] = [ + field_from_hex("10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e7"), + field_from_hex("0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b"), + field_from_hex("00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac15"), + field_from_hex("222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b"), + ]; + + /// Round constants for all rounds of Poseidon2. + /// Contains 64 rounds, each with 4 field elements. + pub static ref ROUND_CONSTANT: [[FieldElement; 4]; 64] = [ + [ + field_from_hex("19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e5"), + field_from_hex("265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d6"), + field_from_hex("199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa"), + field_from_hex("157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8"), + ], + [ + field_from_hex("2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac94902"), + field_from_hex("0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e"), + field_from_hex("251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b996"), + field_from_hex("13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e"), + ], + [ + field_from_hex("0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd4738"), + field_from_hex("011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca06"), + field_from_hex("0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f367549"), + field_from_hex("04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b"), + ], + [ + field_from_hex("0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e8"), + field_from_hex("259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f"), + field_from_hex("28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a1"), + field_from_hex("0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447"), + ], + [ + field_from_hex("0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf811"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee75"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c5"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d0"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e5574"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d85"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e08"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd59"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b87"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd83517926"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("062100eb485db06269655cf186a68532985275428450359adc99cec6960711b8"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e0"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce5"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad9"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d729"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("0094975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d65"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde187"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f3"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b0"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("00b7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b64"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb173"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad16"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed705"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea9"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f16"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d0"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e5"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d83505"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a5319025"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a6800355"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + field_from_hex("0000000000000000000000000000000000000000000000000000000000000000"), + ], + [ + field_from_hex("1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d38"), + field_from_hex("0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e5"), + field_from_hex("1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c"), + field_from_hex("25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f"), + ], + [ + field_from_hex("0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a"), + field_from_hex("13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a96"), + field_from_hex("2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce"), + field_from_hex("21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959"), + ], + [ + field_from_hex("05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b"), + field_from_hex("0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a4"), + field_from_hex("0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf"), + field_from_hex("09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f1455"), + ], + [ + field_from_hex("0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd4335"), + field_from_hex("2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b"), + field_from_hex("1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df"), + field_from_hex("176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404"), + ], + ]; + + +}