o1js
Version:
TypeScript framework for zk-SNARKs and zkApps
67 lines (55 loc) • 2.32 kB
text/typescript
import { BatchReducer, actionStackProgram, proveActionStack } from './batch-reducer.js';
import { Field } from '../../../../index.js';
import { expect } from 'expect';
import { describe, it } from 'node:test';
import { Actions as ActionsBigint } from '../../../../bindings/mina-transaction/v1/transaction-leaves-bigint.js';
// analyze program with different number of actions
for (let actionsPerProof of [10, 30, 100, 300, 1000]) {
let program = actionStackProgram(actionsPerProof);
console.log({
actionsPerProof,
summary: (await program.analyzeMethods()).proveChunk.summary(),
});
}
function randomActionHashes(n: number) {
let actions: bigint[] = [];
for (let i = 0; i < n; i++) {
actions[i] = Field.random().toBigInt();
}
return actions;
}
function randomActionWitnesses(n: number) {
let hashes = randomActionHashes(n);
let witnesses: { hash: bigint; stateBefore: bigint }[] = [];
let state = BatchReducer.initialActionState.toBigInt();
for (let hash of hashes) {
witnesses.push({ hash, stateBefore: state });
state = ActionsBigint.updateSequenceState(state, hash);
}
return { witnesses, endActionState: Field(state) };
}
let stackProgram = actionStackProgram(100);
console.time('compile stack prover');
await stackProgram.compile();
console.timeEnd('compile stack prover');
await describe('action stack prover', async () => {
let startActionState = BatchReducer.initialActionState;
await it('does 1 action', async () => {
let { witnesses, endActionState } = randomActionWitnesses(1);
console.time('prove');
let { isEmpty, proof } = await proveActionStack(endActionState, witnesses, stackProgram);
console.timeEnd('prove');
expect(isEmpty.toBoolean()).toBe(false);
expect(proof.publicInput).toEqual(endActionState);
expect(proof.publicOutput.actions).toEqual(startActionState);
});
await it('does 250 actions', async () => {
let { witnesses, endActionState } = randomActionWitnesses(250);
console.time('prove');
let { isEmpty, proof } = await proveActionStack(endActionState, witnesses, stackProgram);
console.timeEnd('prove');
expect(isEmpty.toBoolean()).toBe(false);
expect(proof.publicInput).toEqual(endActionState);
expect(proof.publicOutput.actions).toEqual(startActionState);
});
});