Browse Source

Statically initialize constants

pull/3/head
Rob Knight 1 month ago
parent
commit
e67cdf9743
Failed to extract signature
2 changed files with 37 additions and 32 deletions
  1. +1
    -0
      Cargo.toml
  2. +36
    -32
      src/lib.rs

+ 1
- 0
Cargo.toml

@ -12,6 +12,7 @@ readme = "README.md"
ark-ff = "0.4.0"
ark-bn254 = { version = "0.4.0" }
ark-std = { version = "0.4.0" }
lazy_static = "1.4.0"
[dev-dependencies]
criterion = "0.3"

+ 36
- 32
src/lib.rs

@ -3,10 +3,12 @@ use ark_ff::fields::Field;
use ark_std::str::FromStr;
use ark_std::Zero;
use core::ops::{AddAssign, MulAssign};
use lazy_static::lazy_static;
mod constants;
#[derive(Debug)]
#[derive(Debug, Clone)]
pub struct Constants {
pub c: Vec<Vec<Fr>>,
pub m: Vec<Vec<Vec<Fr>>>,
@ -14,38 +16,40 @@ pub struct Constants {
pub n_rounds_p: Vec<usize>,
}
pub fn load_constants() -> Constants {
let (c_str, m_str) = constants::constants();
let mut c: Vec<Vec<Fr>> = Vec::new();
for i in 0..c_str.len() {
let mut cci: Vec<Fr> = Vec::new();
for j in 0..c_str[i].len() {
let b: Fr = Fr::from_str(c_str[i][j]).unwrap();
cci.push(b);
lazy_static! {
static ref POSEIDON_CONSTANTS: Constants = {
let (c_str, m_str) = constants::constants();
let mut c: Vec<Vec<Fr>> = Vec::new();
for i in 0..c_str.len() {
let mut cci: Vec<Fr> = Vec::new();
for j in 0..c_str[i].len() {
let b: Fr = Fr::from_str(c_str[i][j]).unwrap();
cci.push(b);
}
c.push(cci);
}
c.push(cci);
}
let mut m: Vec<Vec<Vec<Fr>>> = Vec::new();
for i in 0..m_str.len() {
let mut mi: Vec<Vec<Fr>> = Vec::new();
for j in 0..m_str[i].len() {
let mut mij: Vec<Fr> = Vec::new();
for k in 0..m_str[i][j].len() {
let b: Fr = Fr::from_str(m_str[i][j][k]).unwrap();
mij.push(b);
let mut m: Vec<Vec<Vec<Fr>>> = Vec::new();
for i in 0..m_str.len() {
let mut mi: Vec<Vec<Fr>> = Vec::new();
for j in 0..m_str[i].len() {
let mut mij: Vec<Fr> = Vec::new();
for k in 0..m_str[i][j].len() {
let b: Fr = Fr::from_str(m_str[i][j][k]).unwrap();
mij.push(b);
}
mi.push(mij);
}
mi.push(mij);
m.push(mi);
}
m.push(mi);
}
Constants {
c,
m,
n_rounds_f: 8,
n_rounds_p: vec![
56, 57, 56, 60, 60, 63, 64, 63, 60, 66, 60, 65, 70, 60, 64, 68,
],
}
Constants {
c,
m,
n_rounds_f: 8,
n_rounds_p: vec![
56, 57, 56, 60, 60, 63, 64, 63, 60, 66, 60, 65, 70, 60, 64, 68,
],
}
};
}
pub struct Poseidon {
@ -54,7 +58,7 @@ pub struct Poseidon {
impl Poseidon {
pub fn new() -> Poseidon {
Poseidon {
constants: load_constants(),
constants: POSEIDON_CONSTANTS.clone(),
}
}
pub fn ark(&self, state: &mut Vec<Fr>, c: &[Fr], it: usize) {
@ -119,7 +123,7 @@ mod tests {
#[test]
fn test_load_constants() {
let cons = load_constants();
let cons = POSEIDON_CONSTANTS.clone();
assert_eq!(
cons.c[0][0].to_string(),
"4417881134626180770308697923359573201005643519861877412381846989312604493735"

Loading…
Cancel
Save