Skip to content

Commit

Permalink
Greatly improve deserialization costs (-17% on total steps count of g…
Browse files Browse the repository at this point in the history
…roth16 proof verification) (#183)
  • Loading branch information
feltroidprime committed Sep 1, 2024
1 parent 832db54 commit e7f232d
Show file tree
Hide file tree
Showing 5 changed files with 155 additions and 102 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from garaga.starknet.cli.utils import create_directory
from garaga.starknet.groth16_contract_generator.parsing_utils import Groth16VerifyingKey

ECIP_OPS_CLASS_HASH = 0x27DE49A25C7018DBED18F7B000D8FB02701BD68B912CD5B9FE74703A6E6CC0A
ECIP_OPS_CLASS_HASH = 0x706D9F048C192D39BAA87DCFEB834AD4652DC1DFCA74EAF285EFE44CB8CA2A1


def precompute_lines_from_vk(vk: Groth16VerifyingKey) -> StructArray:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ mod Groth16VerifierBLS12_381 {
use super::{N_PUBLIC_INPUTS, vk, ic, precomputed_lines};

const ECIP_OPS_CLASS_HASH: felt252 =
0x27de49a25c7018dbed18f7b000d8fb02701bd68b912cd5b9fe74703a6e6cc0a;
0x706d9f048c192d39baa87dcfeb834ad4652dc1dfca74eaf285efe44cb8ca2a1;
use starknet::ContractAddress;

#[storage]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ mod Groth16VerifierBN254 {
use super::{N_PUBLIC_INPUTS, vk, ic, precomputed_lines};

const ECIP_OPS_CLASS_HASH: felt252 =
0x27de49a25c7018dbed18f7b000d8fb02701bd68b912cd5b9fe74703a6e6cc0a;
0x706d9f048c192d39baa87dcfeb834ad4652dc1dfca74eaf285efe44cb8ca2a1;
use starknet::ContractAddress;

#[storage]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ mod Risc0Groth16VerifierBN254 {
use super::{N_FREE_PUBLIC_INPUTS, vk, ic, precomputed_lines, T};

const ECIP_OPS_CLASS_HASH: felt252 =
0x27de49a25c7018dbed18f7b000d8fb02701bd68b912cd5b9fe74703a6e6cc0a;
0x706d9f048c192d39baa87dcfeb834ad4652dc1dfca74eaf285efe44cb8ca2a1;
use starknet::ContractAddress;

#[storage]
Expand Down
249 changes: 151 additions & 98 deletions src/src/definitions.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@ pub impl u384Serde of Serde<u384> {
output.append((*self.limb3).into());
}
fn deserialize(ref serialized: Span<felt252>) -> Option<u384> {
let limb0 = downcast(serialized.pop_front().unwrap()).unwrap();
let limb1 = downcast(serialized.pop_front().unwrap()).unwrap();
let limb2 = downcast(serialized.pop_front().unwrap()).unwrap();
let limb3 = downcast(serialized.pop_front().unwrap()).unwrap();
let [l0, l1, l2, l3] = (*serialized.multi_pop_front::<4>().unwrap()).unbox();
let limb0 = downcast(l0).unwrap();
let limb1 = downcast(l1).unwrap();
let limb2 = downcast(l2).unwrap();
let limb3 = downcast(l3).unwrap();
return Option::Some(u384 { limb0: limb0, limb1: limb1, limb2: limb2, limb3: limb3 });
}
}
Expand Down Expand Up @@ -57,7 +58,7 @@ struct G1G2Pair {
q: G2Point,
}

#[derive(Copy, Drop, Debug, PartialEq, Serde)]
#[derive(Copy, Drop, Debug, PartialEq)]
struct E12D {
w0: u384,
w1: u384,
Expand All @@ -73,99 +74,151 @@ struct E12D {
w11: u384,
}

impl SpanE12DSerde of Serde<Span<E12D>> {
fn serialize(self: @Span<E12D>, ref output: Array<felt252>) {
let Z = *self;
output.append(Z.len().into());
for e12 in Z {
e12.serialize(ref output);
}
}

fn deserialize(ref serialized: Span<felt252>) -> Option<Span<E12D>> {
let mut n = *serialized.pop_front().unwrap();
let mut arr: Array<E12D> = ArrayTrait::new();
while n != 0 {
arr
.append(
E12D {
w0: u384 {
limb0: downcast(serialized.pop_front().unwrap()).unwrap(),
limb1: downcast(serialized.pop_front().unwrap()).unwrap(),
limb2: downcast(serialized.pop_front().unwrap()).unwrap(),
limb3: downcast(serialized.pop_front().unwrap()).unwrap()
},
w1: u384 {
limb0: downcast(serialized.pop_front().unwrap()).unwrap(),
limb1: downcast(serialized.pop_front().unwrap()).unwrap(),
limb2: downcast(serialized.pop_front().unwrap()).unwrap(),
limb3: downcast(serialized.pop_front().unwrap()).unwrap()
},
w2: u384 {
limb0: downcast(serialized.pop_front().unwrap()).unwrap(),
limb1: downcast(serialized.pop_front().unwrap()).unwrap(),
limb2: downcast(serialized.pop_front().unwrap()).unwrap(),
limb3: downcast(serialized.pop_front().unwrap()).unwrap()
},
w3: u384 {
limb0: downcast(serialized.pop_front().unwrap()).unwrap(),
limb1: downcast(serialized.pop_front().unwrap()).unwrap(),
limb2: downcast(serialized.pop_front().unwrap()).unwrap(),
limb3: downcast(serialized.pop_front().unwrap()).unwrap()
},
w4: u384 {
limb0: downcast(serialized.pop_front().unwrap()).unwrap(),
limb1: downcast(serialized.pop_front().unwrap()).unwrap(),
limb2: downcast(serialized.pop_front().unwrap()).unwrap(),
limb3: downcast(serialized.pop_front().unwrap()).unwrap()
},
w5: u384 {
limb0: downcast(serialized.pop_front().unwrap()).unwrap(),
limb1: downcast(serialized.pop_front().unwrap()).unwrap(),
limb2: downcast(serialized.pop_front().unwrap()).unwrap(),
limb3: downcast(serialized.pop_front().unwrap()).unwrap()
},
w6: u384 {
limb0: downcast(serialized.pop_front().unwrap()).unwrap(),
limb1: downcast(serialized.pop_front().unwrap()).unwrap(),
limb2: downcast(serialized.pop_front().unwrap()).unwrap(),
limb3: downcast(serialized.pop_front().unwrap()).unwrap()
},
w7: u384 {
limb0: downcast(serialized.pop_front().unwrap()).unwrap(),
limb1: downcast(serialized.pop_front().unwrap()).unwrap(),
limb2: downcast(serialized.pop_front().unwrap()).unwrap(),
limb3: downcast(serialized.pop_front().unwrap()).unwrap()
},
w8: u384 {
limb0: downcast(serialized.pop_front().unwrap()).unwrap(),
limb1: downcast(serialized.pop_front().unwrap()).unwrap(),
limb2: downcast(serialized.pop_front().unwrap()).unwrap(),
limb3: downcast(serialized.pop_front().unwrap()).unwrap()
},
w9: u384 {
limb0: downcast(serialized.pop_front().unwrap()).unwrap(),
limb1: downcast(serialized.pop_front().unwrap()).unwrap(),
limb2: downcast(serialized.pop_front().unwrap()).unwrap(),
limb3: downcast(serialized.pop_front().unwrap()).unwrap()
},
w10: u384 {
limb0: downcast(serialized.pop_front().unwrap()).unwrap(),
limb1: downcast(serialized.pop_front().unwrap()).unwrap(),
limb2: downcast(serialized.pop_front().unwrap()).unwrap(),
limb3: downcast(serialized.pop_front().unwrap()).unwrap()
},
w11: u384 {
limb0: downcast(serialized.pop_front().unwrap()).unwrap(),
limb1: downcast(serialized.pop_front().unwrap()).unwrap(),
limb2: downcast(serialized.pop_front().unwrap()).unwrap(),
limb3: downcast(serialized.pop_front().unwrap()).unwrap()
},
}
);
n -= 1;
};
Option::Some(arr.span())
impl E12DSerde of Serde<E12D> {
fn serialize(self: @E12D, ref output: Array<felt252>) {
let val = *self;
output.append(val.w0.limb0.into());
output.append(val.w0.limb1.into());
output.append(val.w0.limb2.into());
output.append(val.w0.limb3.into());
output.append(val.w1.limb0.into());
output.append(val.w1.limb1.into());
output.append(val.w1.limb2.into());
output.append(val.w1.limb3.into());
output.append(val.w2.limb0.into());
}

fn deserialize(ref serialized: Span<felt252>) -> Option<E12D> {
let [
w0l0,
w0l1,
w0l2,
w0l3,
w1l0,
w1l1,
w1l2,
w1l3,
w2l0,
w2l1,
w2l2,
w2l3,
w3l0,
w3l1,
w3l2,
w3l3,
w4l0,
w4l1,
w4l2,
w4l3,
w5l0,
w5l1,
w5l2,
w5l3,
w6l0,
w6l1,
w6l2,
w6l3,
w7l0,
w7l1,
w7l2,
w7l3,
w8l0,
w8l1,
w8l2,
w8l3,
w9l0,
w9l1,
w9l2,
w9l3,
w10l0,
w10l1,
w10l2,
w10l3,
w11l0,
w11l1,
w11l2,
w11l3
] =
(*serialized
.multi_pop_front::<48>()
.unwrap())
.unbox();
Option::Some(
E12D {
w0: u384 {
limb0: downcast(w0l0).unwrap(),
limb1: downcast(w0l1).unwrap(),
limb2: downcast(w0l2).unwrap(),
limb3: downcast(w0l3).unwrap()
},
w1: u384 {
limb0: downcast(w1l0).unwrap(),
limb1: downcast(w1l1).unwrap(),
limb2: downcast(w1l2).unwrap(),
limb3: downcast(w1l3).unwrap()
},
w2: u384 {
limb0: downcast(w2l0).unwrap(),
limb1: downcast(w2l1).unwrap(),
limb2: downcast(w2l2).unwrap(),
limb3: downcast(w2l3).unwrap()
},
w3: u384 {
limb0: downcast(w3l0).unwrap(),
limb1: downcast(w3l1).unwrap(),
limb2: downcast(w3l2).unwrap(),
limb3: downcast(w3l3).unwrap()
},
w4: u384 {
limb0: downcast(w4l0).unwrap(),
limb1: downcast(w4l1).unwrap(),
limb2: downcast(w4l2).unwrap(),
limb3: downcast(w4l3).unwrap()
},
w5: u384 {
limb0: downcast(w5l0).unwrap(),
limb1: downcast(w5l1).unwrap(),
limb2: downcast(w5l2).unwrap(),
limb3: downcast(w5l3).unwrap()
},
w6: u384 {
limb0: downcast(w6l0).unwrap(),
limb1: downcast(w6l1).unwrap(),
limb2: downcast(w6l2).unwrap(),
limb3: downcast(w6l3).unwrap()
},
w7: u384 {
limb0: downcast(w7l0).unwrap(),
limb1: downcast(w7l1).unwrap(),
limb2: downcast(w7l2).unwrap(),
limb3: downcast(w7l3).unwrap()
},
w8: u384 {
limb0: downcast(w8l0).unwrap(),
limb1: downcast(w8l1).unwrap(),
limb2: downcast(w8l2).unwrap(),
limb3: downcast(w8l3).unwrap()
},
w9: u384 {
limb0: downcast(w9l0).unwrap(),
limb1: downcast(w9l1).unwrap(),
limb2: downcast(w9l2).unwrap(),
limb3: downcast(w9l3).unwrap()
},
w10: u384 {
limb0: downcast(w10l0).unwrap(),
limb1: downcast(w10l1).unwrap(),
limb2: downcast(w10l2).unwrap(),
limb3: downcast(w10l3).unwrap()
},
w11: u384 {
limb0: downcast(w11l0).unwrap(),
limb1: downcast(w11l1).unwrap(),
limb2: downcast(w11l2).unwrap(),
limb3: downcast(w11l3).unwrap()
},
}
)
}
}

Expand Down

0 comments on commit e7f232d

Please sign in to comment.