main.nr 1.67 KB
use dep::std;
use dep::helpers;
use dep::helpers::structs;
use dep::helpers::hash;

#[recursive]
fn main(
    accumulator: pub Field,
    tx_verifier: structs::VerifierTx,
    recursion_verifier: structs::Verifier,

    previous_accumulator: Field,
    tx: structs::PublicInputs
) {
    let tx_as_keccak = tx.as_keccak();

    let mut generated_accumulator_preimage: [u8; 128] = [0; 128];
    for i in 0..32 {
        generated_accumulator_preimage[i] = hash::field_to_u8(previous_accumulator)[i];
        generated_accumulator_preimage[i + 32] = hash::field_to_u8(tx_as_keccak)[i];
        generated_accumulator_preimage[i + 64] = hash::field_to_u8(tx_verifier.key_hash)[i];
        generated_accumulator_preimage[i + 96] = hash::field_to_u8(recursion_verifier.key_hash)[i];
    }

    let generated_accumulator = hash::hash_to_field(std::hash::keccak256(generated_accumulator_preimage, generated_accumulator_preimage.len() as u32));
    assert(accumulator == generated_accumulator);

    let mut recursion_pi: Field = previous_accumulator;
    let mut recursive_proof: [Field] = recursion_verifier.proof.as_slice();
    
    if (previous_accumulator == helpers::ZERO_VALUE) { 
        assert(recursion_verifier.key_hash == 0x083764da4a71646a7c2d27cf8f17adc4f9e4f3d2c5a574b643f79864c280b4ce);
        recursion_pi = tx.as_hash();
    }
    std::verify_proof(
        recursion_verifier.verification_key.as_slice(), 
        recursive_proof, 
        [recursion_pi].as_slice(), 
        recursion_verifier.key_hash 
    );

    std::verify_proof(
        tx_verifier.verification_key.as_slice(), 
        tx_verifier.proof.as_slice(), 
        [tx.as_hash()].as_slice(), 
        tx_verifier.key_hash 
    );

}