arnaucube
arnaucube/babyjubjub-arkPublic Self-hosted repository
Poseidon load static ref avoiding load each time

Benchmarks (On a Intel(R) Core(TM) i7-8705G CPU @ 3.10GHz, with 32 GB of RAM):
- Old:
```
sign                    time:   [953.50 us 953.73 us 953.98 us]
verify                  time:   [832.24 us 832.38 us 832.52 us]
```

- New:
```
sign                    time:   [559.84 us 568.41 us 576.26 us]
verify                  time:   [376.59 us 376.68 us 376.78 us]
```
arnaucube root@arnaucube.com
Mon, 07 Sep 2020 23:09:08 +0200
commit

d893ecc5f677dca9b0c3f48f2fe04f32c5cead7f

parent

693c7be161d573f2132e3dc8ca62202ca76e6ba7

2 files changed, 2 insertions(+), 5 deletions(-)

jump to
M Cargo.toml → Cargo.toml

@@ -20,7 +20,7 @@ generic-array = "0.13.2"

tiny-keccak = "1.5" rustc-hex = "1.0.0" mimc-rs = "0.0.2" -poseidon-rs = "0.0.3" +poseidon-rs = "0.0.4" arrayref = "0.3.5" lazy_static = "1.4.0"
M src/lib.rs → src/lib.rs

@@ -73,6 +73,7 @@ 10,

) .unwrap() >> 3; + static ref poseidon: poseidon_rs::Poseidon = Poseidon::new(); } #[derive(Clone, Debug)]

@@ -306,7 +307,6 @@ let r8: Point = B8.mul_scalar(&r)?;

let a = &self.public()?; let hm_input = vec![r8.x.clone(), r8.y.clone(), a.x.clone(), a.y.clone(), msgFr]; - let poseidon = Poseidon::new(); let hm = poseidon.hash(hm_input)?; let mut s = &self.key << 3;

@@ -345,7 +345,6 @@ return Err("msg outside the Finite Field".to_string());

} let msgFr: Fr = Fr::from_str(&msg.to_string()).unwrap(); let hm_input = vec![pk.x.clone(), pk.y.clone(), c.x.clone(), c.y.clone(), msgFr]; - let poseidon = Poseidon::new(); let h = poseidon.hash(hm_input)?; println!("h {:?}", h.to_string()); let hB = BigInt::parse_bytes(to_hex(&h).as_bytes(), 16).unwrap();

@@ -387,7 +386,6 @@ pub fn verify(pk: Point, sig: Signature, msg: BigInt) -> bool {

if msg > Q.clone() { return false; } - let (_, msg_bytes) = msg.to_bytes_be(); let msgFr: Fr = Fr::from_str(&msg.to_string()).unwrap(); let hm_input = vec![ sig.r_b8.x.clone(),

@@ -396,7 +394,6 @@ pk.x.clone(),

pk.y.clone(), msgFr, ]; - let poseidon = Poseidon::new(); let hm = match poseidon.hash(hm_input) { Result::Err(_) => return false, Result::Ok(hm) => hm,