diff --git a/test/mina-placeholder-verifier-proof-test.js b/test/mina-placeholder-verifier-proof-test.js index e8bbd00..0980cfb 100644 --- a/test/mina-placeholder-verifier-proof-test.js +++ b/test/mina-placeholder-verifier-proof-test.js @@ -55,6 +55,161 @@ describe('Mina state proof validation tests', function () { return [[],[]]; } + function prepareBaseProofPublicInputs(kimchi, kimchi_const){ + let kimchi_proof = kimchi.data.bestChain[0].protocolStateProof.json.proof; + + let public_input = []; + let evalRounds = 10; + let maxPolySize = 1 << evalRounds; + + + for(i in kimchi_proof.messages.w_comm){ + for(j in kimchi_proof.messages.w_comm[i]){ + public_input.push(BigInt(kimchi_proof.messages.w_comm[i][j][0])); + public_input.push(BigInt(kimchi_proof.messages.w_comm[i][j][1])); + } + } + for(i in kimchi_proof.messages.z_comm){ + public_input.push(BigInt(kimchi_proof.messages.z_comm[i][0])); + public_input.push(BigInt(kimchi_proof.messages.z_comm[i][1])); + break; // TODO: ask, is it right? + } + for(i in kimchi_proof.messages.t_comm){ + public_input.push(BigInt(kimchi_proof.messages.t_comm[i][0])); + public_input.push(BigInt(kimchi_proof.messages.t_comm[i][1])); + break; //TODO: ask, is it right? + } + // TODO: Test it. + if(kimchi_proof.messages.lookup){ + for(i in kimchi_proof.messages.lookup.sorted){ + for(j in kimchi_proof.messages.lookup.sorted[i]){ + public_input.push(BigInt(kimchi_proof.messages.lookup.sorted[i][j][0])); + public_input.push(BigInt(kimchi_proof.messages.lookup.sorted[i][j][1])); + } + } + for(i in kimchi_proof.messages.lookup.aggreg){ + public_input.push(BigInt(kimchi_proof.messages.lookup.aggreg[i][0])); + public_input.push(BigInt(kimchi_proof.messages.lookup.aggreg[i][1])); + } + for(i in kimchi_proof.messages.lookup.runtime){ + public_input.push(BigInt(kimchi_proof.messages.lookup.runtime[i][0])); + public_input.push(BigInt(kimchi_proof.messages.lookup.runtime[i][1])); + } + } + // TODO: Check it. In mina-state-proof it was loop for( i = 0; i < circuit_proof.comm.table.parts.size(); i++) + for(i in kimchi_proof.messages.z_comm){ + public_input.push(BigInt(kimchi_proof.messages.z_comm[i][0])); + public_input.push(BigInt(kimchi_proof.messages.z_comm[i][1])); + } + let lrlen = kimchi_proof.openings.proof.lr.length > evalRounds ? evalRounds : kimchi_proof.openings.proof.lr.length; + for( i = 0; i < lrlen; i++){ + public_input.push(BigInt(kimchi_proof.openings.proof.lr[i][0][0])); + public_input.push(BigInt(kimchi_proof.openings.proof.lr[i][0][1])); + + public_input.push(BigInt(kimchi_proof.openings.proof.lr[i][1][0])); + public_input.push(BigInt(kimchi_proof.openings.proof.lr[i][1][1])); + } + public_input.push(BigInt(kimchi_proof.openings.proof.delta[0])); + public_input.push(BigInt(kimchi_proof.openings.proof.delta[1])); + + public_input.push(BigInt(kimchi_proof.openings.proof.challenge_polynomial_commitment[0])); + public_input.push(BigInt(kimchi_proof.openings.proof.challenge_polynomial_commitment[1])); + + for( i = 0; i < 30; i++){ + public_input.push(BigInt(3)); + } + // TODO process batched_proofs. + + for(i in kimchi.data.blockchainVerificationKey.commitments.sigma_comm){ + public_input.push(BigInt(kimchi.data.blockchainVerificationKey.commitments.sigma_comm[i][0])); + public_input.push(BigInt(kimchi.data.blockchainVerificationKey.commitments.sigma_comm[i][1])); + } + for(i in kimchi.data.blockchainVerificationKey.commitments.coefficients_comm){ + public_input.push(BigInt(kimchi.data.blockchainVerificationKey.commitments.coefficients_comm[i][0])); + public_input.push(BigInt(kimchi.data.blockchainVerificationKey.commitments.coefficients_comm[i][1])); + } + public_input.push(BigInt(kimchi.data.blockchainVerificationKey.commitments.generic_comm[0])); + public_input.push(BigInt(kimchi.data.blockchainVerificationKey.commitments.generic_comm[1])); + + public_input.push(BigInt(kimchi.data.blockchainVerificationKey.commitments.psm_comm[0])); + public_input.push(BigInt(kimchi.data.blockchainVerificationKey.commitments.psm_comm[1])); + + public_input.push(BigInt(kimchi.data.blockchainVerificationKey.commitments.complete_add_comm[0])); + public_input.push(BigInt(kimchi.data.blockchainVerificationKey.commitments.complete_add_comm[1])); + + public_input.push(BigInt(kimchi.data.blockchainVerificationKey.commitments.mul_comm[0])); + public_input.push(BigInt(kimchi.data.blockchainVerificationKey.commitments.mul_comm[1])); + + public_input.push(BigInt(kimchi.data.blockchainVerificationKey.commitments.emul_comm[0])); + public_input.push(BigInt(kimchi.data.blockchainVerificationKey.commitments.emul_comm[1])); + + public_input.push(BigInt(kimchi.data.blockchainVerificationKey.commitments.endomul_scalar_comm[0])); + public_input.push(BigInt(kimchi.data.blockchainVerificationKey.commitments.endomul_scalar_comm[1])); + + // chacha_comm nul in example. + // range_check_comm not found too. + // + let point = [ + BigInt(kimchi.data.blockchainVerificationKey.commitments.sigma_comm[0][0]), + BigInt(kimchi.data.blockchainVerificationKey.commitments.sigma_comm[0][1]) + ]; + +// Push point to public input. +// Selector size 0 +// Lookup selector size 0 +// Lookup table size 0 +// Runtime table selector 1 + public_input.push(point[0]); + public_input.push(point[1]); +// One more time + public_input.push(point[0]); + public_input.push(point[1]); + + for(i = 0; i < maxPolySize; i++){ + public_input.push(point[0]); + public_input.push(point[1]); + } + + return public_input; + } + + function prepareScalarProofPublicInputs(kimchi, kimchi_const){ + let kimchi_proof = kimchi.data.bestChain[0].protocolStateProof.json.proof; + let public_input = []; + public_input.push(BigInt(0)); + + for( ev in [0,1]){ + for(i in kimchi_proof.openings.evals.w){ + public_input.push(BigInt(kimchi_proof.openings.evals.w[i][ev][0])); + } + + public_input.push(BigInt(kimchi_proof.openings.evals.z[ev][0])); + for(i in kimchi_proof.openings.evals.s){ + public_input.push(BigInt(kimchi_proof.openings.evals.s[i][ev][0])); + } + // TODO: add lookup processing + public_input.push(BigInt(kimchi_proof.openings.evals.generic_selector[ev][0])); + public_input.push(BigInt(kimchi_proof.openings.evals.poseidon_selector[ev][0])); + } + + public_input.push(BigInt(2)); + public_input.push(BigInt(kimchi_proof.openings.ft_eval1)); + + public_input.push(BigInt(2)); + public_input.push(BigInt(2)); + + public_input.push(BigInt(0)); + public_input.push(BigInt(0)); + public_input.push(BigInt(0)); + public_input.push(BigInt(0)); + public_input.push(BigInt(0)); + public_input.push(BigInt(0)); + public_input.push(BigInt(0)); + + public_input.push(BigInt(kimchi_const.verify_index.w)); + return public_input; + } + function getVerifierParams() { let params = {} @@ -70,16 +225,19 @@ describe('Mina state proof validation tests', function () { let base_params = loadParamsFromFile(path.resolve(__dirname, "./data/verifier_params_state_base.json")); params['init_params'][1] = base_params.init_params; params['columns_rotations'][0] = base_params.columns_rotations; + params['public_inputs'][0] = prepareBaseProofPublicInputs( + losslessJSON.parse(fs.readFileSync(path.resolve(__dirname, "./data/kimchi.json"),"utf8")), + losslessJSON.parse(fs.readFileSync(path.resolve(__dirname, "./data/kimchi_const.json"),"utf8")) + ); // For proof 2 let scalar_params = loadParamsFromFile(path.resolve(__dirname, "./data/verifier_params_state_scalar.json")); params['init_params'][2] = scalar_params.init_params; params['columns_rotations'][1] = scalar_params.columns_rotations; - - params['public_inputs'] = loadPublicInputsFromFiles( - path.resolve(__dirname, "./data/kimchi.json"), - path.resolve(__dirname, "./data/kimchi_const.json") - ) + params['public_inputs'][1] = prepareScalarProofPublicInputs( + losslessJSON.parse(fs.readFileSync(path.resolve(__dirname, "./data/kimchi.json"),"utf8")), + losslessJSON.parse(fs.readFileSync(path.resolve(__dirname, "./data/kimchi_const.json"),"utf8")) + ); return params; } @@ -97,9 +255,6 @@ describe('Mina state proof validation tests', function () { it("Should validate correct proof ", async function () { let params = getVerifierParams(); await deployments.fixture(['minaPlaceholderVerifierFixture']); - let mina_base_gate_argument_contract = await ethers.getContract('mina_base_split_gen'); - let mina_scalar_gate_argument_contract = await ethers.getContract('mina_scalar_split_gen'); - let placeholder_verifier_contract = await ethers.getContract('PlaceholderVerifier'); let minaPlaceholderVerifier = await ethers.getContract('MinaState'); let minaPlaceholderVerifierIF = await ethers.getContractAt("IMinaPlaceholderVerifier", minaPlaceholderVerifier.address); @@ -112,9 +267,6 @@ describe('Mina state proof validation tests', function () { it("Should update and store proof ", async function () { let params = getVerifierParams(); await deployments.fixture(['minaPlaceholderVerifierFixture']); - let mina_base_gate_argument_contract = await ethers.getContract('mina_base_split_gen'); - let mina_scalar_gate_argument_contract = await ethers.getContract('mina_scalar_split_gen'); - let placeholder_verifier_contract = await ethers.getContract('PlaceholderVerifier'); let minaPlaceholderVerifier = await ethers.getContract('MinaState'); let minaPlaceholderVerifierIF = await ethers.getContractAt("IMinaPlaceholderVerifier", minaPlaceholderVerifier.address); @@ -125,7 +277,6 @@ describe('Mina state proof validation tests', function () { }); it("Should validate previously updated & stored correct proof ", async function () { - let params = getVerifierParams(); let minaPlaceholderVerifier = await ethers.getContract('MinaState'); let minaPlaceholderVerifierIF = await ethers.getContractAt("IMinaPlaceholderVerifier", minaPlaceholderVerifier.address); expect(await minaPlaceholderVerifierIF.isValidatedLedgerHash("jwYPLbRQa4X86tSJs1aTzusf3TNdVTj58oyWJQB132sEGUtKHcB", {gasLimit: 30_500_000})).to.equal(true); @@ -136,9 +287,6 @@ describe('Mina state proof validation tests', function () { it("Should validate correct proof ", async function () { let params = getVerifierParams(); await deployments.fixture(['minaPlaceholderVerifierFixture']); - let mina_base_gate_argument_contract = await ethers.getContract('mina_base_split_gen'); - let mina_scalar_gate_argument_contract = await ethers.getContract('mina_scalar_split_gen'); - let placeholder_verifier_contract = await ethers.getContract('PlaceholderVerifier'); let minaPlaceholderVerifier = await ethers.getContract('MinaState'); let minaPlaceholderVerifierIF = await ethers.getContractAt("IMinaPlaceholderVerifier", minaPlaceholderVerifier.address); @@ -177,9 +325,6 @@ describe('Mina state proof validation tests', function () { it("Should emit event on incorrect proof validation", async function () { let params = getVerifierParams(); await deployments.fixture(['minaPlaceholderVerifierFixture']) - let mina_base_gate_argument_contract = await ethers.getContract('mina_base_split_gen'); - let mina_scalar_gate_argument_contract = await ethers.getContract('mina_scalar_split_gen'); - let placeholder_verifier_contract = await ethers.getContract('PlaceholderVerifier'); params['proof'] = '0x4554480000000000000000000000000000000000000000000000000000000000' let minaPlaceholderVerifier = await ethers.getContract('MinaState'); @@ -194,9 +339,6 @@ describe('Mina state proof validation tests', function () { it("Should fail to update and store incorrect proof ", async function () { let params = getVerifierParams(); await deployments.fixture(['minaPlaceholderVerifierFixture']); - let mina_base_gate_argument_contract = await ethers.getContract('mina_base_split_gen'); - let mina_scalar_gate_argument_contract = await ethers.getContract('mina_scalar_split_gen'); - let placeholder_verifier_contract = await ethers.getContract('PlaceholderVerifier'); params['proof'] = '0x4554480000000000000000000000000000000000000000000000000000000000' let minaPlaceholderVerifier = await ethers.getContract('MinaState'); @@ -211,9 +353,6 @@ describe('Mina state proof validation tests', function () { it("Should fail for incorrect hash", async function () { let params = getVerifierParams(); await deployments.fixture(['minaPlaceholderVerifierFixture']) - let mina_base_gate_argument_contract = await ethers.getContract('mina_base_split_gen'); - let mina_scalar_gate_argument_contract = await ethers.getContract('mina_scalar_split_gen'); - let placeholder_verifier_contract = await ethers.getContract('PlaceholderVerifier'); let minaPlaceholderVerifier = await ethers.getContract('MinaState'); let minaPlaceholderVerifierIF = await ethers.getContractAt("IMinaPlaceholderVerifier", minaPlaceholderVerifier.address); @@ -260,9 +399,6 @@ describe('Mina state proof validation tests', function () { it("Should fail with correct hash and incorrect proof ", async function () { let params = getVerifierParams(); await deployments.fixture(['minaPlaceholderVerifierFixture']); - let mina_base_gate_argument_contract = await ethers.getContract('mina_base_split_gen'); - let mina_scalar_gate_argument_contract = await ethers.getContract('mina_scalar_split_gen'); - let placeholder_verifier_contract = await ethers.getContract('PlaceholderVerifier'); let minaPlaceholderVerifier = await ethers.getContract('MinaState'); let minaPlaceholderVerifierIF = await ethers.getContractAt("IMinaPlaceholderVerifier", minaPlaceholderVerifier.address);