Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions costs_msm.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
test garaga::tests::autogenerated::msm_tests::test_msm_BN254_1P ... ok (gas usage est.: 2301996)
steps: 10249
memory holes: 998
builtins: ("add_mod_builtin": 892, "mul_mod_builtin": 771, "range_check96_builtin": 7569, "range_check_builtin": 1038)



test garaga::tests::autogenerated::msm_tests::test_msm_BN254_1P ... ok (gas usage est.: 2200596)
steps: 9452
memory holes: 920
builtins: ("add_mod_builtin": 892, "mul_mod_builtin": 755, "range_check96_builtin": 7393, "range_check_builtin": 1018)

test garaga::tests::autogenerated::msm_tests::test_msm_BN254_1P ... ok (gas usage est.: 2135696)
steps: 8803
memory holes: 920
builtins: ("add_mod_builtin": 892, "mul_mod_builtin": 755, "range_check96_builtin": 7393, "range_check_builtin": 1018)
7 changes: 7 additions & 0 deletions hydra/garaga/precompiled_circuits/all_circuits.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
AddECPointCircuit,
AddECPointsG2Circuit,
ClearCofactorBLS12_381Circuit,
DoubleAndAdd72Circuit,
DoubleECPointCircuit,
DoubleECPointG2AEq0Circuit,
DummyCircuit,
Expand Down Expand Up @@ -79,6 +80,7 @@ class CircuitID(Enum):
PREPARE_GLV_FAKE_GLV_PTS = int.from_bytes(b"prepare_glv_fake_glv_pts", "big")
PREPARE_FAKE_GLV_PTS = int.from_bytes(b"prepare_fake_glv_pts", "big")
QUADRUPLE_AND_ADD_9 = int.from_bytes(b"quadruple_and_add_9", "big")
DOUBLE_AND_ADD_72 = int.from_bytes(b"double_and_add_72", "big")
MP_CHECK_BIT0_LOOP = int.from_bytes(b"mp_check_bit0_loop", "big")
MP_CHECK_BIT00_LOOP = int.from_bytes(b"mp_check_bit00_loop", "big")
MP_CHECK_BIT1_LOOP = int.from_bytes(b"mp_check_bit1_loop", "big")
Expand Down Expand Up @@ -169,6 +171,11 @@ class CircuitID(Enum):
"params": None,
"filename": "ec",
},
CircuitID.DOUBLE_AND_ADD_72: {
"class": DoubleAndAdd72Circuit,
"params": None,
"filename": "ec",
},
CircuitID.QUADRUPLE_AND_ADD_9: {
"class": QuadrupleAndAdd9Circuit,
"params": None,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1064,6 +1064,47 @@ def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit:
return circuit


class DoubleAndAdd72Circuit(BaseModuloCircuit):
def __init__(self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0):
super().__init__(
name="double_and_add_72",
curve_id=curve_id,
auto_run=auto_run,
compilation_mode=compilation_mode,
)

def build_input(self) -> list[PyFelt]:
input = []
input.append(self.field.random()) # Px
input.append(self.field.random()) # Py
for _ in range(72):
input.append(self.field.random()) # Qx
input.append(self.field.random()) # Qy

return input

def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit:
circuit = BasicEC(
self.name, self.curve_id, compilation_mode=self.compilation_mode
)
circuit.generic_modulus = True
P = circuit.write_struct(
G1PointCircuit("P", [input[0], input[1]]), WriteOps.INPUT
)
Qs = []
for i in range(2, len(input) - 1, 2):
Qs.append(
circuit.write_struct(
G1PointCircuit(f"Q_{i//2}", [input[i], input[i + 1]]),
WriteOps.INPUT,
)
)

Rx, Ry = circuit.n_double_and_add(P, Qs)
circuit.extend_struct_output(G1PointCircuit("R", [Rx, Ry]))
return circuit


class ClearCofactorBLS12_381Circuit(BaseModuloCircuit):
def __init__(self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0):
super().__init__(
Expand Down
11 changes: 11 additions & 0 deletions hydra/garaga/precompiled_circuits/ec.py
Original file line number Diff line number Diff line change
Expand Up @@ -722,6 +722,17 @@ def double_n_times(
Q = self.double_point_a_eq_0(Q)
return Q

def n_double_and_add(
self,
P: tuple[ModuloCircuitElement, ModuloCircuitElement],
adds: list[tuple[ModuloCircuitElement, ModuloCircuitElement]],
) -> tuple[ModuloCircuitElement, ModuloCircuitElement]:
"""Double a point and add it to the point."""
Q = P
for add in adds:
Q = self.double_and_add(Q, add)
return Q

def n_quadruple_and_add(
self,
P: tuple[ModuloCircuitElement, ModuloCircuitElement],
Expand Down
Loading