Skip to content

Commit

Permalink
Parse public input files for ledger proof #78
Browse files Browse the repository at this point in the history
  • Loading branch information
ETatuzova committed Jun 12, 2023
1 parent 1fe65a7 commit c239cba
Showing 1 changed file with 163 additions and 27 deletions.
190 changes: 163 additions & 27 deletions test/mina-placeholder-verifier-proof-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {}

Expand All @@ -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;
}
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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');
Expand All @@ -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');
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit c239cba

Please sign in to comment.