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 code area
11    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}