mirror of
https://github.com/arnaucube/sonobe.git
synced 2026-01-12 00:41:28 +01:00
Add solidity verifier of the nova+cyclefold (#87)
* Add solidity verifier of the nova+cyclefold, and add method to prepare the calldata from Decider's proof. Missing conversion of the point coordinates into limbs (ark compatible) * chore: adding comments linking to the contract's signature * chore: update .gitignore * chore: add num-bigint as dev dependency * fix: work with abs path for storing generated sol code * chore: update comment * feat: solidity verifier working on single and multi-input circuits * feat: multi-input folding verification working + fixing encoding of additive identity in calldata * chore: make bigint a dependency * refactor: import utils functions from utils.rs and make them available from anywhere * chore: make utils and evm available publicly * fix: pub mod instead * chore: make relevant method public and add `get_decider_template_for_cyclefold_decider` to exported objects * solidity-verifiers: move tests to their corresponding files * small update: Cyclefold -> CycleFold at the missing places * abstract nova-cyclefold solidity verifiers tests to avoid code duplication, and abstract also the computed setup params (FS & Decider) to compute them only once for all related tests to save test time * small polish after rebase to last main branch changes * rm unneeded Option for KZGData::g1_crs_batch_points * add checks modifying z_0 & z_i to nova_cyclefold_solidity_verifier test * add light-test feature to decider_eth_circuit to use it in solidity-verifier tests without the big circuit * solidity-verifiers: groth16 template: port the fix from https://github.com/iden3/snarkjs/pull/480 & https://github.com/iden3/snarkjs/issues/479 * add print warning msg for light-test in DeciderEthCircuit * solidity-verifiers: update limbs logic to nonnative last version, parametrize limbs params solidity-verifiers: * update solidity limbs logic to last nonnative impl version, and to last u_i.x impl * parametrize limbs params * add light-test feature: replace the '#[cfg(not(test))]' by the 'light-test' feature that by default is not enabled, so when running the github actions we enable the feature 'light-tests', and then we can have a full-test that runs the test without the 'light-tests' flag, but we don't run this big test every time. The choice of a feature is to allow us to control this from other-crates tests (for example for the solidity-verifier separated crate tests, to avoid running the full heavy circuit in the solidity tests) * move solidity constants into template constants for auto compute of params * polishing * revm use only needed feature This is to avoid c depencency for c-kzg which is behind the c-kzg flag and not needed. * nova_cyclefold_decider.sol header * rearrange test helpers position, add error for min number of steps * in solidity-verifiers: 'data'->'vk/verifier key' * add From for NovaCycleFoldVerifierKey from original vks to simplify dev flow, also conditionally template the batchCheck related structs and methods from the KZG10 solidity template --------- Co-authored-by: dmpierre <pdaixmoreux@gmail.com>
This commit is contained in:
@@ -1,11 +1,37 @@
|
||||
use crate::{GPL3_SDPX_IDENTIFIER, PRAGMA_GROTH16_VERIFIER};
|
||||
use askama::Template;
|
||||
|
||||
use crypto::{digest::Digest, sha3::Sha3};
|
||||
use num_bigint::BigUint;
|
||||
pub mod encoding;
|
||||
|
||||
/// Formats call data from a vec of bytes to a hashmap
|
||||
/// Useful for debugging directly on the EVM
|
||||
/// !! Should follow the contract's function signature, we assuming the order of arguments is correct
|
||||
pub fn get_formatted_calldata(calldata: Vec<u8>) -> Vec<String> {
|
||||
let mut formatted_calldata = vec![];
|
||||
for i in (4..calldata.len()).step_by(32) {
|
||||
let val = BigUint::from_bytes_be(&calldata[i..i + 32]);
|
||||
formatted_calldata.push(format!("{}", val));
|
||||
}
|
||||
formatted_calldata
|
||||
}
|
||||
|
||||
/// Computes the function selector for the nova cyclefold verifier
|
||||
/// It is computed on the fly since it depends on the length of the first parameter array
|
||||
pub fn get_function_selector_for_nova_cyclefold_verifier(
|
||||
first_param_array_length: usize,
|
||||
) -> [u8; 4] {
|
||||
let mut hasher = Sha3::keccak256();
|
||||
let fn_sig = format!("verifyNovaProof(uint256[{}],uint256[4],uint256[3],uint256[4],uint256[4],uint256[2],uint256[2][2],uint256[2],uint256[4],uint256[2][2])", first_param_array_length);
|
||||
hasher.input_str(&fn_sig);
|
||||
let hash = &mut [0u8; 32];
|
||||
hasher.result(hash);
|
||||
[hash[0], hash[1], hash[2], hash[3]]
|
||||
}
|
||||
|
||||
#[derive(Template)]
|
||||
#[template(path = "header_template.askama.sol", ext = "sol")]
|
||||
pub(crate) struct HeaderInclusion<T: Template> {
|
||||
pub struct HeaderInclusion<T: Template> {
|
||||
/// SPDX-License-Identifier
|
||||
pub sdpx: String,
|
||||
/// The `pragma` statement.
|
||||
|
||||
Reference in New Issue
Block a user