snark_verifier/loader/evm/
code.rs
1pub enum Precompiled {
2 BigModExp = 0x05,
3 Bn254Add = 0x6,
4 Bn254ScalarMul = 0x7,
5 Bn254Pairing = 0x8,
6}
7
8#[derive(Clone, Debug)]
9pub struct SolidityAssemblyCode {
10 runtime: String,
12}
13
14impl SolidityAssemblyCode {
15 pub fn new() -> Self {
16 Self { runtime: String::new() }
17 }
18
19 pub fn code(&self, base_modulus: String, scalar_modulus: String) -> String {
20 format!(
21 "
22// SPDX-License-Identifier: MIT
23
24pragma solidity 0.8.19;
25
26contract Halo2Verifier {{
27 fallback(bytes calldata) external returns (bytes memory) {{
28 assembly (\"memory-safe\") {{
29 // Enforce that Solidity memory layout is respected
30 let data := mload(0x40)
31 if iszero(eq(data, 0x80)) {{
32 revert(0, 0)
33 }}
34
35 let success := true
36 let f_p := {base_modulus}
37 let f_q := {scalar_modulus}
38 function validate_ec_point(x, y) -> valid {{
39 {{
40 let x_lt_p := lt(x, {base_modulus})
41 let y_lt_p := lt(y, {base_modulus})
42 valid := and(x_lt_p, y_lt_p)
43 }}
44 {{
45 let y_square := mulmod(y, y, {base_modulus})
46 let x_square := mulmod(x, x, {base_modulus})
47 let x_cube := mulmod(x_square, x, {base_modulus})
48 let x_cube_plus_3 := addmod(x_cube, 3, {base_modulus})
49 let is_affine := eq(x_cube_plus_3, y_square)
50 valid := and(valid, is_affine)
51 }}
52 }}
53 {}
54 }}
55 }}
56}}
57 ",
58 self.runtime
59 )
60 }
61
62 pub fn runtime_append(&mut self, mut code: String) {
63 code.push('\n');
64 self.runtime.push_str(&code);
65 }
66}